#r #dataframe #ggplot2 #ggalluvial
#r #dataframe #ggplot2 #ggalluvial
Вопрос:
Я пытаюсь построить аллювиальные графики с помощью ggplot. Пока все шло хорошо, пока я не хочу попытаться очистить график.
Как вы можете видеть на графике, слева направо, первый слой / столбец — это столбец идентификатора, за которым следует столбец меток: риск заболевания. Чего я хочу добиться, так это того, что на графике out вместо того, чтобы идентификаторы пациентов располагались зигзагообразно, я хочу, чтобы они были упорядочены по столбцу риска заболевания, чтобы все идентификаторы высокого риска были вместе сверху, за которыми следовал низкий риск, а затем не заполненные. Таким образом, гораздо проще увидеть, есть ли какие-либо отношения.
Я осмотрелся в поисках функций arrange() и order(), они, похоже, справляются с моими фактическими входными данными, но как только я передаю этот фрейм данных в ggplot, выходная цифра все еще зашифрована.
Я подумал о том, чтобы установить для идентификаторов значение factor, а затем использовать levels= …. Но это не очень разумно, если идентификатор пациента продолжает расти.
Есть ли более разумный способ? пожалуйста, просветите меня. Я прикрепил ссылку на образец данных.
https://drive.google.com/file/d/16Pd8V3MCgEHmZEButVi2UjDiwZWklK-T/view?usp=sharing
Мой код для построения графика :
library(tidyr)
library(ggplot2)
library(ggalluvial)
library(RColorBrewer)
# Define the number of colors you want
nb.cols <- 10
mycolor1 <- colorRampPalette(brewer.pal(8, "Set2"))(nb.cols)
mycolors <- c("Black")
#read the data
CLL3S.plusrec <- read.csv("xxxx.CSV", as.is = T)
CLL3S.plusrec$risk_by_DS <- factor(CLL3S.plusrec$risk_by_DS, levels = c("low_risk", "high_risk", "Not filled"))
CLL3S.plusrec$`Enriched response phenotype` <- factor(CLL3S.plusrec$`Enriched response phenotype`, levels = c("Live cells","Pre-dead", "TN amp; PDB", "PDB amp; Lenalidomide", "TN amp; STSVEN amp; Live cells","Mixed"))
#here I reorder the dataframe and it looks good
#but the output ggplot changes the order of ID in the output graph
OR <- with(CLL3S.plusrec, CLL3S.plusrec[order(risk_by_DS),])
d <-ggplot(OR, aes(y = count,
axis1= Patient.ID,
axis2= risk_by_DS,
axis3 = `Cluster assigned consensus`,
axis4 = `Cluster assigned single drug`,
axis5 = `Enriched response phenotype`
))
scale_x_discrete(limits = c("Patient ID","Disease Risk", "Consensus cluster", "Single-drug cluster", "Enriched drug response by Phenoptype"))
geom_alluvium(aes(fill=`Cluster assigned consensus`))
geom_stratum(width = 1/3, fill = c(mycolor1[1:69],mycolor1[1:3],mycolor1[1:8],mycolor1[1:8],mycolor1[1:6]), color = "red")
#geom_stratum()
geom_text(stat = "stratum", aes(label = after_stat(stratum)), size=3)
theme(axis.title.x = element_text(size = 15, face="bold"))
theme(axis.title.y = element_text(size = 15, face="bold"))
theme(axis.text.x = element_text(size = 10, face="bold"))
theme(axis.text.y = element_text(size = 10, face="bold"))
labs(fill = "Consensus clusters")
guides(fill=guide_legend(override.aes = list(color=mycolors)))
ggtitle("Patient flow between the Consensus clusters and Single-drug treated clusters",
"3S stimulated patients")
print(d)
Ответ №1:
Не уверен, что это то, что вы хотите, попробуйте отформатировать столбец risk таким образом:
library(tidyr)
library(ggplot2)
library(ggalluvial)
library(RColorBrewer)
# Define the number of colors you want
nb.cols <- 10
mycolor1 <- colorRampPalette(brewer.pal(8, "Set2"))(nb.cols)
mycolors <- c("Black")
#read the data
CLL3S.plusrec <- read.csv("test data.CSV", as.is = T)
CLL3S.plusrec$risk_by_DS <- factor(CLL3S.plusrec$risk_by_DS,
levels = c("high_risk","low_risk","Not filled"),ordered = T)
CLL3S.plusrec$Enriched.response.phenotype <- factor(CLL3S.plusrec$Enriched.response.phenotype, levels = c("Live cells","Pre-dead", "TN amp; PDB", "PDB amp; Lenalidomide", "TN amp; STSVEN amp; Live cells","Mixed"))
#here I reorder the dataframe and it looks good
#but the output ggplot changes the order of ID in the output graph
OR <- with(CLL3S.plusrec, CLL3S.plusrec[order(risk_by_DS),])
ggplot(OR, aes(y = count,
axis1= reorder(Patient.ID,risk_by_DS),
axis2= risk_by_DS,
axis3 = reorder(Cluster.assigned.consensus,risk_by_DS),
axis4 = reorder(Cluster.assigned.single.drug,risk_by_DS),
axis5 = reorder(Enriched.response.phenotype,risk_by_DS)
))
scale_x_discrete(limits = c("Patient ID","Disease Risk", "Consensus cluster", "Single-drug cluster", "Enriched drug response by Phenoptype"))
geom_alluvium(aes(fill=Cluster.assigned.consensus))
geom_stratum(width = 1/3, fill = c(mycolor1[1:69],mycolor1[1:3],mycolor1[1:8],mycolor1[1:8],mycolor1[1:6]), color = "red")
#geom_stratum()
geom_text(stat = "stratum", aes(label = after_stat(stratum)), size=3)
theme(axis.title.x = element_text(size = 15, face="bold"))
theme(axis.title.y = element_text(size = 15, face="bold"))
theme(axis.text.x = element_text(size = 10, face="bold"))
theme(axis.text.y = element_text(size = 10, face="bold"))
labs(fill = "Consensus clusters")
guides(fill=guide_legend(override.aes = list(color=mycolors)))
ggtitle("Patient flow between the Consensus clusters and Single-drug treated clusters",
"3S stimulated patients")
Вывод:
Также в моем read.csv()
случае кавычки сбились, а точки находятся в переменных. Вот почему ваши исходные переменные, заключенные в кавычки, теперь имеют точки. Возможно, проблема с чтением.
Обновить:
#Update
OR <- with(CLL3S.plusrec, CLL3S.plusrec[order(risk_by_DS),])
OR <- OR[order(OR$risk_by_DS,OR$Patient.ID),]
OR$Patient.ID <- factor(OR$Patient.ID,levels = unique(OR$Patient.ID),ordered = T)
#Plot
ggplot(OR, aes(y = count,
axis1= reorder(Patient.ID,risk_by_DS),
axis2= risk_by_DS,
axis3 = reorder(Cluster.assigned.consensus,risk_by_DS),
axis4 = reorder(Cluster.assigned.single.drug,risk_by_DS),
axis5 = reorder(Enriched.response.phenotype,risk_by_DS)
))
scale_x_discrete(limits = c("Patient ID","Disease Risk", "Consensus cluster", "Single-drug cluster", "Enriched drug response by Phenoptype"))
geom_alluvium(aes(fill=Cluster.assigned.consensus))
geom_stratum(width = 1/3, fill = c(mycolor1[1:69],mycolor1[1:3],mycolor1[1:8],mycolor1[1:8],mycolor1[1:6]), color = "red")
#geom_stratum()
geom_text(stat = "stratum", aes(label = after_stat(stratum)), size=3)
theme(axis.title.x = element_text(size = 15, face="bold"))
theme(axis.title.y = element_text(size = 15, face="bold"))
theme(axis.text.x = element_text(size = 10, face="bold"))
theme(axis.text.y = element_text(size = 10, face="bold"))
labs(fill = "Consensus clusters")
guides(fill=guide_legend(override.aes = list(color=mycolors)))
ggtitle("Patient flow between the Consensus clusters and Single-drug treated clusters",
"3S stimulated patients")
Вывод:
Комментарии:
1. Спасибо, что перезвонили мне. Во-первых, спасибо, что указали, почему мои переменные теперь имеют точки, меня это тоже раздражало. Что касается выходной цифры, я думаю, мы на верном пути. Тем не менее, я хотел, чтобы идентификаторы пациентов были по существу сгруппированы в соответствии с высоким / низким / не заполнены, поэтому я не должен видеть беспорядочных пересечений потока между идентификатором пациента и уровнем риска заболевания, но 3 толстых непересекающихся горизонтальных потока.
2. @ML33M Теперь я вижу, что упорядочивание может быть способом решения. Позвольте мне проверить, работает ли это!
3. @ML33M Я добавил обновление. Пожалуйста, проверьте, работает ли это для вас!
4. @ML33M Конечно, приятно. Возможно, природа
with
не изменяет данные. Когда вы используете вторую строку, вы изменяете непосредственно переменную, которую нужно упорядочить. Таким образом, вы можете получить группы в нужном вам порядке. Иногда я предпочитаю вносить изменения непосредственно в dataframe вместо использования with . Я надеюсь, что это было достаточно ясно для вас!5. фантастика. Спасибо. Мне нравится ощущение изучения чего-то нового!