使用ggplot::geom_point
,我们可以使用scale_shape_manual
设置任何字符作为绘图符号。我举个例子来说明这个目的:使用三角形在每个单元格中显示两个值,制作一个热度图:
require(ggplot2)
data <- data.frame(
val = rnorm(40),
grp = c(rep('a', 20), rep('b', 20)),
x = rep(letters[1:4], 5),
y = rep(letters[1:5], 4)
)
p <- ggplot(data, aes(x = x, y = y, color = val, shape = grp)) +
geom_point(size = 18) +
scale_shape_manual(values=c("\u25E4","\u25E2")) +
theme_minimal() +
theme(panel.grid = element_blank())
ggsave('triangle-tiles.pdf', device = cairo_pdf, width = 4.1, height = 3.5)
如果用于符号的字体没有这些特殊字符,那么此方法将无法正常工作。否则,显式定义字体并使用 geom_text
可以得到相同的结果:
require(dplyr)
data <- data %>% mutate(sym = ifelse(grp == 'a', "\u25E4", "\u25E2"))
p <- ggplot(data, aes(x = x, y = y, color = val, label = sym)) +
geom_text(size = 18, family = 'DejaVu Sans') +
theme_minimal() +
theme(
panel.grid = element_blank()
)
ggsave('triangle-tiles-2.pdf', device = cairo_pdf, width = 4.1, height = 3.5)
然而,事实上,在geom_point
中同样使用来自字体的字符,这让我非常好奇如何覆盖默认设置。
我检查了此绘图的grob,试图按照这个示例的方法进行操作,并发现点是这样的:
gr <- ggplotGrob(p)
gr[['grobs']][[6]]$children$geom_point
这里有 x
, y
, size
, lwd
(如上例所示)等,但没有字体。我也想知道如何直接自动地从根 grob 找到点的 grob,例如使用 grid::getGrob
,在引用的示例中,grid::grid.edit
找到了它们。
我在这里找到了一些有希望的代码,其中使用了 editGtable
,但我没有在任何包中找到这个方法,可能是一个旧方法。然后我尝试了 editGrob
,但没有成功:
font <- gpar(fontfamily = 'DejaVu Sans', fontsize = 14)
editGrob(gr[['grobs']][[6]], 'geom_point.points', grep = TRUE, global = TRUE, gp = font)