如何(重新)排列 facet_wrap/_grid 的面板?
Posted
技术标签:
【中文标题】如何(重新)排列 facet_wrap/_grid 的面板?【英文标题】:How to (re)arrange panels of facet_wrap/_grid? 【发布时间】:2021-07-13 14:17:40 【问题描述】:这里是菜鸟。我整天都被这张图难住了,this 和this 之类的解决方案似乎能满足我的要求,但我无法让它们为我工作。
我有一个数据框,它是下面示例的大版本,我正在尝试使用 ggplot 进行绘图。
# create data
df <- data.frame(
"ID" = rep(1:5, each = 4),
"Date" = c(seq(as.Date("2019/09/18"), by = "day", length.out = 4),
seq(as.Date("2019/09/18"), by = "day", length.out = 4),
seq(as.Date("2020/08/07"), by = "day", length.out = 4),
seq(as.Date("2020/09/12"), by = "day", length.out = 4),
seq(as.Date("2020/09/29"), by = "day", length.out = 4)),
"MaxDepth" = round(runif(20, min = 10, max = 50), 1),
"Trip" = rep(1:5, each = 4)
)
# plot using ggplot
ggplot(df, aes(Date, MaxDepth, col = factor(Trip))) +
geom_line() +
facet_grid(ID ~ format(Date, "%Y"), scales = "free_x") +
scale_y_reverse() +
scale_x_date(date_labels = "%b") +
labs(title = "Daily maximum depth\n",
x = "",
y = "Depth [m]\n",
col = "Fishing trip")
这很好地显示为一个两列、十一行的多面图,以钓鱼旅行为颜色。
但是,它包含许多空面板,我想通过创建一个仍然包含所有 11 个 ID 行但由两列具有的相同拆分标签分隔的单列图来避免这些空面板。 IE。我希望 LHS 2019 情节中的两个人将 2019 年标签放在顶部,用 2020 年标签与其他 9 个人分开。 .
希望这很清楚。请纠正我或让我知道如何改进以获得更好的问题。 感谢您的帮助!即使这些建议表明这不是一种好的表示方式,或者类似的事情根本不可能。谢谢大家!
【问题讨论】:
使用facet_wrap
:facet_wrap(~ format(Date, "%Y") + ID, scales = "free_x", ncol = 1)
?这是一个类似的帖子:***.com/questions/51725106/…
感谢您的建议。不幸的是,通过这种方式,在每个图表上方创建了 2019/2020 年的标签,并且右侧的那些行标签 (1-11) 被绘制到中心,因此基本上图表变得不可读。到目前为止,我无法从您发布的为我工作的链接中获得答案。但是,我很惊讶它似乎如此困难!
另一种解决方法是绘制 2019 年的图和 2020 年的图,然后将这两个图与 R 包 patchwork
或 cowplot
结合起来。
【参考方案1】:
这是一种可能的方法。我不确定它是否适用于您的真实数据。
library(ggplot2)
library(patchwork)
library(dplyr)
plot_fun <- function(dtt)
ggplot(dtt, aes(Date, MaxDepth, col = factor(Trip))) +
geom_line() +
facet_grid(ID ~ format(Date, "%Y"), scales = "free_x") +
scale_y_reverse() +
scale_x_date(date_labels = "%b") +
labs(x = NULL, y = NULL, col = "Fishing trip")
p1 <- plot_fun(df %>% filter(format(Date, '%Y') == '2019'))
p2 <- plot_fun(df %>% filter(format(Date, '%Y') == '2020'))
p1 / p2
ggsave('~/Downloads/test.png', width = 6, height = 6)
【讨论】:
非常感谢您提供这个可能的解决方案,mt1022!它确实适用于我的真实数据。但是,就像在您使用模型数据的示例中一样,图表的布局并不完全匹配。最重要的是,我希望在两个图之间共享 x 轴。但是,多次讨论表明patchwork
不存在此功能。至少(p1 / p2) + plot_layout(guides = "collect") & scale_colour_discrete(limits = factor(min(range(df$Trip)):max(range(df$Trip)))) & theme(legend.position = "right")
将两个图例合二为一。以上是关于如何(重新)排列 facet_wrap/_grid 的面板?的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化分面图使用facet_wrap函数和facet_grid函数实战
使用 ggplot facet_grid 或 facet_wrap 时修改面板轴的特定主题参数
使用 facet_grid 或 facet_wrap 根据组的最大值和最小值独立修复 y_scale
将带有美元符号 ($) 的变量与 facet_grid() 或 facet_wrap() 组合传递给 aes() 时出现问题