【问题标题】:Ggplot: how to show boxplots in a given order?Ggplot:如何以给定的顺序显示箱线图?
【发布时间】:2021-10-30 05:38:07
【问题描述】:

在给定 x 轴的特定顺序的情况下,我在安排箱线图时遇到了一个特殊问题,因为我在同一个图中添加了来自不同数据帧的两个箱线图,并且每次添加第二个 geom_boxplot 时,R 都会按字母顺序重新排列我的 x 轴因子(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(我的 ids 实际上是一个带有名称的字符列)。我尝试使用示例数据框,上面的代码实现了所需。因此,我不确定我的数据可能有什么特别错误,因此代码在应用于特定数据而不是上述模拟数据时会失败。 有什么想法吗?

提前非常感谢!

【问题讨论】:

  • 如果没有可重现的示例,只能猜测问题所在。您可以尝试按行绑定两个df,即尝试使用bind_rows(df1, df2, .id = "df") %&gt;% ggplot(aes(x = factor(id, levels = vec), y = value, group = interaction(id, df))) + geom_boxplot(position = "identity")
  • 嘿!感谢您的建议,我遵循了 Vinicius 的方法,它奏效了。下次我会确保我也发布一个可重现的例子。谢谢!

标签: r ggplot2 boxplot


【解决方案1】:

如果我理解正确,这应该有效。

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()

【讨论】:

  • 嘿!非常感谢您试一试,我会尝试一下。问题:当你bind_rows时,它会自动添加一个新列来区分类型吗? 2,如果我在将两者绑定在一起后订购 df,R 是否在每种类型中订购?问题是我只需要对 df1 中的中值(值)进行排序并按此顺序绘制 id,然后在订购 df1 后添加第二层(df2 的箱线图)保持 id 顺序,因为没有办法确定 id 的顺序在 df2 中(如果我们根据中值(值)排序)与 df1 的顺序相同。那有意义吗?非常感谢您的帮助!
  • 嘿!这对我有用!我首先订购了 df1,添加了一个名为 type (=df1) 的新列,在 df2 中添加了相同的“type”列但 type=df2,使用 bind_rows 将 df2 绑定到 df1,将 id 定义为带有级别 = 有序的有序因子来自 df1 的 ids 并按照您的建议使用 fill=type 绘制箱线图!非常感谢!
  • 我有一个问题。两种类型的异常值现在以相同的颜色显示。你知道我如何为每种类型的异常值定义两种不同的颜色吗?
  • 啊!在这里找到答案:stackoverflow.com/questions/8499378/…
猜你喜欢
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2020-12-30
  • 2021-03-14
  • 2014-08-23
相关资源
最近更新 更多