【问题标题】:ggplot summarizing boxplotggplot总结箱线图
【发布时间】:2021-11-10 13:59:33
【问题描述】:

很遗憾,我的 ggplot 有问题。

这是我的数据框的一个子集:

Name <- c('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', '17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32')
Gruppe <-c('A','A','B','B','C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',  'C',  'C', 'C','A','A','B','B','C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',  'C',  'C', 'C')
Group <-c('A','A','B','B','CA','CA','GE','GE','SA','SA','ST','ST','STR','STR','WA','WA')
Location <-c('CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF','CO','UF')
Value <-c(3.5,6.6,1.9,9.2,5.2,4.4,6.8,3.2,2.7,7.1,4.3,9.8,4,8.3,5,6.1,3,8.4,4.8,9.1,1.4,4,8.9,3.6,4,8.4,6.1,2.5,4.5,9.3,6.7,4.6)

data <- data.frame(Name, Gruppe, Group, Location, Value)

我想用根据“组”分隔的 ggplot 来绘制它。 我的代码:

ggplot(data, aes(x=Location, y=Value, fill=Group)) +
  geom_boxplot()+
  scale_color_brewer(palette="Paired")+
  theme_classic()+
  scale_fill_manual(values=c("chartreuse3", "yellow2",
                             "firebrick3", "cyan4","darkgoldenrod2","darkorange4","darkgreen","deeppink3","darksalmon"))

但是,我还想在“Gruppe”中添加“C”作为应显示在图例中的附加箱线图,总结“CA”-“WA”中的“组”。有什么办法吗?最好在不改变数据集本身的情况下,它的原始形式很大。箱线图应该在“A”和“B”旁边并且看起来相同,即宽度。

示例图片(外观很抱歉): enter image description here

感谢大家的帮助,如有遗漏我会尽力解释。

【问题讨论】:

  • 不是对您问题的回答,但如果您只有两个位置,我建议您查看 +facet_wrap(~Location),并在 x 轴上使用 Group。在 x 轴上使用 Location 可能会更好看。

标签: r ggplot2 plot boxplot diagram


【解决方案1】:

@Peter 哇哦,你做到了!太感谢了!我很想按原样使用您的解决方案,但在原始数据集中我有六个位置。使用 facet wrap 会有点矫枉过正。我设法稍微更改了您的代码:

ggplot(data1, aes(x = Location, y = PH1, fill = grp_id)) +
geom_boxplot() +
theme_classic()+
scale_x_discrete(expand = expansion(add = c(0.5, 0.7)))+
scale_y_continuous(expand = expansion(mult = c(0.02, 0.08)))+
scale_color_brewer(palette = "Paired")+
scale_fill_manual(values=c("chartreuse3", "yellow2",
                         "firebrick3", "cyan4","darkgoldenrod2","darkorange4",
                         "darkgreen","deeppink3","darksalmon", "red", "green"))

【讨论】:

    【解决方案2】:

    根据您有很大帮助的草图,这可能是一个解决方案。 数据以长格式准备,过滤掉GroupA和B,因为它们在Gruppe中重复。 组合的grp 变量“Group”和“Gruppe”的值被制成一个因子,因此它们在刻面时以正确的顺序绘制。 为Group 和Gruppe ids 准备了一个单独的标签数据框,以便ids 可以位于箱线图的最大值处。 编辑图表的输入参数以获得视觉效果,以确保标签有空间并且箱形图的宽度相同。

    library(ggplot2)
    library(dplyr)
    library(tidyr)
    library(stringr)
    
    data1 <- 
      data %>% 
      pivot_longer(cols = c(Gruppe, Group), names_to = "grp", values_to = "grp_id") %>% 
      filter(grp != "Group" | !grp_id %in% c("A", "B")) %>% 
      mutate(grp = factor(grp, levels = c("Gruppe", "Group")))
    
    lab_group <- 
      data1 %>%
      group_by(Location, grp_id) %>% 
      filter(Value == max(Value))
    
    
    ggplot(data1, aes(x = grp_id, y = Value, fill = grp_id)) +
      geom_boxplot() +
      geom_text(data = lab_group, aes(label = grp_id), vjust = -0.2, hjust = -0.2 )+
      scale_x_discrete(expand = expansion(add = c(0.5, 0.7)))+
      scale_y_continuous(expand = expansion(mult = c(0.02, 0.08)))+
      scale_color_brewer(palette = "Paired")+
      scale_fill_manual(values=c("chartreuse3", "yellow2",
                                 "firebrick3", "cyan4","darkgoldenrod2","darkorange4",
                                 "darkgreen","deeppink3","darksalmon", "red", "green"))+
      facet_grid(Location~grp,
                 space = "free_x",
                scales = "free_x")+
      theme_bw()+
      theme(legend.position = "none",
            axis.text.x = element_blank(),
            axis.ticks.x = element_blank(),
            axis.title.x = element_blank())
    

    由reprex package (v2.0.0) 于 2021-09-16 创建

    【讨论】:

    • 感谢您的回答。我想我的描述很混乱,尤其是样本数据集及其名称。 CA-WA 组不是一个位置,而是属于整体“Gruppe”(德语单词对不起)C 的植物品种。我只想单独绘制它们,但也总结在每个位置 CO 的“Gruppe”中和UF。在这一点上,我不确定 ggplot 是否可以实现这一点......我试图包含一个示例图片,请原谅我的 Photoshop 技能。
    • 草图很有帮助,请参阅更新的答案。
    【解决方案3】:

    这仍然会(临时)重复数据,如果您想避免这种情况,我看到的唯一方法是预先计算基本数据集和 Gruppe == "C" 子集的箱线图美学。

    geom_boxplot(
      data = . %>% union_all(., filter(., Gruppe == "C") %>% mutate(Group = "C"))
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多