如何使用 R 对 geom_histogram 中的堆叠值进行分组?

How to group stacked values in geom_histogram using R?

我在 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

name 的唯一值显示在图例中。 Group 的唯一值是:

> unique(dfGenderGrouped$Group)
[1] "All"      "Clinical" "Referral" "Therapy"

我想按 Group 值组织堆栈,例如,在 bin 0 中,您有一个堆叠列 Female - All events 男性 - 所有事件 然后是 binn 1 中的相同堆叠列等。为了进一步说明,我想 女性 - 临床事件 男性 - 临床事件 作为单个堆积柱也跨箱。因此,堆叠值的每一列都具有 Group 共同值(全部、临床、转诊和治疗)。

进一步说明,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

非常感谢您的帮助。

如何使用“Group` 列对图表进行分面处理,例如:

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 绘制男性和女性,您需要编辑 "Name" 列以删除字符串的所有正确部分并仅保留男/女教派

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

或者,您可以使用 gridExtra 包中的 grid.arrange 函数创建 4 个绘图并将它们排列在一个图形上。这样,每个情节都有一个图例:

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