ggplot在PDF中嵌入字体

21

我一直在使用以下指南将用ggplot创建的图导出为pdf:绘图字体指南

该指南在帖子底部提出了一些字体无法正确显示的问题,这在下面的示例中发生了。Bauhaus 93字体的文本显示正确,而Calibri字体的文本则未正确显示。

有人找到解决此问题的方法吗?

library(ggplot2)
library(plyr)
library(grid)
library(gridExtra)
library(extrafont)

data1<-as.data.frame(1:5)
data1[,2]<-as.data.frame(c(1,3,5,7,9))
data1[,3]<-as.data.frame(c(2,4,6,8,10))
colnames(data1)<-c("x","y1","y2")

ggplot(data1, aes(x=x)) + 
  geom_line(aes(y = y1, colour = "Taux selon DEF"), size=0.61, colour="black") +  
  geom_line(aes(y = y2, colour = "Taux selon EC"), size=0.61, colour="black", linetype="dashed") + 
  xlab("X axis lab") + ylab("Y axis lab)") +
  annotate("text", x=1, y=4, label="Some text here", size=2, family="Bauhaus 93") +
  annotate("text", x=4, y=1, label="More text here", size=2, family="Calibri") +
  theme_bw() + theme(legend.title = element_blank(),
                     legend.key = element_rect(fill=NA),
                     panel.border = element_blank(), 
                     axis.line = element_line(colour="black", size=0.25),
                     axis.ticks = element_line(size=0.25),
                     panel.grid.major = element_line(colour = "grey80", size=0.25),
                     panel.grid.minor = element_line(colour = "grey80", size=0.25),
                     axis.text.x = element_text(size=5.5 , lineheight=0.9, hjust=0.5, family="Bauhaus 93"),
                     axis.text.y = element_text(size=5.5 , lineheight=0.9, vjust=0.5, family="Calibri"),
                     axis.title.y = element_text(size=6.1, angle=0, vjust=0.975, face="bold", family="Calibri"),
                     axis.title.x = element_text(size=6.1, angle=0, vjust=-0.20, face="bold", family="Calibri")) +
  scale_x_continuous(expand = c(0, 0), limits=c(0,5)) + 
  scale_y_continuous(expand = c(0, 0), limits=c(0,10)) +
  ggtitle("Title") +
  ggsave("Test.pdf", width=7, height=5)
Sys.setenv(R_GSCMD = "C:/Program Files (x86)/PDF24/gs/bin/gswin32.exe")
embed_fonts("Test.pdf")

最初我也遇到了同样的错误,但现在我无法再现它了!fonttable() 的输出是什么样子的? - Nicholas
以下是Calibri字体系列的输出结果:65 Calibri Calibri FALSE FALSE FALSE NA 66 Calibri Calibri-Bold TRUE FALSE FALSE NA 67 Calibri Calibri-BoldItalic TRUE TRUE FALSE NA 68 Calibri Calibri-Italic FALSE TRUE FALSE NA 69 Calibri Light Calibri-Light FALSE FALSE FALSE NA 70 Calibri Light Calibri-LightItalic FALSE TRUE FALSE NA - user2568648
1
好的,我已经能够在Windows上重现问题:它会产生大量“字体宽度未知”的警告,并且所有Calibri字符都堆叠在一起。这里有一些相关的extrafont问题:https://github.com/wch/extrafont/issues 除了使用不同的字体,我不知道该建议什么! - Nicholas
好的,谢谢你的努力。我会继续使用另一种字体。 - user2568648
1个回答

38

尝试在 ggsave() 中添加 device=cairo_pdf。这样,这个问题似乎对我来说已经得到解决。这种方式,就不再需要使用 embed_fonts() 了。

请参见 mgaudet 在此处的评论:https://github.com/wch/extrafont/issues/8


2
我还发现使用 device=cairo_pdf 可以嵌入字体,但这会导致更糟糕的字距调整 - 有人知道更好的解决方案吗? - rvrvrv
@user1092247 或许你请求的字体不支持字距调整。请记住,字距调整是由字体设计者完成的,但一些系统会忽略此项设置。 - Hugh
1
很好的答案。我发现我必须增加ggsave内的widthheight参数,才能得到与在我的系统上没有使用device=cairo_pdf之前清洁更新到MacOS Sierra时相似的结果。 - PatrickT
2
R的新版本不再支持cairo,这会导致出现“无法加载cairo DLL”的错误。有没有新的想法来解决这个问题? - cw'
尝试安装Cairo软件包,然后在ggsave()调用中使用 device = CarioPDF。在Windows上很简单。在Ubuntu上,在Cairo编译之前需要安装libharfbuzz-devlibxt-dev - Nicholas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接