如何手动编辑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 尺寸,相比之下您的图表看起来会更大。
widths
和 ggsave(width, height)
的确切值将取决于您的数据,不幸的是,这需要一些试验和错误。如果您使用的是 RStudio 之类的东西,我建议在调用 ggsave
之前摆弄 grid.arrange
调用并找到您喜欢的 widths
参数。当您准备好尝试使用不同的 ggsave
width
和 height
参数时,运行 它在前几次使用较低的 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)
我正在绘制一个 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 尺寸,相比之下您的图表看起来会更大。
widths
和 ggsave(width, height)
的确切值将取决于您的数据,不幸的是,这需要一些试验和错误。如果您使用的是 RStudio 之类的东西,我建议在调用 ggsave
之前摆弄 grid.arrange
调用并找到您喜欢的 widths
参数。当您准备好尝试使用不同的 ggsave
width
和 height
参数时,运行 它在前几次使用较低的 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)