首页 > 解决方案 > 如何使用 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

非常感谢您的帮助。

标签: rggplot2histogram

解决方案


如何使用“组”列对图表进行分面,例如:

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 = " - ")

推荐阅读