[英]stacked barplot of proportions in R ggplot2 grouped by levels of two factors
我有這種格式的數據框:
types year n_tot n_red n_blue f_red f_blue
1 A 2004 441 242 199 0.5487528 0.4512472
2 B 2004 267 147 120 0.5505618 0.4494382
3 C 2004 75 43 32 0.5733333 0.4266667
4 D 2004 48 25 23 0.5208333 0.4791667
5 E 2004 51 27 24 0.5294118 0.4705882
6 A 2008 673 318 355 0.4725111 0.5274889
7 B 2008 270 133 137 0.4925926 0.5074074
8 C 2008 75 38 37 0.5066667 0.4933333
9 D 2008 164 80 84 0.4878049 0.5121951
10 E 2008 164 67 97 0.4085366 0.5914634
生成數據框:
library(dplyr)
types <- LETTERS[1:5]
n_red_2004 <- c(242, 147, 43, 25, 27)
n_tot_2004 <- c(441, 267, 75, 48, 51)
n_red_2008 <- c(318, 133, 38, 80, 67)
n_tot_2008 <- c(673, 270, 75, 164, 164)
df_2004 <- data.frame(types, year = 2004, n_tot = n_tot_2004, n_red = n_red_2004)
df_2008 <- data.frame(types, year = 2008, n_tot = n_tot_2008, n_red = n_red_2008)
df <- rbind(df_2004, df_2008)
df$year <- as.factor(df$year)
df <- mutate(df, n_blue = n_tot - n_red, f_red = n_red/n_tot, f_blue = n_blue/n_tot)
對於每個級別的“類型”,我需要兩個條,對於每個級別的“年份”。 每個條形圖顯示類型/年份組合的紅色(n_red)與藍色(n_blue)比例(在數據框中由f_red和f_blue給出)的比例。 如何使用ggplot2
做到這ggplot2
?
據我所知,不能直接實現將躲避的條碼和堆疊的條碼結合起來,所以這是一種解決方法。
首先,使用軟件包tidyr
重塑數據:
df <- df %>%
select(-n_tot, -n_red, -n_blue) %>%
gather(f_group, f_val, f_red:f_blue) %>%
arrange(types)
然后,情節和使用facet_wrap
實現了“回避條形圖”看(從代碼此答案由AOSMITH):
ggplot(df) +
geom_bar(aes(x = interaction(types, year), y = f_val, fill = f_group),
position = "stack",
stat = "identity") +
scale_x_discrete(labels = rep(c(2004, 2008))) +
facet_wrap(~types, switch = "x", scales = "free_x", nrow = 1) +
theme(panel.margin = unit(0, "lines"),
strip.background = element_blank())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.