Я подписан на Превосходный учебник Уинстона Чанга о том, как изменить шрифт в графиках 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   
3
user2987808 26 Фев 2014 в 17:58

1 ответ

Лучший ответ

Я не знаю, как решить эту проблему с помощью пакета 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, сводятся к следующему:

  1. Найдите файлы шрифтов, установленные в вашей системе или загруженные из Интернета.
  2. Зарегистрируйте эти шрифты в showtext.
  3. Запустите функции построения графика в паре showtext.begin() и showtext.end().

Надеюсь, это поможет вам в какой-то степени.

2
yixuan 3 Мар 2014 в 02:04