r - 第 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")
当我在重新排序后绘制这些数据时,每个条形图都没有按我预期的值排序。更奇怪的是,在我的真实数据集中,第一个条的顺序正确,但后面的条没有。关于为什么这不起作用的任何想法?
谢谢!
解决方案
这个怎么样,我认为这就是你所追求的......
诀窍是利用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 创建
推荐阅读
- java - 使用 SimpleDateFormat 类解析 2020-02-29T18:21:13.2627230Z 的正确模式
- r - 将数据框转换为命名的数据框列表,其名称来自 R 中的列
- postgresql - PostgreSQL TRIGGER on WITH (UPDATE ..)UPDATE 在 2 个表上
- node.js - 服务器仍在运行时,typeorm db 连接挂起
- javascript - Chartkick-vue 条形图-“horizontalBar”不是注册控制器
- linux - 将 netcore 3 应用程序发布到树莓派 3(32 位/x86)
- gatsby - 禁用客户端路由
- c# - 如何使用 C# 以编程方式将 RTF 文本插入 PowerPoint 文本框架?
- c# - 使用 Lamar DI 容器,如何使用给定类型的 lambda 构建对象?
- python - 如何获取 S3 存储桶中所有不同前缀的列表?