【发布时间】:2018-07-09 22:03:39
【问题描述】:
使用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 试图跟随 this example 并以这种方式找到要点:
gr <- ggplotGrob(p)
gr[['grobs']][[6]]$children$geom_point
这里我们有x、y、size、lwd(在上面的示例中使用)等,但没有字体。另外我想知道如何直接自动地从根 grob 中找到点的 grob,例如grid::getGrob,例如在引用的示例中,grid::grid.edit 找到了它们。
我发现了一些很有前途的代码here,它使用了editGtable,这是我在任何包中都找不到的方法,可能是一个旧的方法。然后我尝试editGrob没有成功:
font <- gpar(fontfamily = 'DejaVu Sans', fontsize = 14)
editGrob(gr[['grobs']][[6]], 'geom_point.points', grep = TRUE, global = TRUE, gp = font)
【问题讨论】:
-
theme(text=element_text(family="DejaVu Sans")). -
感谢@eipi10,这个我已经尝试过了,不会影响绘图符号,只会影响标签、标题等
-
我觉得很相关:stackoverflow.com/questions/52902946/… 和stackoverflow.com/questions/1395323/fonts-in-r-plots 可能是“设备的正确字体”,调用设备时可以和family一起设置。使用 ggsave,您只需使用
family = ...添加字体系列。不幸的是,我目前在我的 Mac 上处理 unicode 字符(类似于这里 stackoverflow.com/questions/12768176/…),所以我无法发布漂亮的示例图片