Pat*_*ckT 2 r ggplot2 gtable r-grid
我正在努力建立一个基于ggplot物体的双轴绘图.在巴蒂斯特的建议下,我将问题分解为更小的部分.目前的问题是:
grobs在保持轴,轴标签,轴刻度线和网格线的同时从中删除所有数据?"数据"是指与geom_line()和相关的数据geom_points().想要这样做的原因是,在构建双轴绘图的过程中,我遇到了以下问题:来自一个grob的网格线将覆盖来自另一个grob的数据.通过删除数据线和点,将不会覆盖.
让我说清楚:我确实有一些解决方法,包括向aes()添加线型并设置scale_linetype_manual(values = c("solid","blank"),或者,将数据"从网格中发送",但是我想对一个未经过"修饰"的绘图对象进行后期处理,以达到目的.
下面是一些代码和数字.
# 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)
Run Code Online (Sandbox Code Playgroud)
在下面的图中,我希望线条不见了!

编辑:按照baptiste的建议,我尝试删除数据层.但是,正如BondedDust在评论部分中指出的那样,这会破坏ggplot对象:
# 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
Run Code Online (Sandbox Code Playgroud)
从ggplot对象中删除数据会破坏它.我在应用程序中使用的一种解决方法是"从网格中发送数据",例如将每个单元格乘以-999999并切断显示+ scale_y_continuous(limits = c(1, 10)),但是如果可行的话,我想避免这种丑陋的黑客攻击.我希望如果我用NA或NULL替换每个数据点,相关的gtable不会被销毁,这就是为什么我正在寻找一种从g对象内部而不是p对象中删除数据的方法.
在操纵grobs之后(而不是直接攻击ggplot对象),结果grid.draw(g)将是:

仅供参考,第二个图是通过以下解决方法获得的.
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))
Run Code Online (Sandbox Code Playgroud)
一个更自然的策略是使用不可见的geom_blank层,以便ggplot2仍然训练比例等来构建图但不显示数据.但是,由于您要处理已经格式化的绘图,因此您可能必须从绘图gTree中手动删除这些凹凸.这是一次尝试,
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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1452 次 |
| 最近记录: |