如何在ggplot2中更改默认主题?

8

背景

我想更改ggplot使用的主题,但我很难理解theme_update()文档和示例。

我正在使用align_plots()将箱线图放置在密度图上,但我发现代码中没有任何内容会导致错误,并且只剩下最小的示例。我怀疑错误是由theme_blank()的使用引起的,但我不确定为什么会发生这种情况,也不知道如何修复它。

因此,我提供一个最小可重现的示例,展示我的错误:

library(ggExtra)
align.plots(qplot(1))

但是在我更新主题后,它就出故障了:

newtheme <- theme_update(axis.text.y = theme_blank(),
                         axis.line = theme_blank(),
                         axis.title.x = theme_blank(), 
                         axis.title.y = theme_blank(),
                         axis.ticks.x = theme_blank(),
                         panel.grid.major = theme_blank(),
                         panel.grid.minor = theme_blank(),
                         panel.border = theme_blank(),
                         axis.color.y = 'white')
align.plots(qplot(1))

这会出现错误:

Error in UseMethod("validGrob") : 
  no applicable method for 'validGrob' applied to an object of class "NULL"
In addition: Warning message:
In editThisGrob(grob, specs) : Slot 'vp' not found

问题:

  1. 这个错误是什么原因引起的?

  2. 在使用?theme_update()时,我在ggplot文档中找到了一些信息,但在ggplot网站上找不到答案,尽管我最接近的答案是polishing.r脚本。

注意:

我按照另一个问题的Hadley的建议得到了相同的错误。

opt <- opts(...)
align.plots(qplot(1) + opt)

其中...是上面theme_update()的内容

2个回答

7
我不知道为什么这样能行,但它确实可以。只需在调用align.plots之前插入一行代码theme_set(newtheme)即可。

1
谢谢。我之前尝试过这个,它可以生成一个图表,但是图表使用的是默认的theme_grey()而不是在newtheme中提供的theme_blank()选项。 - David LeBauer
@DavidLeBauer 非常感谢!它不知怎么变了,我可以这样恢复它 theme_set(theme_grey()) - Anton K

2
这可以被视为 ggExtra::align.plots() 中的一个 bug。该函数计算 ggplot 的不同元素(例如 y 轴标签和图例)的大小,并根据需要对齐图表面板,使其彼此重叠。如果您将主题设置为对某些这些图形元素使用 theme_blank(),则该函数会感到困惑,因为底层的 grob (ggplot2:::.zeroGrob) 不像其他 grob 那样。
虽然它可能是可以修复的 (*),但我认为你最好考虑其他选项:
- 使用虚拟分面变量,让 ggplot2 自动对齐两个面板。 - 使用 gridExtra::grid.arrange() 或普通网格视口将两个图表重叠在一起;由于您删除了可能会偏移图表位置的元素,所以不应该有问题。
(*): 现在已经修复,请尝试。
   source("http://ggextra.googlecode.com/svn/trunk/R/align.r")

嘿,Baptiste!新的align.r似乎被放在了密码墙后面。有什么建议吗? - Atticus29
此软件包已被弃用;我建议您改用分面 - baptiste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接