График плотности для нескольких групп в ggplot - PullRequest
0 голосов
/ 05 июня 2018

Я видел example1 и Как наложить графики плотности в R? и Перекрытые графики плотности в ggplot2 о том, как сделать график плотности.Я могу сделать график плотности с кодами во второй ссылке.Однако мне интересно, как я могу сделать такой график в ggplot или plotly?Я посмотрел на все примеры, но не могу понять это для моей проблемы.У меня есть игрушечный фрейм данных с выражением гена описание данных лейкемии , столбцы которого относятся к 2 группам людей

leukemia_big <- read.csv("http://web.stanford.edu/~hastie/CASI_files/DATA/leukemia_big.csv")

df <- data.frame(class= ifelse(grepl("^ALL", colnames(leukemia_big),
                 fixed = FALSE), "ALL", "AML"), row.names = colnames(leukemia_big))

plot(density(as.matrix(leukemia_big[,df$class=="ALL"])), 
     lwd=2, col="red")
lines(density(as.matrix(leukemia_big[,df$class=="AML"])), 
      lwd=2, col="darkgreen")

1 Ответ

0 голосов
/ 05 июня 2018

Ggplot требует аккуратно отформатированных данных, также называемых длинным форматированным фреймом данных.Следующий пример сделает это.Но будьте осторожны, предоставленный набор данных имеет практически идентичное распределение значений по типу пациентов, поэтому при построении графиков пациентов с типом ALL и AML кривые перекрываются и вы не видите разницы.

library(tidyverse)

leukemia_big %>% 
as_data_frame() %>% # Optional, makes df a tibble, which makes debugging easier
gather(key = patient, value = value, 1:72) %>% #transforms a wide df into a tidy or long df
mutate(type = gsub('[.].*$','', patient)) %>% #creates a variable with the type of patient
ggplot(aes(x = value, fill = type)) + geom_density(alpha = 0.5)

results with original data

Во втором примере я добавлю 1 единицу к переменной значения для всех пациентов с ОМЛ, чтобы визуально продемонстрировать проблему перекрытия

leukemia_big %>% 
as_data_frame() %>% # Optional, makes df a tibble, which makes debugging easier
gather(key = patient, value = value, 1:72) %>% #transforms a wide df into a tidy or long df
mutate(type = gsub('[.].*$','', patient)) %>% #creates a variable with the type of patient
mutate(value2 = if_else(condition = type == "ALL", true = value, false = value + 1)) %>% # Helps demonstrate the overlapping between both type of patients
ggplot(aes(x = value2, fill = type)) + geom_density(alpha = 0.5)`

results with modified data for AML type patients

...