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_data
,n
表示person_1
和person_2
的组合存在的次数。例如,person_1 = 0
和person_2 = 1
的组合存在n = 500
次。
我想制作一个小节,其中每个小节都显示person_1
和person_2
之间的细目。
我尝试了一个堆叠的barplot,但是由于0 + 1 = 1
不等于500
,我得到了一个错误。
我现在有什么
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")
答案 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()
更新
这是基于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()