强制堆叠条形图(ggplot 显示百分比,零小数位)中的 bars/rows 具有相同的长度?
Force bars/rows in stacked bar chart (ggplot showing percent, zero decimal places) to be of same lenght?
我是 R 的新手,我需要创建一个堆叠条形图,它显示条形(堆叠)内的百分比,并且从 0% 到 100%。我有超过 7000 行和 12 个向量,范围从值 1 到 5(值 9999 将被排除在图表之外)。对于每个矢量,我计算了 5 个值的百分比,因此图表中的每个条形总和应为 100%。
我遇到的问题是:两个向量之和为 99%,一个向量之和为 101%,而其余向量之和为 100,如预期的那样。因此,该图表有两个 bars/rows 稍短一点,一个 bar/row 比其余条形稍长。如果我四舍五入到小数点后 1 位或 2 位,而不是要求小数点后 0 位(不幸的是,这是我必须做的),这个问题就会消失。
有没有办法强制 ggplot 显示相同长度 (100%) 的 bars/rows?
非常感谢任何帮助!
编辑!
我删除了我的数据和 ggplot 的两张图片。我制作了一个模拟我的数据的工作示例,并显示了当我要求 0 位小数时 bars/rows 的长度有何不同。
我很清楚这个问题可以通过要求小数点后一位来解决。我的雇主想要0,这就是为什么我希望为此找到解决方案。
library(reprex)
library(ggplot2)
library(tidyverse)
# Creating some data
item1 <- floor(runif(7200, min=1, max=6))
item2 <- floor(runif(7200, min=1, max=6))
item3 <- floor(runif(7200, min=1, max=6))
item4 <- floor(runif(7200, min=1, max=6))
item5 <- floor(runif(7200, min=1, max=6))
item6 <- floor(runif(7200, min=1, max=6))
item7 <- floor(runif(7200, min=1, max=6))
item8 <- floor(runif(7200, min=1, max=6))
item9 <- floor(runif(7200, min=1, max=6))
item10 <- floor(runif(7200, min=1, max=6))
item11 <- floor(runif(7200, min=1, max=6))
item12 <- floor(runif(7200, min=1, max=6))
df <- data.frame(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12)
# Drawing the ggplot with 0 (zero) decimal places
df %>%
gather %>%
group_by(key, value) %>%
tally %>%
mutate(n = round(n/sum(n)*100,0)) %>%
ggplot(aes(x=key, y=n, fill=as.factor(value))) +
geom_col(position = position_stack(reverse = T)) +
labs(title = "Some title", x = " ", y = "%", fill = " ") +
geom_text(aes(label=n), position=position_stack(reverse = TRUE, vjust = 0.5), size = 3, colour = "white") +
theme(legend.position="top") +
coord_flip() +
theme_minimal()
由 reprex package (v2.0.1)
于 2022-04-06 创建
解决您的问题的一个非常简单的方法是将 position = position_stack()
更改为 position = position_fill()
。
library(tidyverse)
library(scales)
# Creating some data
df <- data.frame(matrix(floor(runif(12*7200, 1, 6)), ncol = 12, dimnames = list(NULL, paste0("item", 1:12))))
# Drawing the ggplot with 0 (zero) decimal places
df %>%
gather %>%
group_by(key, value) %>%
tally %>%
mutate(n = round(n/sum(n) * 100, 0)) %>%
ggplot(aes(x = key, y = n, fill = as.factor(value))) +
geom_col(position = position_fill(reverse = T)) +
labs(title = "Some title", x = " ", fill = " ") +
scale_y_continuous(name = "%", labels = percent) +
geom_text(aes(label = n), position = position_fill(reverse = TRUE, vjust = 0.5), size = 3, colour = "white") +
theme(legend.position = "top") +
coord_flip() +
theme_minimal()
由 reprex package (v2.0.1)
于 2022-04-06 创建
我是 R 的新手,我需要创建一个堆叠条形图,它显示条形(堆叠)内的百分比,并且从 0% 到 100%。我有超过 7000 行和 12 个向量,范围从值 1 到 5(值 9999 将被排除在图表之外)。对于每个矢量,我计算了 5 个值的百分比,因此图表中的每个条形总和应为 100%。
我遇到的问题是:两个向量之和为 99%,一个向量之和为 101%,而其余向量之和为 100,如预期的那样。因此,该图表有两个 bars/rows 稍短一点,一个 bar/row 比其余条形稍长。如果我四舍五入到小数点后 1 位或 2 位,而不是要求小数点后 0 位(不幸的是,这是我必须做的),这个问题就会消失。
有没有办法强制 ggplot 显示相同长度 (100%) 的 bars/rows?
非常感谢任何帮助!
编辑!
我删除了我的数据和 ggplot 的两张图片。我制作了一个模拟我的数据的工作示例,并显示了当我要求 0 位小数时 bars/rows 的长度有何不同。
我很清楚这个问题可以通过要求小数点后一位来解决。我的雇主想要0,这就是为什么我希望为此找到解决方案。
library(reprex)
library(ggplot2)
library(tidyverse)
# Creating some data
item1 <- floor(runif(7200, min=1, max=6))
item2 <- floor(runif(7200, min=1, max=6))
item3 <- floor(runif(7200, min=1, max=6))
item4 <- floor(runif(7200, min=1, max=6))
item5 <- floor(runif(7200, min=1, max=6))
item6 <- floor(runif(7200, min=1, max=6))
item7 <- floor(runif(7200, min=1, max=6))
item8 <- floor(runif(7200, min=1, max=6))
item9 <- floor(runif(7200, min=1, max=6))
item10 <- floor(runif(7200, min=1, max=6))
item11 <- floor(runif(7200, min=1, max=6))
item12 <- floor(runif(7200, min=1, max=6))
df <- data.frame(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12)
# Drawing the ggplot with 0 (zero) decimal places
df %>%
gather %>%
group_by(key, value) %>%
tally %>%
mutate(n = round(n/sum(n)*100,0)) %>%
ggplot(aes(x=key, y=n, fill=as.factor(value))) +
geom_col(position = position_stack(reverse = T)) +
labs(title = "Some title", x = " ", y = "%", fill = " ") +
geom_text(aes(label=n), position=position_stack(reverse = TRUE, vjust = 0.5), size = 3, colour = "white") +
theme(legend.position="top") +
coord_flip() +
theme_minimal()
由 reprex package (v2.0.1)
于 2022-04-06 创建解决您的问题的一个非常简单的方法是将 position = position_stack()
更改为 position = position_fill()
。
library(tidyverse)
library(scales)
# Creating some data
df <- data.frame(matrix(floor(runif(12*7200, 1, 6)), ncol = 12, dimnames = list(NULL, paste0("item", 1:12))))
# Drawing the ggplot with 0 (zero) decimal places
df %>%
gather %>%
group_by(key, value) %>%
tally %>%
mutate(n = round(n/sum(n) * 100, 0)) %>%
ggplot(aes(x = key, y = n, fill = as.factor(value))) +
geom_col(position = position_fill(reverse = T)) +
labs(title = "Some title", x = " ", fill = " ") +
scale_y_continuous(name = "%", labels = percent) +
geom_text(aes(label = n), position = position_fill(reverse = TRUE, vjust = 0.5), size = 3, colour = "white") +
theme(legend.position = "top") +
coord_flip() +
theme_minimal()
由 reprex package (v2.0.1)
于 2022-04-06 创建