使用ggolot2创建堆叠的条形图,其中百分比基于字符串

时间:2018-08-23 14:02:38

标签: r ggplot2 visualization

library(data.table)
library(ggplot2)
mock_data <- data.table(person_1 = c(0, 0, 0, 0, 1, 1, 1, 1), 
                        person_2 = c(1, 2, 3, 4, 1, 2, 3, 4), 
                        n = c(500, 607, 809, 120, 230, 12, 15, 80)
                       )

 person_1 person_2   n

       0    1       500
       0    2       607
       0    3       809
       0    4       120
       1    1       230
       1    2       12
       1    3       15
       1    4       80

对于mock_datan表示person_1person_2的组合存在的次数。例如,person_1 = 0person_2 = 1的组合存在n = 500次。

我想制作一个小节,其中每个小节都显示person_1person_2之间的细目。

我尝试了一个堆叠的barplot,但是由于0 + 1 = 1不等于500,我得到了一个错误。

编辑: 我想得到什么 enter image description here

我现在有什么

mock_data_2 <- mock_data %>%
+    mutate(person_combination = paste(person_1, person_2, sep = ", "))

ggplot(mock_data_2, aes(x=person_combination, y=n)) + 
    geom_bar(stat="identity", width=.5, fill="tomato3")

enter image description here

1 个答案:

答案 0 :(得分:1)

这是一个主意。我们可以先使用data.table包来计算百分比,然后将其绘制为堆积的条形图。

mock_data[, Percent := n/sum(n) * 100, by = person_1]

ggplot(mock_data, aes(x = factor(person_1), y = Percent, fill = factor(person_2))) +
  geom_bar(stat = "identity") +
  scale_x_discrete(name = "person_1") +
  scale_fill_viridis_d(name = "person_2") +
  theme_classic()

enter image description here

更新

这是基于OP的新信息的更新。

mock_data[, person_1_num := person_1/(person_1 + person_2) * n]
mock_data[, person_2_num := person_2/(person_1 + person_2) * n]
mock_data[, person_combination := paste(person_1, person_2, sep = "_")]
mock_data2 <- melt(mock_data, id.vars = c("person_combination"),
                   measure.vars = c("person_1_num", "person_2_num"))

ggplot(mock_data2, aes(x = person_combination, y = value, fill = variable)) +
  geom_bar(stat = "identity") +
  theme_classic()

enter image description here