如何使用ggplot2在2x2排列的不同方面添加水平线?

Posted

技术标签:

【中文标题】如何使用ggplot2在2x2排列的不同方面添加水平线?【英文标题】:How to add horizontal lines in different facets for 2x2 arrangements using ggplot2? 【发布时间】:2021-06-14 06:36:07 【问题描述】:

我有一个按面绘制和分隔的数据库。第一行(a 行)的刻面需要 0.5 处的水平线,而第二行(b 行)的刻面需要 1 处的线。在this example 之后,我已经部分实现了我的目标。但是,0.5 和 1 处的水平线出现在所有方面。

library(ggplot2)

#Data
values <- c(0.4, 0.6, 0.9, 1.1)
Column <- c("UW", "LW", "UW", "LW")
Row <- c("a", "a", "b", "b")
DF <- data.frame(Row, Column, values)
DF$Column <- factor(DF$Column,
                 levels = c("UW", "LW"))
DF$Row <- factor(DF$Row,
                 levels = c("a", "b"))

#Auxiliar DF
Target <- c("a", "b")
Lines <- c(0.5, 1)
Lines_in_plot <- data.frame(Target, Lines)
Lines_in_plot$Target <- factor(Lines_in_plot$Target)

#Plot
ggplot(data = DF, aes(y = values)) +
  geom_bar() +
  facet_grid(Row~Column,
             scales = "free") +
  geom_hline(data = Lines_in_plot,
             yintercept = Lines,
             linetype = "dashed",
             color = "red")

此 MWE 运行但显示以下警告消息:

geom_hline(): Ignoring `data` because `yintercept` was provided.

【问题讨论】:

如果从 geom_hline 中减少 data=Lines_in_plot 部分会发生什么 修复了错误但没有修复分割线... 【参考方案1】:

这是您的解决方案:


library(ggplot2)

#Data
values <- c(0.4, 0.6, 0.9, 1.1)
Column <- c("UW", "LW", "UW", "LW")
Row <- c("a", "a", "b", "b")
DF <- data.frame(Row, Column, values)
DF$Column <- factor(DF$Column,
                 levels = c("UW", "LW"))
DF$Row <- factor(DF$Row,
                 levels = c("a", "b"))

#Auxiliar DF
Row <- c("a", "b")
Lines <- c(0.5, 1)
Lines_in_plot <- data.frame(Row, Lines)
Lines_in_plot$Row <- factor(Lines_in_plot$Row)

#Plot
ggplot(data = DF, aes(y = values)) +
  geom_bar() +
  facet_grid(Row~Column,
             scales = "free") +
  geom_hline(data = Lines_in_plot,
             aes(yintercept = Lines),
             linetype = "dashed",
             color = "red")

两个变化:

    将 y 截距融入美学 将目标重命名为 Row 以匹配 Facet,以便它知道如何处理它们

【讨论】:

【参考方案2】:

要让拦截显示在特定面板中,您需要将facet_grid 中引用的Row 作为Lines_in_plot 中的变量提供。您还需要将yintercept 放入aes 中,以便ggplot 知道为yintercept 引用Lines_in_plot 数据。

...
#Auxiliar DF
Row <- c("a", "b")
Lines <- c(0.5, 1)
Lines_in_plot <- data.frame(Row, Lines)
Lines_in_plot$Row <- factor(Lines_in_plot$Target)

#Plot
ggplot(data = DF, aes(y = values)) +
  geom_bar() +
  facet_grid(Row~Column,
             scales = "free") +
  geom_hline(data = Lines_in_plot,
             aes(yintercept = Lines),
             linetype = "dashed",
             color = "red")

【讨论】:

啊! @Jon Spring 和我有同样的解决方案,但打字速度更快!!

以上是关于如何使用ggplot2在2x2排列的不同方面添加水平线?的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2:方面的连续和离散比例

如何使用不同的几何图形将边际总计添加到 ggplot2 facet_grid 图

所有小提琴的相同区域独立于ggplot2中的方面

使用 ggarrange 添加行和列标题

ggplot2一页多图排版的简便方法

如何在使用 ggplot2 制作的图中最小化由 patchwork 包的 guide_area() 函数创建的空白?