如何(重新)排列 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 包 patchworkcowplot 结合起来。 【参考方案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") &amp; scale_colour_discrete(limits = factor(min(range(df$Trip)):max(range(df$Trip)))) &amp; 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() 时出现问题

R语言高维数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()姐妹花

Facet_wrap 未按其值正确排序图