强制堆叠条形图(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 创建