2016-09-12 2 views
-1

Я пытаюсь создать график geom_violin(), наложенный на график geom_point(), в котором график geom_point() имеет разные цвета точек, на основе которых подмножество I классифицировали данные.Различные цвета geom_point() на основе подмножеств dataframe

У меня ошибка: «Ошибка в eval (expr, envir, enclos): объект« ind »не найден» при попытке загрузить подмножество DataFrame, когда я делаю это в функции geom_point(), но я не знаю, я понимаю, что я делаю неправильно, выкалывая или искажая ошибку. (Без этой строки, код запускается и генерирует этот вывод, который является то, что я хочу, кроме цветового кодирования точек: PDF output when the second geom_point is commented out)

Вот вздор набора данных я использовал, чтобы попытаться сделать эту работу (gene1, 2,3 - это имена ростов). Я транспонировать в коде ниже:

,cell_1,cell_2,cell_3,cell_4,cell_5,cell_6,cell_7,cell_8,cell_9,cell_10,cell_11,cell_12,cell_13,cell_14,cell_15,cell_16,cell_17,cell_18,cell_19,cell_20,cell_21,cell_22,cell_23,cell_24,cell_25,cell_26,cell_27,cell_28,cell_29,cell_30,cell_31,cell_32,cell_33,cell_34,cell_35,cell_36,cell_37,cell_38,cell_39,cell_40,cell_41,cell_42,cell_43,cell_44,cell_45,cell_46,cell_47,cell_48,cell_49,cell_50 
gene1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.19230,0.0,0.0,0.0,0.19230,0.0,0.0,0.0,69.3915,0.0,0.0,74.123,0,0,0,0,0,13.01,0.0,0.0,0.0,0.0,0.0,0.9231,73.023,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 
gene2,0.279204,23.456,13.1,10.5,0.0,14.2,151,2,50.3201,0.0,0.0,128.0,0.0,0.0,0.0,9.74082,20.9432,0.0,0.0,300.023,20.0234,0.0,0.0,300.024,123,201.345,164.681,301.421,173.023,216.537,201.234,302.102,199.234,20.234,40.234,180.0234,0.0,23.234,190.134,170.023,0.0,8.023,40.234,180.0234,0.0,23.234,190.134,170.023,21.24,8.023 
gene3,25.9954,77.3398,45.3092,107.508,0.266139,70.4924,114.17,291.324,198.525,190.353,185.381,0.14223,90.323,20.4332,29.012,500.391,2.51459,300.021,60.001,192.023,60.0234,300.022,60.002,192.024,34,500.392,2.51460,300.022,60.002,192.024,60.0235,300.023,60.003,192.025,60.002,192.024,34,500.392,2.51460,300.022,60.002,192.024,60.0235,300.023,60.003,192.025,35,194.231,94.13,32.124 
gene4,46.1717,194.241,0.776565,3.0325,0.762981,2.3123,14.507,13.0234,0.538315,0.0,1.5234,11.2341,0.0,1.34819,6.0142,3.2341,4.4444,150.324,0.0,20.9432,134.023,150.325,0.0,20.9433,3.2341,4.4444,150.324,0.0,20.9432,134.023,170.13408,0.0,3.2341,4.4444,150.324,0.0,3.2341,6.7023,150.324,0.0,3.2341,4.4444,170.341,0.0,20.9432,134.023,150.325,0.0,50.234,3.123 
gene5,94.2341,301.234,0.0,0.0,123.371,0.0,0.0,155.234,0.0,0.664744,0.0,402.616,222.148,0.0,0.0,0.0,169.234,0.0,10.234,0.0,0.0,0.0,0.99234,0.0,0.99234,0.0,0.0,0.0,0.99234,0.0,0.99234,0.0,0.0,0.0,0.99234,0.0,10.324,0.0,0.0,15.0234,43.1243,0.0,320.023,0.0,0.0,0.0,1.234,0.0,12.123,0.0 

Вот код, который я написал: #load набора данных df_raw < - read.table ("pretend_dataset.csv", Сентябрь = "", заголовка = ИСТИНА)

#Make gene names into rownames 
rownames(df_raw) <- df_raw$Name 

#Remove "Name" column 
df_raw$Name <- NULL 

#TRANSPOSE DATASET 
matrix_transp <- t(df_raw) 

