R ggplot2双轴。无法保存到文件

R ggplot2双轴。无法保存到文件,r,plot,ggplot2,R,Plot,Ggplot2,我正在使用一个工作台,使用ggplot2在双轴上绘图。我正在使用下面发布的代码。我试图将其保存为JPEG格式,但它只保存最后一行输出,而不保存绘图的两行,即使轴是正确的。如何同时保存两个轴及其相对线?我正在尝试ggsave,但它抱怨它不是ggplot2格式 ## Putting plots together ################## # extract gtable g1 <- ggplot_gtable(ggplot_build(p1)) g2 <- ggplot_gt

我正在使用一个工作台,使用ggplot2在双轴上绘图。我正在使用下面发布的代码。我试图将其保存为JPEG格式,但它只保存最后一行输出,而不保存绘图的两行,即使轴是正确的。如何同时保存两个轴及其相对线?我正在尝试ggsave,但它抱怨它不是ggplot2格式

## Putting plots together ##################
# extract gtable
g1 <- ggplot_gtable(ggplot_build(p1))
g2 <- ggplot_gtable(ggplot_build(p2))

# overlap the panel of 2nd plot on that of 1st plot
pp <- c(subset(g1$layout, grepl("panel",name) , se = t:r))
g <- gtable_add_grob(g1, g2$grobs[grep("panel",g2$layout$name)], pp$t, 
                     pp$l, pp$b, pp$l)



# axis tweaks
ia <- which(grepl("axis_l",g2$layout$name) |  grepl("axis-l",g2$layout$name)     )
ga <- g2$grobs[ia]


axis_idx <- as.numeric(which(sapply(ga,function(x) !is.null(x$children$axis))))

for(i in 1:length(axis_idx)){
  ax <- ga[[axis_idx[i]]]$children$axis
  ax$widths <- rev(ax$widths)
  ax$grobs <- rev(ax$grobs)
  ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
  g <- gtable_add_cols(g, g2$widths[g2$layout[ia[axis_idx[i]], ]$l], length(g$widths) - 1)
  g <- gtable_add_grob(g, ax, pp$t[axis_idx[i]], length(g$widths) - i, pp$b[axis_idx[i]])
}



# Plot!
grid.newpage()
grid.draw(g)
##将绘图放在一起##################
#提取表

g1这里我们将一个图与第二个图重叠,因此第二个图应该是透明的,而不是隐藏第一个图。我们可以通过从绘图中删除
panel.background
plot.background
来实现这一点

g2 <- ggplot_gtable(ggplot_build(p2 + theme(plot.background = element_blank(), 
                                            panel.background = element_blank())))
之后,我们可以得到双轴图(在
安全带
data.frame中的数据上绘制):


我们还应该记住,第二个绘图的网格线仍然可见,我们必须在需要时对其进行处理。

也许您的第二个绘图不透明?试试看,似乎总是只保存两个绘图中的一个。不是两者都有。我尝试了你的建议,但结果是一样的。你还需要打开允许透明度的图形设备,如
jpeg(bg=“transparent”)
,默认情况下,它有
bg=“white”
,我认为它解决了问题。谢谢,你看到你的柱状图在轴的后面,它变得不那么清晰了。如何使轴在两个打印层后面打印?作为一种快速解决方案,可以从第二个打印层中删除轴,再次修改
主题:
p2+主题(panel.grid=element\u blank())
如果确实要在两个打印层后面打印轴,则可以,但至少有两种方法可以做到这一点:1)修改
grob
s的顺序,从而生成
gtable
2)使用自定义y比例打断和标签重建第一个绘图。这两种方法都不容易在评论中给出答案。你可以把它作为一个单独的问题发布。
jpeg(bg = "transparent")