如何手动编辑grid.arrange、ggplot_gtable和facet?

How to manually edit a grid.arrange, ggplot_gtable and facet?

我正在绘制一个 Hydrograph,但我在 R 中另外使用了 facet_grid,因为我有具有共同特征的对象。 但是当我使用 facet_grid 时,情节会扭曲,如下图所示。我该如何随机化它?

注意没有对齐,y轴的刻度乱了等等。 在我尝试的调整中,我意识到可以大大改善这个情节。我已经根据上面的情节创建了一个图像,我尝试了一些其他尝试,并对绘画进行了一些调整以展示我正在尝试做的事情。

这是我的代码:

library(ggplot2)
library(grid)
library(gridExtra)

g1 <- ggplot(data_cet, 
         aes(x = Periodo,
             y = Ind_plu)) +
  geom_bar(stat = 'identity', 
           fill = "blue",
       position = position_dodge()) +
  ylab("Precip.") +
  scale_y_reverse(labels = scales::comma) +
  theme_bw() +
  theme(axis.title.x = element_blank(),
        axis.text.x  = element_blank(),
        axis.ticks.x = element_blank())

g2 <- ggplot(data_cet, 
         aes(x      = Periodo,
             y      = Nivel,
             colour = Bomba)) +
  geom_line(aes(group = 1)) +
  scale_color_manual(values = c("#0B775E", "#35274A", "#F2300F")) +
  labs(colour = "Status CMB") +
  facet_grid(data_cet$arranjo + data_cet$Bacia ~.) +
  scale_x_date(breaks = datebreaks_m, 
               labels = date_format("%b/%y")) +
  xlab('Período') + ylab('% Nível') +
  theme_bw() +
  theme(axis.text.x  = element_text(face  = "plain", 
                                    color = "black", 
                                    angle = 90),
    axis.text.y      = element_text(face  = "plain", 
                                    color = "black"),
    legend.title     = element_blank(),
    strip.background = element_blank(),
    legend.position  = "bottom")

g1 <- ggplot_gtable(ggplot_build(g1))
g2 <- ggplot_gtable(ggplot_build(g2))
maxWidth = unit.pmax(g1$widths[2:3], g2$widths[2:3])

g1$widths[2:3] <- maxWidth
g2$widths[2:3] <- maxWidth

plot_hyd <- grid.arrange(g1, g2, ncol = 1, heights = c(1, 3))
ggsave(file = "plot_hyd4.pdf", plot_hyd)

我的数据集太大,很抱歉没有显示数据集和dput()

您可以将 widths = c(0.9, 1) 添加到 grid.arrange(fiddle,第一个数字是一些)以使您的图表沿右侧排列。

否则,ggsave 将您的文件转换为更大的 pdf。您的 element_text 对象(例如图例)是绝对大小,因此如果您放大 pdf 尺寸,相比之下您的图表看起来会更大。

widthsggsave(width, height) 的确切值将取决于您的数据,不幸的是,这需要一些试验和错误。如果您使用的是 RStudio 之类的东西,我建议在调用 ggsave 之前摆弄 grid.arrange 调用并找到您喜欢的 widths 参数。当您准备好尝试使用不同的 ggsave widthheight 参数时,运行 它在前几次使用较低的 dpi 以便它处理得更快。

请注意,由于您没有包含您的数据,我没有尝试重现这个问题 - 这就是我过去解决此类问题的方式。如果这些建议对您不起作用,请告诉我,我可以使用一些内置数据集来寻找其他解决方案

遵循@Pintintended 代码提示的逻辑。我采纳了layout_matrix的说法。

>
plot_hyd <- grid.arrange(g1, g2, 
                     layout_matrix = rbind(c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,NA),
                                           c(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),
                                           c(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),
                                           c(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),
                                           c(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),
                                           c(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),
                                           c(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2)))

#ggsave(file="plot_hyd4.jpeg",plot_hyd,width=13,height=16,dpi=200)