从具有facet_grid的ggplot中提取单个图形

5

我想使用ggplot和facet_grid来生成一些图表,并将图表保存为一个对象。我的问题是,我还想将每个子组(即每个面板)分别保存为一个对象。现在我的问题是,你是否可以从facet_grid中提取单个面板并将其保存为一个对象?这里是一些简单的代码:

library(ggplot2)

ggplot(data = mtcars, aes(x = disp, y = mpg)) +
  geom_point() +
  facet_grid(. ~ am)

现在我想要创建两个对象 - 一个是为了am=0,另一个是为了am=1

2个回答

8

我不确定为什么你不想使用子集,但你可以从分面网格中提取单独的分面。

library(ggplot2)
library(grid)
library(gtable)

p1 = ggplot(data = mtcars, aes(x = disp, y = mpg)) +
  geom_point() +
  facet_grid(. ~ am)


g1 = ggplotGrob(p1)


# Rows and columns can be dropped from the layout.

# To show the layout:
gtable_show_layout(g1)

# Which columns (and/or rows) to drop?
# In this case drop columns 5 and 6 to leave am = 0 plot
# Drop columns 4 and 5 to leave am = 1 plot

# am = 0 plot
g1_am0 = g1[,-c(5,6)]

grid.newpage()
grid.draw(g1_am0)


# am = 1 plot
g1_am1 = g1[,-c(4,5)]

grid.newpage()
grid.draw(g1_am1)

0
你可以在数据输入时进行子集操作,然后删除 facet 命令。
ggplot(data = subset(mtcars,am==0), aes(x = disp, y = mpg)) +
    geom_point() 

ggplot(data = subset(mtcars,am==1), aes(x = disp, y = mpg)) +
    geom_point() 

我意识到我没有回答你关于保存为对象的问题。 在 ggplot 代码之前添加一行:

tiff(file="firstfolder from working dir/next folder/ name.tiff",units="in",width=5,height=6,res=72)

编程相关内容:你需要在绘图代码后添加dev.off()才能再次将内容打印到计算机屏幕上。

你可以使用png、pdf等不同格式。

如果只是一次性的操作,并且你正在使用RStudio,你可以从绘图窗口手动导出。请参见其上方的导出按钮。


非常感谢!我知道子集,但我想知道是否有一种优雅的方法可以从facet_grid中提取绘图,这很有趣,因为这些绘图非常复杂(因此代码很长),我希望尽可能保持代码简洁。 - ehi
除了截图或裁剪之外,我不知道还有其他方法。@ehi - akaDrHouse
快照的问题在于缺乏独立的比例尺和y轴标签。 - ehi

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