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()
则用于往图表中添加单个文本元素。
Name | Default value |
---|---|
size | 5 |
family | "" (sans) |
fontface | plain |
lineheight | 1.2 |
angle | 0 |
hjust | 0.5 |
vjust | 0.5 |
注意这里 size
的单位是毫米, 而非磅。
dat <- data.frame(y = 1:3, text = c("This is text", "Text with\nmultiple lines",
"Some more text"))
library(ggplot2)
p <- ggplot(dat, aes(x = 1, y = y)) + scale_y_continuous(limits = c(0.5,
3.5), breaks = NULL) + scale_x_continuous(breaks = NULL)
p + geom_text(aes(label = text))
p + geom_text(aes(label = text), family = "Times", fontface = "italic",
lineheight = 0.8) + annotate(geom = "text", x = 1, y = 1.5,
label = "Annotation text", colour = "red", size = 7,
family = "Courier", fontface = "bold", angle = 30)
10.3.2.2 theme() 和 element_text()
在管理类似标题,图注,坐标轴标签等元素时,可以使用 element_text()
, 其参数设置跟 geom_text()
基本一致, 除了 size
的单位是 points (而非 mm), 还有就是它用的是 face
而不是 fontface
。默认情况下,size
取决于元素,比如图形标题的字体总是比刻度标签的大。
p + geom_point() + ggtitle("This is a Title") + theme(plot.title = element_text(family = "Times",
face = "bold", size = 20))
10.3.2.3 字体表格
你可以运行下列代码来生成一张不同字体的图形表。 每种字体都有简称和字体标准家族名称,定义字体时使用其中一种即可。
fonttable <- read.table(header = TRUE, sep = ",", stringsAsFactors = FALSE,
text = "
Short,Canonical
mono,Courier
sans,Helvetica
serif,Times
,AvantGarde
,Bookman
,Helvetica-Narrow
,NewCenturySchoolbook
,Palatino
,URWGothic
,URWBookman
,NimbusMon
URWHelvetica,NimbusSan
,NimbusSanCond
,CenturySch
,URWPalladio
URWTimes,NimbusRom
")
fonttable$pos <- 1:nrow(fonttable)
library(reshape2)
fonttable <- melt(fonttable, id.vars = "pos", measure.vars = c("Short",
"Canonical"), variable.name = "NameType", value.name = "Font")
# 创建一个分面形式的图表。确保因子的顺序是正确的
facetable <- data.frame(Face = factor(c("plain", "bold",
"italic", "bold.italic"), levels = c("plain", "bold",
"italic", "bold.italic")))
fullfonts <- merge(fonttable, facetable)
library(ggplot2)
pf <- ggplot(fullfonts, aes(x = NameType, y = pos)) + geom_text(aes(label = Font,
family = Font, fontface = Face)) + facet_wrap(~Face,
ncol = 2)
在屏幕中查看:
pf
你在屏幕中所看见的不一定跟你输出为 PNG 或 PDF 格式后的结果完全一样。查看 PNG 格式的输出结果:
png("fonttable.png", width = 720, height = 720, res = 72)
print(pf)
dev.off()
#> quartz_off_screen
#> 2
需要注意的是,对于生成这张图片的操作系统来说,大部分的字体(位于顶部)是不兼容的,只有一些基础字体(位于底部)是可以使用的。
PDF 格式输出结果(以下示例图已从 PDF 格式转化为 PNG 格式):
pdf("fonttable.pdf", width = 10, height = 10)
print(pf)
dev.off()
# 用 GraphicsMagick 将 PDF 转化为PNG格式: system('gm
# convert -resize 720x720 -background white
# fonttable.pdf fonttable-pdf.png')
PDF 设备对于不同字体的支持比 PNG 设备更好。基本所有的字体都能兼容(虽然这些字体并不一定很好看)。