从现有的ggplot图表中删除geom?

xav*_*xav 14 r ggplot2

我试图了解如何更改ggplot2图表的内部.我开始阅读一些ressources我能找到ggplot_builtggplot_gtable,但我不能回答以下问题.

给出g2 的情节geom.

g <- ggplot(iris, aes(Petal.Length, Petal.Width)) + 
  geom_point() + 
  geom_text(aes(label=Sepal.Width))
g
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

有没有办法潜入g对象并删除一个/多个geoms?

我可以从g一个没有地貌的情节开始吗?

在此输入图像描述

或者只是geom_text删除?

在此输入图像描述


更彻底地测试答案后更新

我只是注意到移除geoms会对其他geom的布局产生影响.作为大多数用例的默认和预期行为可能很好,但实际上我需要完全相同的图表"布局"(轴和剩余几何的位置).

例如,在删除一个geom之前:

library(dplyr)
library(ggplot2)
count(mpg, class) %>%
  mutate(pct=n/sum(n)) %>%
  ggplot(aes(class, pct)) +
  geom_col(fill="blue") +
  geom_line(group=1) +
  geom_point(size=4) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

删除一个geom后(请注意,y轴不再从0开始,我猜是没有条形的线/点的默认行为):

library(dplyr)
library(ggplot2)
count(mpg, class) %>%
  mutate(pct=n/sum(n)) %>%
  ggplot(aes(class, pct)) +
  geom_col(fill="blue") +
  geom_line(group=1) +
  geom_point(size=4) -> p
p$layers[[1]] <- NULL
p
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

有什么方法可以强制ggplot保持完全相同的布局?

mar*_*kus 16

我从不潜入g,R但你可以geom_text像任何其他layers对象一样访问.

g$layers
#[[1]]
#geom_point: na.rm = FALSE
#stat_identity: na.rm = FALSE
#position_identity 

#[[2]]
#mapping: label = Sepal.Width 
#geom_text: parse = FALSE, check_overlap = FALSE, na.rm = FALSE
#stat_identity: na.rm = FALSE
#position_identity 
Run Code Online (Sandbox Code Playgroud)

删除gginnards:

g$layers[[2]] <- NULL
Run Code Online (Sandbox Code Playgroud)

移除所有 ggplot

g$layers <- NULL
g
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


ggplot_build软件包提供了一些操作ggplot_gtable图层的功能,请参阅插图用户指南:4绘图图层的操作以获取详细信息.


编辑

关于如何提取ggplot2对象的绘图轴范围的问题?我找到了一个使用ggplot_built(p)和的解决方案g.我们的想法只是将从R中获取的布局参数复制到新图中,为此我们删除了一个图层.

# create a copy of p
p_new <- p

# delete the first layer
p_new$layers[[1]] <- NULL
p_new_build <- ggplot_build(p_new)

# this is the important line
p_new_build$layout$panel_params <- ggplot_build(p)$layout$panel_params

library(gridExtra)
grid.arrange(p, ggplot_gtable(p_new_build), ncol = 2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Tun*_*ung 9

您可以使用gginnards包来简化生活

library(ggplot2)

### sample plot w/ both points and labels
g <- ggplot(iris, aes(Petal.Length, Petal.Width)) + 
  geom_point() + 
  geom_text(aes(label = Sepal.Width))
g
Run Code Online (Sandbox Code Playgroud)

### https://cran.rstudio.com/web/packages/gginnards/vignettes/user-guide-2.html
library(gginnards)

### remove points
delete_layers(g, "GeomPoint")
Run Code Online (Sandbox Code Playgroud)

### remove text
delete_layers(g, "GeomText")
Run Code Online (Sandbox Code Playgroud)

  • @Tung从版本0.3.0开始,`which_layer`函数不再是`ggpmisc`的一部分,而是新包[`gginnards`](https://cran.rstudio.com/web/packages/gginnards/)的一部分.最好 (2认同)