如何使用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排列的不同方面添加水平线?的主要内容,如果未能解决你的问题,请参考以下文章