ggplot geom_point:如何设置自定义绘图符号的字体?

时间:2018-01-30 22:02:20

标签: r ggplot2 heatmap gtable

使用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)

triangle heatmap with geom_point

如果用于符号的字体具有这些特殊字符,则此方法可以正常工作。否则显然是失败的。我知道我们可以明确地定义字体并使用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

此处我们有xysizelwd(在上面的示例中使用)等,但没有字体。此外,我想知道如何直接和自动地找到根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)

0 个答案:

没有答案