首页 > 解决方案 > 第 2 部分:如何在 ggplot 的条形图上按值正确排序段

问题描述

所以我以为我的问题已经用我之前的问题得到了回答,但是很遗憾,有些东西仍然无法正常工作。我想知道我的数据结构中是否有一些我丢失的东西,因为我之前关于假数据的问题有效。

这是一个新的可重现示例,其中的虚拟数据更接近地复制了我的数据集和我的问题。我的问题是如何按值对条形图的每个条形内的段进行排序(底部条形图中的最大值,顶部的最小值)。

library(dplyr)

repro_df <- structure(list(Grp = structure(c(5L, 7L, 2L, 3L, 8L, 7L, 10L, 
                                             4L, 4L, 3L, 2L, 2L, 3L, 8L, 9L, 3L, 3L, 6L, 6L, 5L, 6L, 8L, 4L, 
                                             11L, 5L, 1L, 10L, 8L, 1L, 6L, 3L, 1L, 1L, 9L, 5L, 3L, 5L, 4L, 
                                             5L, 5L, 2L, 1L, 9L, 4L, 5L, 10L, 6L, 8L, 3L, 6L, 2L, 6L, 4L, 
                                             7L, 2L, 8L, 9L, 9L, 10L, 5L, 1L, 9L, 1L, 5L, 2L, 8L, 8L, 3L, 
                                             3L, 10L, 7L, 6L, 9L, 2L, 9L, 7L, 1L, 1L, 9L, 1L, 11L, 10L, 9L, 
                                             3L, 7L, 2L, 4L, 7L, 6L, 6L, 4L, 8L, 5L, 5L, 7L, 10L, 8L, 3L, 
                                             6L, 3L, 10L, 10L, 7L, 8L, 9L, 8L, 5L, 7L, 3L, 10L, 11L, 7L, 4L, 
                                             10L, 3L, 8L, 5L, 3L, 5L, 4L, 3L, 10L, 7L, 3L, 4L, 9L, 2L, 3L, 
                                             2L, 1L, 8L, 11L, 2L, 1L, 7L), .Label = c("0", "1", "2", "3", 
                                                                                      "4", "5", "6", "7", "8", "9", "10"), class = "factor"), Segment = structure(c(1L, 
                                                                                                                                                                    2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
                                                                                                                                                                    3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
                                                                                                                                                                    1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
                                                                                                                                                                    2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
                                                                                                                                                                    3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
                                                                                                                                                                    1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
                                                                                                                                                                    2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
                                                                                                                                                                    3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
                                                                                                                                                                    1L, 2L, 3L, 1L, 2L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
                           Value = c(914, NA, NA, 228, NA, NA, NA, 207, NA, 179, NA, 
                                     NA, 149, NA, NA, 135, NA, NA, NA, 109, NA, NA, 105, NA, NA, 
                                     101, NA, 100, NA, NA, NA, 98, NA, 96, NA, NA, 87, NA, NA, 
                                     77, NA, NA, 74, NA, NA, 57, NA, NA, 49, NA, NA, 35, NA, NA, 
                                     31, NA, NA, 25, NA, NA, NA, 25, NA, NA, 21, NA, 18, NA, NA, 
                                     16, NA, NA, 8, NA, NA, 7, NA, NA, 7, NA, NA, 5, NA, NA, NA, 
                                     NA, 4, NA, NA, 0, 0, NA, NA, 0, NA, NA, 0, NA, NA, NA, NA, 
                                     0, 0, NA, NA, NA, NA, 0, 0, NA, NA, 0, NA, NA, NA, NA, 0, 
                                     NA, NA, 0, NA, NA, 0, 0, NA, NA, NA, 0, NA, NA, NA, 0, NA, 
                                     NA, 0)), class = "data.frame", row.names = c(NA, -135L))

# Reorder the data frame
repro_order_df <- repro_df %>% 
  group_by(Segment) %>% 
  mutate(Grp = fct_reorder(Grp, Value))

head(repro_order_df, 10)
# A tibble: 10 x 3
# Groups:   Segment [3]
   Grp   Segment Value
   <fct> <fct>   <dbl>
 1 4     A         914
 2 6     B          NA
 3 1     C          NA
 4 2     A         228
 5 7     B          NA
 6 6     C          NA
 7 9     A          NA
 8 3     B         207
 9 3     C          NA
10 2     A         179

# Plot
ggplot(repro_order_df, aes(x=Segment, y=Value, fill=Grp)) +
  geom_col(color = "black")

当我在重新排序后绘制这些数据时,每个条形图都没有按我预期的值排序。更奇怪的是,在我的真实数据集中,第一个条的顺序正确,但后面的条没有。关于为什么这不起作用的任何想法? 阴谋

谢谢!

标签: rggplot2dplyr

解决方案


这个怎么样,我认为这就是你所追求的......

诀窍是利用group美学结合额外的分组变量来控制绘图顺序并使用Grp变量来控制填充颜色。


library(dplyr)
library(ggplot2)
library(forcats)

选项 1) 按值顺序显示合并的组

创建一个新的分组变量以按段和组大小对组进行排序


repro_order_df <- 
  repro_df %>% 
  group_by(Segment, Grp) %>%
  summarise(Value = sum(Value, na.rm = TRUE)) %>% 
  ungroup() %>% 
  group_by(Segment) %>% 
  arrange(Value) %>% 
  mutate(g = row_number()) 

p1 <- 
  ggplot(repro_order_df, aes(x = Segment, y = Value, group = g, fill = Grp)) +
  geom_col(color = "black") +
  ggtitle("p1 grouped by Grp") +
  theme(legend.position = "bottom")

选项 2) 按值顺序显示组,其中单个组值首先堆叠最大

创建一个新的分组变量以按段和组大小和组内的值对组进行排序

repro_order_df1 <- 
  repro_df %>% 
  group_by(Segment, Grp) %>%
  mutate(Value_g = sum(Value, na.rm = TRUE)) %>% 
  ungroup() %>% 
  group_by(Segment) %>% 
  arrange(Value_g, Value) %>% 
  mutate(g = row_number()) 


p2 <- 
  ggplot(repro_order_df1, aes(x = Segment, y = Value, group = g, fill = Grp)) +
  geom_col(color = "black") +
  ggtitle("p2 grouped by Grp and Value") +
  theme(legend.position = "bottom")

哪个给你:

reprex 包(v0.3.0)于 2020-05-16 创建


推荐阅读