#Make matrix_transp matrix into dataframe 
df <- as.data.frame(as.matrix(matrix_transp)) 

#Subset gene1 positive and negatve cells 
df.positive <- subset(df, gene1 > 0) 

#Convert data in data frames to log scale 
df.log <- log(df+1) 
df.positive.log <- log(df.positive+1) 

#Violin plot for each gene with all cells (positive and negative with color coded scatter) 

plot <- ggplot(stack(df.log), aes(x = ind, y = values, fill=ind)) + 
    geom_violin() + 
    geom_point(position = position_jitterdodge(jitter.width=4)) + 
    geom_point(data=df.positive.log, aes(x = ind, y = values, fill=ind), position = position_jitterdodge(jitter.width=4), color="red") + 
    xlab("Gene") + ylab("Expression level (TPM log)") + 
    theme_classic(base_size = 14, base_family = "Helvetica") + 
    theme(axis.text.y=element_text(size=14)) + 
    theme(axis.title.y=element_text(size=14, face="bold")) + 
    theme(axis.text.x=element_text(size=14)) + 
    theme(axis.title.x=element_text(size=14, face="bold")) + 
    scale_fill_brewer(palette="Pastel1") 

plot + coord_cartesian(ylim = c(0, 8)) 
+1

'ind' должно быть Name в соответствии с предоставленными вами данными. В df нет столбца с именем 'ind'. – Haboryme

+0

Я допустил ошибку: «gene1», «gene2» и т. Д. Являются именами ростов, а не столбцом «Имя». Я сделал ошибку, поставив набор данных сюда. Я отредактирую свое оригинальное сообщение для точности и попробую использовать «rowname», похожее на столбцы, может быть? – Galaffer

+0

Кажется, кто-то спросил об этом недавно. У меня нет времени на проверку, но вы можете выполнить поиск. –

ответ

1

ответ ниже накладки цветного скрипичный участка с jittered набором точек, окрашенными положительным или отрицательным.

library(dplyr); library(ggplot2); library(tidyr) 
#read in data. 
df2 <-read.csv(textConnection(df), header=TRUE, row.names = 1) 

# Add in the rownames and gather the dataset 
df3 <- df2 %>% mutate(Gene= rownames(.)) %>% 
    gather(., key= "cell", value="value", -Gene) %>% 
    mutate(positive = value>0, absolute= abs(value), logabs= log(absolute+1)) 


df3 %>% ggplot(. , aes(x = Gene, y=logabs, fill=Gene)) + 
    geom_violin() +geom_jitter(aes(colour= positive)) 

Это то, что вы искали?

EDIT: Прочитанная строка данных, вставляет строки в данные, представленные выше, в текстовую строку, а затем преобразует текстовую строку в информационный кадр. Если у вас уже есть фрейм данных, это не обязательно. Он используется только в том случае, если не существует доступного объекта dput().

EDIT 2: Этот расширенный ответ является результатом комментариев к предыдущему ответу. В решении используется транспонированная матрица данных, представленных в вопросе. Полученный сюжет имеет скрипичные графики, окрашенные геном, наложенным точками, окрашенными тем, является ли это наблюдение отрицательным в гене1.

Точный набор данных показан ниже и является результатом вызова команды dput() в матрице.

