10.3 字体

10.3.1 问题

你想在图像中使用不同的字体。

10.3.2 方案

更新: 查看 extrafont 包相关内容,该包能更好地支持 PDF 和 Windows 位图中的字体设定。

R 在一般情况下都不能很好地支持字体的显示。在不同的操作系统和不同的输出格式中都会出现不一样的结果。

10.3.2.1 geom_text

通过 ggplot2 中的 geom_text() or annotate() , 你可以对图形文本中的一系列属性进行设置。 geom_text() 用于将数据框中的文本加入到图表中,而 annotate() 则用于往图表中添加单个文本元素。

NameDefault value
size5
family"" (sans)
fontfaceplain
lineheight1.2
angle0
hjust0.5
vjust0.5

注意这里 size 的单位是毫米, 而非磅。

  1. dat <- data.frame(y = 1:3, text = c("This is text", "Text with\nmultiple lines",
  2. "Some more text"))
  3. library(ggplot2)
  4. p <- ggplot(dat, aes(x = 1, y = y)) + scale_y_continuous(limits = c(0.5,
  5. 3.5), breaks = NULL) + scale_x_continuous(breaks = NULL)
  6. p + geom_text(aes(label = text))

10.3 字体 - 图1

  1. p + geom_text(aes(label = text), family = "Times", fontface = "italic",
  2. lineheight = 0.8) + annotate(geom = "text", x = 1, y = 1.5,
  3. label = "Annotation text", colour = "red", size = 7,
  4. family = "Courier", fontface = "bold", angle = 30)

10.3 字体 - 图2

10.3.2.2 theme() 和 element_text()

在管理类似标题,图注,坐标轴标签等元素时,可以使用 element_text(), 其参数设置跟 geom_text() 基本一致, 除了 size 的单位是 points (而非 mm), 还有就是它用的是 face 而不是 fontface 。默认情况下,size 取决于元素,比如图形标题的字体总是比刻度标签的大。

  1. p + geom_point() + ggtitle("This is a Title") + theme(plot.title = element_text(family = "Times",
  2. face = "bold", size = 20))

10.3 字体 - 图3

10.3.2.3 字体表格

你可以运行下列代码来生成一张不同字体的图形表。 每种字体都有简称字体标准家族名称,定义字体时使用其中一种即可。

  1. fonttable <- read.table(header = TRUE, sep = ",", stringsAsFactors = FALSE,
  2. text = "
  3. Short,Canonical
  4. mono,Courier
  5. sans,Helvetica
  6. serif,Times
  7. ,AvantGarde
  8. ,Bookman
  9. ,Helvetica-Narrow
  10. ,NewCenturySchoolbook
  11. ,Palatino
  12. ,URWGothic
  13. ,URWBookman
  14. ,NimbusMon
  15. URWHelvetica,NimbusSan
  16. ,NimbusSanCond
  17. ,CenturySch
  18. ,URWPalladio
  19. URWTimes,NimbusRom
  20. ")
  21. fonttable$pos <- 1:nrow(fonttable)
  22. library(reshape2)
  23. fonttable <- melt(fonttable, id.vars = "pos", measure.vars = c("Short",
  24. "Canonical"), variable.name = "NameType", value.name = "Font")
  25. # 创建一个分面形式的图表。确保因子的顺序是正确的
  26. facetable <- data.frame(Face = factor(c("plain", "bold",
  27. "italic", "bold.italic"), levels = c("plain", "bold",
  28. "italic", "bold.italic")))
  29. fullfonts <- merge(fonttable, facetable)
  30. library(ggplot2)
  31. pf <- ggplot(fullfonts, aes(x = NameType, y = pos)) + geom_text(aes(label = Font,
  32. family = Font, fontface = Face)) + facet_wrap(~Face,
  33. ncol = 2)

在屏幕中查看:

  1. pf

10.3 字体 - 图4

你在屏幕中所看见的不一定跟你输出为 PNG 或 PDF 格式后的结果完全一样。查看 PNG 格式的输出结果:

  1. png("fonttable.png", width = 720, height = 720, res = 72)
  2. print(pf)
  3. dev.off()
  4. #> quartz_off_screen
  5. #> 2

需要注意的是,对于生成这张图片的操作系统来说,大部分的字体(位于顶部)是不兼容的,只有一些基础字体(位于底部)是可以使用的。

PDF 格式输出结果(以下示例图已从 PDF 格式转化为 PNG 格式):

  1. pdf("fonttable.pdf", width = 10, height = 10)
  2. print(pf)
  3. dev.off()
  4. # 用 GraphicsMagick 将 PDF 转化为PNG格式: system('gm
  5. # convert -resize 720x720 -background white
  6. # fonttable.pdf fonttable-pdf.png')

PDF 设备对于不同字体的支持比 PNG 设备更好。基本所有的字体都能兼容(虽然这些字体并不一定很好看)。