Reputation: 1437
I've been following Winston Chang's excellent tutorial on how to change the font in r graphs (base and ggplot2) and it all works fine as long as I don't include any semi-transparency in the graph. The two examples below are identical, except the second includes the parameter "col=alpha("black", 0.5)". However, whereas the first one looks fine and is perfectly scale-able, the second appears to have been saved as a raster graphic (doesn't scale nicely).
The problem persists when using e.g. knitr, but then it even causes all text and graphics on the same page as the graphic to appear as rasters.
The question seems somewhat related to this question, but I don't get the same problem as the poster in that question, and the proposed solutions there don't solve my problem.
This works (since no alpha):
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")
This does not (presumably because of the alpha):
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")
Session info:
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
Upvotes: 3
Views: 354
Reputation: 834
I'm not sure how to solve it with the extrafont
package, but you might have a try of showtext
, another package to handle fonts in R graphics.
The code to reproduce your plot is as follows:
# 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()
The graph created using showtext
should look pretty similar to that by extrafont
. The steps you need to take with showtext
are basically:
showtext
.showtext.begin()
and showtext.end()
.Hope this could help you to some extent.
Upvotes: 2