Pregunta

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   
¿Fue útil?

Solución

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:

  1. Find the font files, either installed in your system or downloaded from web.
  2. Register these fonts into showtext.
  3. Run plotting functions within a pair of showtext.begin() and showtext.end().

Hope this could help you to some extent.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top