2017-09-01 180 views
1

我一直在關注我在網上找到的將ggplot圖保存爲PDF的建議,但是我無法完成它的工作。我使用extrafont包在Calibri中生成包含文本的圖表,但我的圖表打印時沒有文本。我不知道我錯過了什麼。在我的過程中我找不到任何錯誤。希望別人能夠提供幫助。將ggplot圖保存爲r中嵌入字體的PDF

下面的代碼和過程我用:

library(extrafont) 
font_import(pattern="[C/c]alibri") 
loadfonts(device="win") 

我在這個時候安裝GhostScript的。然後運行以下設置GhostScript位置。

Sys.setenv(R_GSCMD = "C:\\Program Files\\gs\\gs9.21\\bin\\gswin64c.exe") 

然後我用ggplot製作了一個圖表,叫做「圖表」。該圖表在RStudio中看起來很完美,但不是PDF格式。

ggsave("chart.pdf", plot = chart, width = 6, height = 4) 

在這裏,我得到的警告顯示這樣的東西:

在grid.Call(C_textBounds,as.graphicsAnnot(X $標籤),...:字體 '宋體' 中找不到PostScript字體數據庫

顯然,這些警告是應該發生的?如果我跑......

embed_fonts("chart.pdf", outfile="chart_embed.pdf") 

不幸的是,在所有這些之後,最終的「嵌入」圖表與最初生成的圖表沒有什麼不同,它們都沒有任何文本。

萬一有幫助,這裏是產生圖表的代碼:

a <- ggplot(data=stats, aes(x=Date)) 
Chart <- a + geom_point(aes(y=NevadaTotalNonfarmAllEmployees)) + 
     xlab("Date") + 
     ylab("Nonfarm Jobs") + 
     ggtitle("Nevada Total Jobs") + 
     theme(axis.title.x = element_text(size=15, family = "Calibri"), 
      axis.title.y = element_text(size=15, family = "Calibri"), 
      axis.text.x = element_text(size=10, family = "Calibri"), 
      axis.text.y = element_text(size=10, family = "Calibri"), 
      plot.title = element_text(hjust=0.5, size=20, family = "Calibri")) 

我一直在拉我的頭髮試圖弄清楚這一點。或者,也許這不是代碼,而是其他的東西?無論哪種方式,謝謝你的幫助。

+0

我注意到,改變ggsave高度和寬度()的幫助。現在圖表上有下一個字母,但它們都是在一個點上輸入的。所有的字母都是自己輸入的。例如,標題的所有字母都集中在一個點上,因此該單詞不可讀。這似乎可能是一個大小問題。有沒有人有任何關於尺寸的提示? – trijamms

+2

axis.textle = element_text(size = 15), plot你可以在主題上保存一些輸入:'theme(text = element_text(family =「Calibri」), axis.text = element_text(size = 10), axis.title = element_text .title = element_text(hjust = 0.5,size = 20))'。 – eipi10

+0

這很有用。謝謝eipi10! – trijamms

回答

0

我想你錯過了初始化步驟font_import()。預先警告,執行此命令可能需要更長的時間。

首先,您可以使用命令windowsFonts()查看可用的字體。我的圖形設備中的當前字體是;

$serif 
[1] "TT Times New Roman" 

$sans 
[1] "TT Arial" 

$mono 
[1] "TT Courier New" 

此後,你可以導入extrafont庫和loadfonts(device = "win")。我也建議在R控制檯而不是RStudio中執行這些命令。我建議這樣做,因爲當您在RStudio中使用font_import()導入字體時,它可能不會顯示y/n提示。

下面我提供了一個最小可重現的例子;

library(ggplot2) 
    library(extrafont) 
    font_import() 
    # tell where ghostscript is located. This is required for saving the font in pdf 
    Sys.setenv(R_GSCMD = "C:\\Program Files\\gs\\gs9.21\\bin\\gswin64c.exe") # I have installed 64-bit version of GhostScript. This is why I've used gswin64c.exe. If you have installed 32-bit version of GhostScript, use gswin32c.exe. Failure to specify the correct installed GhostScript will yield error message, "GhostScript not found" 
    # create a plot object 
p <- ggplot(mtcars, aes(x=wt, y=mpg)) + 
    geom_point()+ 
    ggtitle("Fuel Efficiency of 32 Cars")+ 
    xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") + 
    theme_bw()+ 
    theme(text=element_text(family="ArialMT", size=14)) 
# show the plot 
print(p) 

plot

# save the plot as pdf 
ggsave("figures//ggplot_arialmt.pdf", p, width=20, height=20, 
    device = "pdf", units = "cm") 

注意

它只有ArialMT字體似乎與ggsave()工作。看到這個SO post。使用任何其他字體保存爲PDF格式,將字符渲染爲另一個字符。這也是一個open issueggsave並沒有得到回答,因爲2013年

0

我發現它更安全直接註冊使用pdfFonts(和/或postscriptFonts)字體。

該文檔包含一個示例,但也看看我的fonts module。有了這個,註冊一個新的字體是寫作容易

fonts$register_font('Calibri') 

內部,這造成使用Type1Font爲字體規範,確保名設置是否正確,並調用pdfFonts

它還可以確保存在一整套字體指標(使用extrafont::ttf_import完成)。

這種方法比使用font_import生成所有字體的字體指標要快得多,它可以提供更多控制。

0

這裏有幾個問題需要注意:(1)將字體加載到R中;(2)使用可以與自定義嵌入字體正常工作的PDF書寫庫。

首先,如其他人所說,在Windows上你一般需要運行extrafont::font_import()註冊您的許多系統字體有R的,但它可能需要一段時間,可能會錯過TTF和其他類型的字體。解決此問題的方法是將字體加載到上飛R,而無需加載完整的數據庫,利用windowsFonts(name_of_font_inside_r = windowsFont("Name of actual font")),就像這樣:

windowsFonts(Calibri = windowsFont("Calibri")) 

這使得剛剛在R.訪問的一種字體,您可以用windowsFonts()檢查。每次腳本運行時都必須運行此行 - 字體加載不會在會話中持續存在。一旦字體已被加載,就可以正常使用它:

library(tidyverse) 
df <- data_frame(x = 1:10, y = 2:11) 

p <- ggplot(df, aes(x = x, y = y)) + 
    geom_point() + 
    labs(title = "Yay Calibri") + 
    theme_light(base_family = "Calibri") 
p 

Calibrified

,R內置的PDF寫入設備在Windows和MacOS不處理字體嵌入很好。然而,R現在包括開羅圖形庫,它可以嵌入字體很好。您可以在ggsave()指定開羅設備使用它,這是比處理GhostScript的簡單:

ggsave(p, filename = "whatever.pdf", device = cairo_pdf, 
     width = 4, height = 3, units = "in")