【问题标题】:How to let geom_text inherit theme specifications? (ggplot2)如何让 geom_text 继承主题规范? (ggplot2)
【发布时间】:2024-01-12 20:55:01
【问题描述】:

ggplot2 中是否有一种优雅的方式可以让geom_text/geom_labelbase_family 一样继承theme 规范?

或者反过来问:我可以指定一个theme,它也适用于geom_text/geom_label吗?


示例:

我希望text/labels 看起来与theme 中指定的axis.text 完全相同...

显然我可以将规范作为可选参数手动添加到geom_text,但我希望它“自动”继承规范...

library("ggplot2")

ggplot(mtcars, aes(x = mpg,
                   y = hp,
                   label = row.names(mtcars))) +
  geom_point() +
  geom_text() +
  theme_minimal(base_family = "Courier")

补充:与ggrepel::geom_text_repel/geom_label_repel 一起使用的解决方案也将是完美的......

【问题讨论】:

标签: r ggplot2 themes ggrepel


【解决方案1】:

你可以

设置整体字体

首先,根据系统,您需要检查哪些字体可用。当我在 Windows 上运行时,我正在使用以下内容:

install.packages("extrafont")
library(extrafont)
windowsFonts() # check which fonts are available

theme_set 函数可让您指定 ggplot 的整体主题。因此,theme_set(theme_minimal(base_family = "Times New Roman")) 允许您定义绘图的字体。

使标签继承字体

要让标签继承这个文本,我们需要使用两件事:

  1. update_geom_defaults 可让您更新几何对象样式以用于 ggplot 中的未来绘图:http://ggplot2.tidyverse.org/reference/update_defaults.html
  2. theme_get()$text$family 提取当前全局ggplot主题的字体。

结合这两者,标签样式可以更新如下:

# Change the settings
update_geom_defaults("text", list(colour = "grey20", family = theme_get()$text$family))
update_geom_defaults("text_repel", list(colour = "grey20", family = theme_get()$text$family))

结果

theme_set(theme_minimal(base_family = "Times New Roman"))

# Change the settings
update_geom_defaults("text", list(colour = "grey20", family = theme_get()$text$family))

# Basic Plot
ggplot(mtcars, aes(x = mpg,
                   y = hp,
                   label = row.names(mtcars))) +
  geom_point() +
  geom_text()

# works with ggrepel
update_geom_defaults("text_repel", list(colour = "grey20", family = theme_get()$text$family))

library(ggrepel)

ggplot(mtcars, aes(x = mpg,
                   y = hp,
                   label = row.names(mtcars))) +
  geom_point() +
  geom_text_repel()

【讨论】:

  • 很好的答案,图文并茂