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

时间:2018-08-22 20:32:16

标签: r ggplot2 gridextra

我正在绘制Hydrograph,但是我在facet_grid中另外使用了R,因为我有具有共同特征的对象。 但是,当我使用facet_grid时,绘图会失真,如下图所示。我该如何使这个损失呢?

enter image description here

请注意,它未正确对齐,y轴的比例被打乱,等等。 在我尝试过的调整中,我意识到可以极大地改善这一情况。我已经根据上面的图创建了一个图像,并尝试了一些其他方法,并对绘画进行了一些调整以展示我的意图。

enter image description here

这是我的代码:

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(),我深表歉意。

2 个答案:

答案 0 :(得分:1)

您可以在widths = c(0.9, 1)上加上grid.arrange(在第一个数字的后面加上小数字),以使图形沿右侧对齐。

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

widthsggsave(width, height)的确切值将取决于您的数据,不幸的是,这将需要反复试验。如果您使用的是RStudio之类的东西,建议您在致电grid.arrange之前先熟悉一下widths调用并找到所需的ggsave参数。当您准备尝试不同的ggsave widthheight参数时,请在头几次以较低的dpi运行它,以使其处理更快。

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

答案 1 :(得分:1)

遵循代码@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)

enter image description here