R: Как я могу упорядочить символьный столбец по другому столбцу (фактор или метка символа) в ggplots

#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. фантастика. Спасибо. Мне нравится ощущение изучения чего-то нового!