df <- structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0.1923, 0, 0, 0, 0.1923, 0, 0, 0, 69.3915, 0, 0, 74.123, 0, 0, 
0, 0, 0, 13.01, 0, 0, 0, 0, 0, 0.9231, 73.023, 0, 0, 0, 0, 0, 
0, 0, 0, 0.279204, 23.456, 13.1, 10.5, 0, 14.2, 151, 2, 50.3201, 
0, 0, 128, 0, 0, 0, 9.74082, 20.9432, 0, 0, 300.023, 20.0234, 
0, 0, 300.024, 123, 201.345, 164.681, 301.421, 173.023, 216.537, 
201.234, 302.102, 199.234, 20.234, 40.234, 180.0234, 0, 23.234, 
190.134, 170.023, 0, 8.023, 40.234, 180.0234, 0, 23.234, 190.134, 
170.023, 21.24, 8.023, 25.9954, 77.3398, 45.3092, 107.508, 0.266139, 
70.4924, 114.17, 291.324, 198.525, 190.353, 185.381, 0.14223, 
90.323, 20.4332, 29.012, 500.391, 2.51459, 300.021, 60.001, 192.023, 
60.0234, 300.022, 60.002, 192.024, 34, 500.392, 2.5146, 300.022, 
60.002, 192.024, 60.0235, 300.023, 60.003, 192.025, 60.002, 192.024, 
34, 500.392, 2.5146, 300.022, 60.002, 192.024, 60.0235, 300.023, 
60.003, 192.025, 35, 194.231, 94.13, 32.124, 46.1717, 194.241, 
0.776565, 3.0325, 0.762981, 2.3123, 14.507, 13.0234, 0.538315, 
0, 1.5234, 11.2341, 0, 1.34819, 6.0142, 3.2341, 4.4444, 150.324, 
0, 20.9432, 134.023, 150.325, 0, 20.9433, 3.2341, 4.4444, 150.324, 
0, 20.9432, 134.023, 170.13408, 0, 3.2341, 4.4444, 150.324, 0, 
3.2341, 6.7023, 150.324, 0, 3.2341, 4.4444, 170.341, 0, 20.9432, 
134.023, 150.325, 0, 50.234, 3.123), .Dim = c(50L, 4L), .Dimnames = list(
    c("cell_1", "cell_2", "cell_3", "cell_4", "cell_5", "cell_6", 
    "cell_7", "cell_8", "cell_9", "cell_10", "cell_11", "cell_12", 
    "cell_13", "cell_14", "cell_15", "cell_16", "cell_17", "cell_18", 
    "cell_19", "cell_20", "cell_21", "cell_22", "cell_23", "cell_24", 
    "cell_25", "cell_26", "cell_27", "cell_28", "cell_29", "cell_30", 
    "cell_31", "cell_32", "cell_33", "cell_34", "cell_35", "cell_36", 
    "cell_37", "cell_38", "cell_39", "cell_40", "cell_41", "cell_42", 
    "cell_43", "cell_44", "cell_45", "cell_46", "cell_47", "cell_48", 
    "cell_49", "cell_50"), c("gene1", "gene2", "gene3", "gene4" 
    ))) 

Код, необходимый для включения вышеуказанного набора данных в запрошенный график, показан ниже.

df2 <- df %>% as.data.frame %>% mutate(Cell= rownames(.), positive = gene1>0) %>% 
    gather(., key= "Gene", value="value", -Cell,-positive) %>% 
    mutate(absolute= abs(value), logabs= log(absolute+1)) 


df2 %>% ggplot(. , aes(x = Gene, y=logabs, fill=Gene)) + 
    geom_violin() +geom_jitter(aes(colour= positive)) 

Поскольку сюжет может быть трудно интерпретировать, дополнительные методы отображения статуса относительно гена1.

df2 %>% ggplot(., aes(x=Gene, y=logabs, fill=positive)) +geom_boxplot() 

df2 %>% ggplot(. , aes(x = Gene, y=logabs, fill=positive)) + 
    geom_violin() 
+0

Я убежден, что это гораздо более обоснованное решение, чем моя собственная попытка, но у меня проблемы с работой. Я не могу загрузить набор данных, как вы предлагаете, поэтому я получаю сообщение об ошибке: > #read in data > df2 <-pretend_dataset.csv (textConnection (df), header = TRUE, row.names = 1) Ошибка: может не найти функцию «pretend_dataset.csv» – Galaffer

+0

Если я вместо этого загружаю набор данных, как я описал выше, и транспонирую его, и как следствие изменения транспозиции «rownames» в вашем коде на «colnames», я получаю еще одну ошибку ... > DF3 <- df2 %>% мутировать (Gene = COLNAMES (.))%>% + сбор (., ключ = "ячейку", значение = "значение", -Gene)%>% + мутировать (положительное значение = > 0, absolute = abs (значение), logabs = log (absolute + 1)) Ошибка: неправильный размер результата (5), ожидаемый 50 или 1 – Galaffer

+0

Вы не должны необходимо загрузить набор данных, подобный этому. Я просто хотел показать вам, как я перевернул вложенные данные, которые вы ввели в фреймворк данных, он должен работать, если вы назовете ваш dataframe df2 и начнете оттуда. Если вы используете функцию dput(), которая упростит использование ваших данных на других машинах. –

Смежные вопросы