我一直在关注 Winston Chang 关于如何更改 r 图(base 和 ggplot2)中的字体的优秀教程,只要我不在图表中包含任何半透明,它就可以正常工作。下面的两个示例是相同的,除了第二个示例包含参数"col=alpha("black", 0.5)"。但是,第一个看起来不错并且完全可缩放,而第二个似乎已保存为光栅图形(缩放效果不佳)。
使用例如 knitr 时问题仍然存在,但它甚至会导致与图形在同一页面上的所有文本和图形显示为栅格。
这个问题似乎与这个问题有些相关,但我没有得到与该问题中的海报相同的问题,并且那里提出的解决方案并不能解决我的问题。
这有效(因为没有阿尔法):
library(extrafont)
font_install("fontcm")
loadfonts()
library(scales)
pdf("plot_cm.pdf", family="CM Roman", width=4, height=4.5)
plot(1:10, 1:10, pch=16)
dev.off()
embed_fonts("plot_cm.pdf", outfile="plot_cm_embed.pdf")
这不会(大概是因为阿尔法):
library(extrafont)
font_install("fontcm")
loadfonts()
library(scales)
pdf("plot_cm.pdf", family="CM Roman", width=4, height=4.5)
plot(1:10, 1:10, pch=16, col=alpha("black", 0.5))
dev.off()
embed_fonts("plot_cm.pdf", outfile="plot_cm_embed.pdf")
会议信息:
R version 3.0.2 (2013-09-25)
Platform: i386-w64-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] grDevices datasets splines graphics utils grid stats methods base
other attached packages:
[1] extrafont_0.16 xtable_1.7-1 knitr_1.5 dplyr_0.1.1
[5] directlabels_2013.6.15 quadprog_1.5-5 lubridate_1.3.3 scales_0.2.3
[9] ggthemes_1.6.0 stringr_0.6.2 plyr_1.8 Hmisc_3.14-0
[13] Formula_1.1-1 survival_2.37-7 lattice_0.20-24 ggplot2_0.9.3.1
[17] reshape2_1.2.2
loaded via a namespace (and not attached):
[1] assertthat_0.1 cluster_1.14.4 colorspace_1.2-4 dichromat_2.0-0 digest_0.6.4
[6] evaluate_0.5.1 extrafontdb_1.0 formatR_0.10 gtable_0.1.2 labeling_0.2
[11] latticeExtra_0.6-26 MASS_7.3-29 memoise_0.1 munsell_0.4.2 proto_0.3-10
[16] RColorBrewer_1.0-5 Rcpp_0.11.0 Rttf2pt1_1.2 tools_3.0.2
我不确定如何使用 extrafont
包解决它,但您可能会尝试 showtext
,另一个处理 R 图形中字体的包。
重现绘图的代码如下:
# download font file
old = setwd(tempdir())
download.file("http://downloads.sourceforge.net/project/cm-unicode/cm-unicode/0.7.0/cm-unicode-0.7.0-ttf.tar.xz",
"cm-unicode-0.7.0-ttf.tar.xz")
untar("cm-unicode-0.7.0-ttf.tar.xz", compressed = "xz")
setwd("cm-unicode-0.7.0")
# register font to "showtext" package
library(showtext)
font.add("CM Roman",
regular = "cmunrm.ttf",
italic = "cmunti.ttf",
symbol = "cmunti.ttf")
setwd(old)
# create graphs -- enclose plotting codes by a pair of
# showtext.begin()/showtext.end()
library(scales)
pdf("plot_cm.pdf", width=4, height=4.5)
par(family = "CM Roman")
showtext.begin()
# your example
plot(1:10, 1:10, pch=16, col=alpha("black", 0.5))
# example in Winston Chang's tutorial
curve(dnorm, from=-3, to=3, main="Normal Distribution")
text(x=0, y=0.1, cex=1.5, expression(italic(y == frac(1, sqrt(2 * pi)) *
e ^ {-frac(x^2, 2)} )))
showtext.end()
dev.off()
使用 showtext
创建的图形应该看起来与 extrafont
非常相似。您需要对showtext
采取的步骤基本上是:
- 查找安装在系统中或从 Web 下载的字体文件。
- 将这些字体注册到
showtext
中。 - 在一对
showtext.begin()
和showtext.end()
内运行绘图函数。
希望这可以在一定程度上帮助您。