Как сгруппировать сложенные значения в geom_histogram, используя R? - PullRequest
0 голосов
/ 24 февраля 2020

Я использую geom_histogram в R для создания гистограммы, используя код:

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

enter image description here

Фрейм данных 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 , например, в корзине 0 у вас есть столбец с накоплением: Женский - Все события и Мужской - Все события и затем один и тот же столбец с накоплением в binn 1 et c. Для дальнейшего разъяснения мне бы хотелось, чтобы Женский - Клинические события и Мужской - Клинические события как один столбец с накоплением также на полках. Таким образом, каждый столбец суммированных значений имеет общее значение Group (Все, Клиническое, Направление и Терапия).

Дальнейшее пояснение: в бункере 0 будут следующие стеки столбцов (организованные Group в data.frame):

Female - All events & Male - All events
Female - Clinical events & Male - Clinical events
Female - Referral events & Male - Referral events
Female - Therapy events & Male - Therapy events

Тогда для бина 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

Помощь очень ценится.

1 Ответ

2 голосов
/ 24 февраля 2020

А как насчет огранки графа с помощью столбца "Группа", например:

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

enter image description here

РЕДАКТИРОВАТЬ: упростить легенду

Чтобы упростить легенду, вы можете просто построить Муж и Женщину, используя 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")

enter image description here

Альтернативное использование 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)

enter image description here

Выглядит ли то, что вы пытаетесь достичь? Если нет, можете ли вы уточнить свой вопрос?


Примечание: пожалуйста, посмотрите на мой код, чтобы узнать, как правильно сделать 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 = " - ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...