Ggplot:如何按给定顺序显示箱线图?
Ggplot: how to show boxplots in a given order?
我在给定 x 轴的特定顺序排列箱线图时遇到一个特殊问题,因为我在同一图中添加来自不同数据帧的两个箱线图,每次我添加第二个 geom_boxplot,R按字母顺序重新排列我的 x 轴,而不是按照 factor(x) 的有序水平排序。
所以,我有两个不同长度的数据框,看起来像这样:
df1:
id value
1 A 1
2 A 2
3 A 3
4 A 5
5 B 10
6 B 8
7 B 1
8 C 3
9 C 7
df2:
id value
1 A 4
2 A 5
3 B 6
4 B 8
df1 中每个 id 的观察值总是比 df2 中的多,并且 df1 中有一些 id 在 df2 中不可用。
我希望 df1 按中位数(值)(升序)排序,并首先按该顺序为每个 id 绘制箱线图。
然后,我为 df2 中每个 id 的所有其他测量添加了带有箱线图的第二层,它应该在 x 轴上保持相同的顺序。
以下是我的处理方式:
vec <- df %>%
group_by(id) %>%
summarize(m = median(value)) %>%
arrange(m) %>%
pull(id)
p1 <- df1 %>%
ggplot(aes(x = factor(id, levels = vec), y = value)) +
geom_boxplot()
p1
p2 <- p1 +
geom_boxplot(data = df2, aes(x = factor(id, levels = vec), y = value))
p2
p1 显示正确的顺序(ids 根据中位数升序排列),p2 总是取消我的顺序并返回按字母顺序绘制 ids(我的 id 实际上是一个带有名称的字符列)。我尝试使用示例数据框,上面的代码实现了所需的功能。因此,我不确定我的数据可能有什么特别错误,因此代码在应用于特定数据而不是上述模拟数据时会失败。
有什么想法吗?
非常感谢!
如果我没理解错的话,这应该可以。
library(tidyverse)
# Sample data
df1 <-
tibble(
id = c("A","A","A","A","B","B","B","C","C"),
value = c(1,2,3,5,10,8,1,3,7),
type = "df1"
)
df2 <-
tibble(
id = c("A","A","B","B"),
value = c(4,5,6,8),
type = "df2"
)
df <-
# Create single data.frame
df1 %>%
bind_rows(df2) %>%
# Reorder id by median(value)
mutate(id = fct_reorder(id,value,median))
df %>%
ggplot(aes(id, y = value, fill = type)) +
geom_boxplot()
我在给定 x 轴的特定顺序排列箱线图时遇到一个特殊问题,因为我在同一图中添加来自不同数据帧的两个箱线图,每次我添加第二个 geom_boxplot,R按字母顺序重新排列我的 x 轴,而不是按照 factor(x) 的有序水平排序。 所以,我有两个不同长度的数据框,看起来像这样:
df1:
id value
1 A 1
2 A 2
3 A 3
4 A 5
5 B 10
6 B 8
7 B 1
8 C 3
9 C 7
df2:
id value
1 A 4
2 A 5
3 B 6
4 B 8
df1 中每个 id 的观察值总是比 df2 中的多,并且 df1 中有一些 id 在 df2 中不可用。
我希望 df1 按中位数(值)(升序)排序,并首先按该顺序为每个 id 绘制箱线图。 然后,我为 df2 中每个 id 的所有其他测量添加了带有箱线图的第二层,它应该在 x 轴上保持相同的顺序。 以下是我的处理方式:
vec <- df %>%
group_by(id) %>%
summarize(m = median(value)) %>%
arrange(m) %>%
pull(id)
p1 <- df1 %>%
ggplot(aes(x = factor(id, levels = vec), y = value)) +
geom_boxplot()
p1
p2 <- p1 +
geom_boxplot(data = df2, aes(x = factor(id, levels = vec), y = value))
p2
p1 显示正确的顺序(ids 根据中位数升序排列),p2 总是取消我的顺序并返回按字母顺序绘制 ids(我的 id 实际上是一个带有名称的字符列)。我尝试使用示例数据框,上面的代码实现了所需的功能。因此,我不确定我的数据可能有什么特别错误,因此代码在应用于特定数据而不是上述模拟数据时会失败。 有什么想法吗?
非常感谢!
如果我没理解错的话,这应该可以。
library(tidyverse)
# Sample data
df1 <-
tibble(
id = c("A","A","A","A","B","B","B","C","C"),
value = c(1,2,3,5,10,8,1,3,7),
type = "df1"
)
df2 <-
tibble(
id = c("A","A","B","B"),
value = c(4,5,6,8),
type = "df2"
)
df <-
# Create single data.frame
df1 %>%
bind_rows(df2) %>%
# Reorder id by median(value)
mutate(id = fct_reorder(id,value,median))
df %>%
ggplot(aes(id, y = value, fill = type)) +
geom_boxplot()