Gggraph geom_point:如何设置自定义绘图符号的字体? [英] ggplot geom_point: how to set font of custom plotting symbols?

查看:10
本文介绍了Gggraph geom_point:如何设置自定义绘图符号的字体?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用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
这里我们有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)

推荐答案

以下是一个小技巧,但您可以将一个Point Layer包装在一个新类中,该类将FontFamily赋给点的图形参数。在下面的示例中,新类调用用于绘制层和索引中的点的父方法,然后将FontFamily分配给图形参数。

require(ggplot2)
#> Loading required package: ggplot2

point_with_family <- function(layer, family) {
  old_geom <- layer$geom
  new_geom <- ggproto(
    NULL, old_geom,
    draw_panel = function(self, data, panel_params, coord, na.rm = FALSE) {
      pts <- ggproto_parent(GeomPoint, self)$draw_panel(
        data, panel_params, coord, na.rm = na.rm
      )
      pts$gp$fontfamily <- family
      pts
    },
    draw_key = function(self, data, params, size) {
      pts <- ggproto_parent(GeomPoint, self)$draw_key(
        data, params, size
      )
      pts$gp$fontfamily <- family
      pts
    }
  )
  layer$geom <- new_geom
  layer
}

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)) +
  point_with_family(geom_point(size = 18), "DejaVu Sans") +
  scale_shape_manual(values=c("u25E4","u25E2")) +
  theme_minimal() +
  theme(panel.grid = element_blank())

ggsave('triangle-tiles-2.pdf', plot = p, device = cairo_pdf, width = 4.1, height = 3.5)

reprex package(v2.0.0)于2021-08-29创建

使用不支持Unicode字符的字体系列:

这篇关于Gggraph geom_point:如何设置自定义绘图符号的字体?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