我想繪制堆疊條形圖,并添加顯示整體集大小的線圖。我在 ggplot2 中繪制堆疊條形圖沒有問題,但是具有不同 y 軸的附加線是困難的。我使用長格式表作為輸入,所以沒有“整體大小”列。
重現示例表的代碼:
df <- data.frame(Sample=c("S1","S2","S3","S4","S5","S6"), A=c(30,52,50,81,23,48), B=c(12,20,15,22,30,14), C=c(rep(15,6)))
df.melt <- melt(setDT(df), id.vars = "Sample", variable.name = "Group")
表頭:
Sample Group value
1: S1 A 30
2: S2 A 52
3: S3 A 50
4: S4 A 81
5: S5 A 23
6: S6 A 48
繪制堆疊條形圖的代碼:
ggplot(df.melt, aes(x = Sample, y = value, fill = Group))
geom_col(position = position_fill(reverse = TRUE))
theme(axis.text.x=element_text(angle=45, hjust=1), legend.title=element_blank())
scale_fill_brewer(palette="Set3")
ylab("% of Total")
scale_y_continuous(labels = percent)
scale_x_discrete(limits = unique(df.melt$Sample))
因此,這條線將穿過六個堆疊的條形圖,指向每個集合的大小,即對于樣本 S1,它將是 57 (A B C),并且圖右側的 y 軸標簽將顯示集合大小范圍。

uj5u.com熱心網友回復:
可以直接把資料集放到geom中。這允許您為每個幾何圖形使用不同的資料集。輔助軸有點棘手。它們需要是主軸的函式,并相應地調整資料。我使用 120 作為調整因子。

percent <- c("0%", "25%", "50%", "75%", "100%")
set_sizes <- df %>%
rowwise %>%
mutate(Size = sum(A, B, C))
ggplot()
geom_col(df.melt, mapping = aes(x = Sample, y = value, fill = Group),position = position_fill(reverse = TRUE))
geom_line(set_sizes, mapping = aes(x = Sample, y = Size / 120, group = 1))
scale_y_continuous(name = "% of Total", labels = percent, sec.axis = sec_axis(~ .*120, name = "Sample Size"))
theme(axis.text.x=element_text(angle=45, hjust=1), legend.title=element_blank())
scale_fill_brewer(palette="Set3")
scale_x_discrete(limits = unique(df.melt$Sample))
uj5u.com熱心網友回復:
或者,您可以使用cowplot將兩個獨立的圖相互疊加,例如:
suppressMessages(invisible(lapply(c("data.table", "ggplot2", "cowplot"),
require, character.only=TRUE)))
df <- data.table(Sample=c("S1","S2","S3","S4","S5","S6"),
A=c(30,52,50,81,23,48), B=c(12,20,15,22,30,14), C=c(rep(15,6)))
df.melt <- melt(df, id.vars = "Sample", variable.name = "Group")
percent <- paste0(sprintf("%s", seq(0, 100, 25)), "%")
p1 <- ggplot(df.melt, aes(x = Sample, y = value, fill = Group))
geom_col(position = position_fill(reverse = TRUE))
theme(axis.text.x=element_text(angle=45, hjust=1), legend.title=element_blank())
scale_fill_brewer(palette="Set3")
ylab("% of Total")
scale_y_continuous(labels = percent)
scale_x_discrete(limits = unique(df.melt$Sample))
p2 <- ggplot(df.melt[, .(value=sum(value)), by="Sample"],
aes(x = Sample, y = value, group=1))
geom_line()
scale_x_discrete(labels = NULL, breaks = NULL)
labs(x = NULL)
plot_grid(p2, NULL, p1, align="hv", nrow=3, axis='tlbr', rel_heights=c(1, -.28, 4), greedy=FALSE)

由reprex 包于 2022-02-20 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/430662.html
上一篇:將更多資料添加到其他df的熱圖中
