r - 如何使用 R 对 geom_histogram 中的堆叠值进行分组?
问题描述
我在 R 中使用 geom_histogram 使用代码生成直方图:
ggGender <- ggplot(dfGenderGrouped, aes(log(freq), fill=dfGenderGrouped$name) ) +
geom_histogram(data=dfGenderGrouped, binwidth = 1, alpha=0.5, color="black") + theme_bw() +
theme(axis.title = element_text(size=16), legend.text = element_text(size=12), axis.text.y = element_text(size=12, angle=45), axis.text.x = element_text(size=12), legend.position=c(0.8,0.7)) + ylab("Number of patients") +
xlab("Events (log)")+labs(fill="Events") + scale_y_continuous(labels = comma) +
scale_fill_brewer(palette="Spectral")
dfGenderGrouped 数据框如下所示:
patid freq name Group
1 1156 1 Male - All events All
2 1194 1 Male - All events All
3 1299 1 Male - All events All
4 1445 1 Male - All events All
5 1476 2 Male - All events All
6 2045 2 Male - All events All
要命名的唯一值显示在图例中。Group的独特价值是:
> unique(dfGenderGrouped$Group)
[1] "All" "Clinical" "Referral" "Therapy"
我想按Group值组织堆栈,例如,在 bin 0 中,您有一个堆叠列女性 - 所有事件和男性 - 所有事件,然后在 binn 1 等中具有相同的堆叠列。为了进一步澄清,我想女性 - 临床事件和男性 - 临床事件作为单个堆叠列也横跨垃圾箱。因此,堆叠值的每一列都具有共同的组值(所有、临床、转诊和治疗)。
进一步说明,bin 0 将具有以下列堆栈(由data.frame 中的Group组织):
Female - All events & Male - All events
Female - Clinical events & Male - Clinical events
Female - Referral events & Male - Referral events
Female - Therapy events & Male - Therapy events
然后对于 bin 1 相同:
Female - All events & Male - All events
Female - Clinical events & Male - Clinical events
Female - Referral events & Male - Referral events
Female - Therapy events & Male - Therapy events
非常感谢您的帮助。
解决方案
如何使用“组”列对图表进行分面,例如:
library(ggplot2)
ggplot(data = df, aes(log(Freq), fill = Name))+
geom_histogram(binwidth = 1, alpha = 0.5,color = "black")+
facet_wrap(.~Group,nrow = 1, scales = "fixed")+
labs(x = "Events (log)", y = "Number of patients", fill="Events") +
scale_fill_brewer(palette="Spectral")
编辑:简化图例
为了简化图例,您可以使用 绘制男性和女性facet_wrap
,您需要编辑“姓名”列以删除字符串的所有正确部分并仅保留男性/女性面额
df$Name <- sub("-.*","",df$Name))
ggplot(data = df, aes(log(Freq), fill = Name))+
geom_histogram(binwidth = 1, alpha = 0.5,color = "black")+
facet_wrap(.~Group,nrow = 1, scales = "fixed")+
labs(x = "Events (log)", y = "Number of patients", fill="Events") +
scale_fill_brewer(palette="Spectral")
替代使用grid.arrange
grid.arrange
或者,您可以使用包中的函数创建 4 个图并将它们排列在一个图形上gridExtra
。像这样,每个情节都有一个图例:
library(gridExtra)
ALL <- ggplot(data = subset(df, Group == "ALL"), aes(log(Freq), fill = Name))+
geom_histogram(binwidth = 1, alpha = 0.5,color = "black")+
labs(x = "Events (log)", y = "Number of patients", fill="Events", title = "ALL") +
scale_fill_brewer(palette="Spectral")+
scale_x_continuous(limits = c(4,9), breaks = 4:9)+
theme_bw()+
theme(legend.position=c(0.3,0.7),
legend.text = element_text(size=8),
legend.title = element_text(size = 8))
Clin <- ggplot(data = subset(df, Group == "Clin"), aes(log(Freq), fill = Name))+
geom_histogram(binwidth = 1, alpha = 0.5,color = "black")+
labs(x = "Events (log)", y = "Number of patients", fill="Events", title = "Clinical") +
scale_fill_brewer(palette="Spectral")+
scale_x_continuous(limits = c(4,9), breaks = 4:9)+
theme_bw()+
theme(legend.position=c(0.3,0.7),
legend.text = element_text(size=8),
legend.title = element_text(size = 8))
Ref <- ggplot(data = subset(df, Group == "Ref"), aes(log(Freq), fill = Name))+
geom_histogram(binwidth = 1, alpha = 0.5,color = "black")+
labs(x = "Events (log)", y = "Number of patients", fill="Events", title = "Ref") +
scale_fill_brewer(palette="Spectral")+
scale_x_continuous(limits = c(4,9), breaks = 4:9)+
theme_bw()+
theme(legend.position=c(0.3,0.7),
legend.text = element_text(size=8),
legend.title = element_text(size = 8))
Ther <- ggplot(data = subset(df, Group == "Ther"), aes(log(Freq), fill = Name))+
geom_histogram(binwidth = 1, alpha = 0.5,color = "black")+
labs(x = "Events (log)", y = "Number of patients", fill="Events", title = "Ther") +
scale_fill_brewer(palette="Spectral")+
scale_x_continuous(limits = c(4,9), breaks = 4:9)+
theme_bw()+
theme(legend.position=c(0.3,0.7),
legend.text = element_text(size=8),
legend.title = element_text(size = 8))
grid.arrange(nrow = 1, ALL, Clin, Ref, Ther)
它看起来是你想要达到的吗?如果没有,你能澄清你的问题吗?
注意:请查看我的代码以了解如何正确制作ggplot2
图表,例如,一旦您使用 声明了数据框data =
,您就不再需要 $ 来设计列名。
可重现的例子:
df <- data.frame(Group = rep(c("ALL","Clin","Ref","Ther"),each = 50),
Name = rep(rep(c("M","F"), each = 25),4),
Freq = sample(1:10000,200, replace = TRUE),
Patient = sample(1000:5000,200,replace = TRUE))
df$Name = paste(df$Name,df$Group,sep = " - ")
推荐阅读
- excel-formula - 如何根据其他条件排除数据
- mongodb - 在java中使用聚合管道转换mongo更新查询
- reactjs - TypeError:无法读取未定义的属性“twoArgumentPooler”
- javascript - 正则表达式提取 [方括号] 内的内容,但不提取 [[wiki-links]]
- python - 从类中的函数访问变量
- reactjs - 在异步函数结束之前调用 React setState
- python - 使用 discord.py 在频道中检索先前发送的消息的命令
- xamarin.ios - 如何在 xamarin.iOS 中为 UILable programaticalli 提供填充
- python-3.x - FastAPI 中嵌套模型的正确方法
- woocommerce - Woocommerce 等额存款三部分付款,解决方案