А как насчет огранки графа с помощью столбца "Группа", например:
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
В качестве альтернативы, вы можете создать 4 участка и расположите их на одной фигуре, используя функцию grid.arrange
из пакета 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 = " - ")