首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用网格和gtable拆解网格

用网格和gtable拆解网格
EN

Stack Overflow用户
提问于 2015-01-03 01:12:38
回答 1查看 1.9K关注 0票数 2

我正在努力构建一个基于ggplot对象的双轴图。在巴普蒂斯特的建议下,我把问题分成了几个小部分。目前的问题是:

  1. 如何在保留轴、轴标签、轴痒标记和网格线的同时,从grobs**,中删除中的所有数据?**指的是与geom_line()geom_points()关联的数据。

想要这样做的原因是,在构建双轴图的过程中,我遇到了以下问题:来自一个grob的网格线将覆盖来自另一个grob的数据。通过删除数据行和点,就不会有覆盖。

让我明确一点:我确实有一些解决办法,包括向aes()添加一行类型和设置scale_linetype_manual(值= c("solid",“空白”),或者将数据‘从网格上发送出去’,但是我想对一个没有被‘修饰’太多的绘图对象进行后置处理。

下面是一些代码和数字。

代码语言:javascript
复制
# Data
df <- structure(list(Year = c(1950, 2013, 1950, 2013), Country = structure(c(1L, 
1L, 2L, 2L), .Label = c("France", "United States"), class = "factor"), 
Category = c("Hourly minimum wage", "Hourly minimum wage", 
"Hourly minimum wage", "Hourly minimum wage"), value = c(2.14, 
9.43, 3.84, 7.25), variable = c("France (2013 euros)", 
"France (2013 euros)", "United States (2013 dollars)", "United States (2013 dollars)"
), Unit = c("2013 euros", "2013 euros", "2013 dollars", "2013 dollars"
)), .Names = c("Year", "Country", "Category", "value", "variable", 
"Unit"), row.names = c(NA, 4L), class = "data.frame")

# Plot data with ggplot
library(ggplot2)
p <- ggplot(data = df, aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) + 
geom_line(size = 2) + 
geom_point(size = 4) +
theme(panel.grid.major = element_line(size = 1, colour = "darkgreen"), 
      panel.grid.minor = element_line(size = 1, colour = "darkgreen", linetype = "dotted"))

# Manipulate grobs with gtable
library(gtable)
g <- ggplot_gtable(ggplot_build(p))
## Here remove the geom_line() and geom_point()
## g <- stripdata(g)  # pseudo-code!
grid.newpage()
grid.draw(g)

在下面的情节里,我想把台词去掉!

编辑:按照巴普蒂斯特的建议,我尝试删除数据层。但是,正如BondedDust在注释部分中所指出的那样,这会破坏ggplot对象:

代码语言:javascript
复制
# Remove the two layers of data
p$layers[[1]] <- NULL
p$layers[[1]] <- NULL
g <- ggplot_gtable(ggplot_build(p))
## Error: No layers in plot

从ggplot对象中删除数据会破坏它。我在应用程序中使用的一个解决方法是“将数据从网格中发送出去”,例如,将每个单元格乘以-999999,然后用+ scale_y_continuous(limits = c(1, 10))切断显示,但如果可行的话,我想避免这种丑陋的攻击。我希望如果用NA或NULL替换每个数据点,关联的gtable不会被销毁,所以这就是为什么我在寻找从g对象而不是p对象中删除数据的方法。

在对grobs进行操作之后(而不是直接侵入ggplot对象),grid.draw(g)的结果将是:

FYI,第二个地块是通过以下解决办法得到的。

代码语言:javascript
复制
p <- ggplot(data = within(df, value <- -999999), aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) + 
geom_line() + 
geom_point() +
theme(panel.grid.major = element_line(size = 1, colour = "darkgreen"), 
      panel.grid.minor = element_line(size = 1, colour = "darkgreen", linetype = "dotted")) +
scale_y_continuous(limits = c(1, 10))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-03 12:53:56

一种更自然的策略是使用不可见的geom_blank层,这样ggplot2仍然可以训练鳞片等来构建地块,但是没有显示数据。但是,由于您想要处理已经格式化的绘图,所以您可能必须手动将那些grobs从图gTree中删除。这是一次尝试

代码语言:javascript
复制
library(gtable)
g <- ggplotGrob(p)

stripdata <- function(g){
  keep <- grepl("border|grill", 
                names(g[["grobs"]][[4]][["children"]]))
  g[["grobs"]][[4]][["children"]][!keep] <- NULL
  g
}

grid.newpage()
grid.draw(stripdata(g))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27750737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档