#r #ggplot2 #forcats
Вопрос:
Я чрезвычайно новичок в R и кодировании в целом, поэтому, пожалуйста, будьте терпеливы со мной! Я повсюду искал решение, но все, что я пробовал, не сработало или я его не понял, поэтому я был бы признателен за любую помощь, которую вы могли бы мне оказать.
Я пытаюсь построить точечный график таким образом, чтобы цвета соответствовали диапазону значений изменения сгиба, а размер точки соответствовал p-значению. Я начинаю с передачи csv-файла с четырьмя столбцами «Гены», «Концентрация», «изменение сгиба» и «p-значение». Ниже приведены некоторые примеры данных и код, который я пытался сгенерировать точечный график с концентрацией на оси x, генами на оси y и каждым цветом точки, соответствующим изменению сгиба (но я хочу указать диапазон значений, соответствующих одному цвету, как показано ниже), а размер точки равен p-значению.
genes <- c('ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN')
concentration <- c('PR1.2', 'PR1.2','PR1.2', 'PR1.2','PR1.2', 'PR1.2','PR2.4', 'PR2.4','PR2.4', 'PR2.4','PR2.4','PR2.4', 'PR3.6', 'PR3.6','PR3.6', 'PR3.6','PR3.6','PR3.6','PR1.2T', 'PR1.2T','PR1.2T', 'PR1.2T','PR1.2T', 'PR1.2T', 'PR2.4T', 'PR2.4T','PR2.4T', 'PR2.4T','PR2.4T', 'PR2.4T', 'PR3.6T', 'PR3.6T','PR3.6T', 'PR3.6T','PR3.6T','PR3.6T')
foldchange <- c(577.19, 2.642, -697.90, 50.23, 12.582, -30.542, -15.376, 30.674, -1.973, -5.324, -132.761, 146.678, 500.19, 2.233, -656.90, 49.23, 13.582, -80.542, 577.19, 2.642, -697.90, 50.23, 12.582, -30.542, 577.19, 2.642, -697.90, 50.23, 12.582, -30.542, 577.19, 2.642, -697.90, 50.23, 12.582, -30.542)
pval <- c(4, 2, 2, 2, 3, 3, 2, 3,1,1,4,4, 4, 2, 2, 2, 3, 3)
data <- data.frame(genes, concentration, foldcahnge, pval)
f <- fct_inorder(genes)
g <- fct_inorder(concentration)
# now make dot plot using ggplot2
p <- ggplot(data, aes(x=concentration, y=genes, size=pval)) labs(y="Gene")
geom_point(alpha = 0.9) geom_point(aes(colour = cut(foldchange), c(Inf, 500, 250,
100, 50, 25, 10, 5, 2, -2, 5, -10, -25, -50,
-100, -250, -500, -Inf))))
scale_color_manual(name = "fold change", values= c("(500, Inf]" = "firebrick4",
"(250,500]" = "firebrick",
"(100,250]" = "red3",
"(500,100] = "red2",
"(25,50]" = "red",
"(10,25]" = "firebrick2",
"(5,10]" = "firebrick1",
"(2,5]" = "rosybrown1",
"(-2,2]" = "gray98"
"(-5,-2]" = "lightskyblue",
"(-10,-5]" = "deepskyblue",
"(-25,-10]" = "dodgerblue2",
"(-50,-25]" = "dodgerblue4",
"(-100,-50]" = "blue"
"(-250,-100]" = "blue3"
"(-500,-250]" = "darkblue"
"(-Inf,-500]" = "navy"),
labels = c("500", "250", "100", "50", "25", "10", "5", "2", "-2", "-5", "-10", "-25", "-50", "-100", "-250", "-500"))
p scale_size(range = c(1,4), breaks = c(1,2,3,4), labels=c("pval >0.05", "0.01<pval<0.05", "0.001<pval<0.01", "pval<0.001")
Здесь у меня одинаковые концентрации одного и того же препарата, но в разных клеточных линиях, которые ничем не обозначены после концентрации или буквой «Т» для клеточной линии «Т». У меня возникла проблема, когда одна из концентраций вышла из строя, но с остальными все в порядке. Когда я запускаю это, он возвращает точечный график, в котором порядок столбцов «PR1.2», «PR2.4», «PR2.4T», «PR3.6», «PR1.2T», «PR3.6T». Я хочу, чтобы они были в порядке строк ячеек: «PR1.2», «PR2.4», «PR3.6», «PR1.2T», «PR2.4T», «PR3.6T». Кто-нибудь может объяснить, почему мои концентрации не в правильном порядке и как это исправить? Заранее спасибо!
Комментарии:
1.
fct_inorder
только изменяет порядок уровней фактора, на самом деле это не делает его «упорядоченным фактором» (см.?factor
ggplot
будет сортировать факторы в алфавитном порядке, если только это не упорядоченный фактор.2. Однако в вашем коде есть ряд проблем, из-за которых трудно определить конкретную ошибку, так как она как есть не запускается. Некоторые из них, с которыми я столкнулся: опечатка
foldcahnge
при создании фрейма данных , отсутствие близкой кавычкиscale_colour_manual
(500,100]
, дополнительные скобки в концеgeom_point
,f
иg
на самом деле их нетdata
, поэтому они не отображаются. Я предлагаю вам попытаться очистить это, чтобы запустить в новом сеансе R, чтобы поймать эти ошибки, так как в противном случае трудно понять реальную проблему
Ответ №1:
В вашем коде есть некоторые опечатки — если вы исправите их и внесете некоторые незначительные изменения, мне кажется, что ваш код работает должным образом:
library(ggplot2)
library(forcats)
genes <- fct_inorder(
f = c(
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN'
),
ordered = TRUE
)
concentration <-
fct_inorder(
f = c(
'PR1.2',
'PR1.2',
'PR1.2',
'PR1.2',
'PR1.2',
'PR1.2',
'PR2.4',
'PR2.4',
'PR2.4',
'PR2.4',
'PR2.4',
'PR2.4',
'PR3.6',
'PR3.6',
'PR3.6',
'PR3.6',
'PR3.6',
'PR3.6',
'PR1.2T',
'PR1.2T',
'PR1.2T',
'PR1.2T',
'PR1.2T',
'PR1.2T',
'PR2.4T',
'PR2.4T',
'PR2.4T',
'PR2.4T',
'PR2.4T',
'PR2.4T',
'PR3.6T',
'PR3.6T',
'PR3.6T',
'PR3.6T',
'PR3.6T',
'PR3.6T'
),
ordered = TRUE
)
foldchange <-
c(
577.19,
2.642,
-697.90,
50.23,
12.582,
-30.542,
-15.376,
30.674,
-1.973,
-5.324,
-132.761,
146.678,
500.19,
2.233,-656.90,
49.23,
13.582,
-80.542,
577.19,
2.642,
-697.90,
50.23,
12.582,
-30.542,
577.19,
2.642,
-697.90,
50.23,
12.582,
-30.542,
577.19,
2.642,
-697.90,
50.23,
12.582,
-30.542
)
pval <- c(4, 2, 2, 2, 3, 3, 2, 3, 1, 1, 4, 4, 4, 2, 2, 2, 3, 3)
data <- data.frame(genes, concentration, foldchange, pval)
# now make dot plot using ggplot2
p <- ggplot(data, aes(x = concentration, y = genes, size = pval))
geom_point(alpha = 0.9)
geom_point(aes(colour = cut(foldchange,
breaks = c(
500,
250,
100,
50,
25,
10,
5,
2,
-2,
-5,
-10,
-25,
-50,
-100,
-250,
-500
))))
labs(y = "Gene")
scale_color_manual(
name = "fold change",
values = c(
"(500, Inf]" = "firebrick4",
"(250,500]" = "firebrick",
"(100,250]" = "red3",
"(500,100]" = "red2",
"(25,50]" = "red",
"(10,25]" = "firebrick2",
"(5,10]" = "firebrick1",
"(2,5]" = "rosybrown1",
"(-2,2]" = "gray98",
"(-5,-2]" = "lightskyblue",
"(-10,-5]" = "deepskyblue",
"(-25,-10]" = "dodgerblue2",
"(-50,-25]" = "dodgerblue4",
"(-100,-50]" = "blue",
"(-250,-100]" = "blue3",
"(-500,-250]" = "darkblue",
"(-Inf,-500]" = "navy"),
labels = c("500", "250", "100", "50", "25", "10", "5", "2", "-2", "-5", "-10", "-25", "-50", "-100", "-250", "-500"),
breaks = c(500, 250, 100, 50, 25, 10, 5, 2, -2, -5, -10, -25, -50, -100, -250, -500))
p scale_size(breaks = c(1,2,3,4), labels=c("pval >0.05", "0.01<pval<0.05", "0.001<pval<0.01", "pval<0.001"))
Было трудно найти опечатки в исходном коде из — за форматирования-если вы используете RStudio, вы можете переформатировать/переформатировать свой код с помощью Меню>Код>>Переформатировать код / Меню>>>Код>>>>Переформатировать строки, и это облегчает просмотр таких вещей, как пропущенная запятая.
Редактировать
Если вы хотите указать порядок фактора (например, «гены»), вы можете использовать базу R factor
вместо forcats fct_inorder
. Например.
genes <- factor(x = c(
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN',
'ABC',
'CDE',
'EFG',
'HIJ',
'JKL',
'LMN'
), levels = c(
'LMN',
'JKL',
'HIJ',
'EFG',
'CDE',
'ABC'
),
ordered = TRUE
)
concentration <-
fct_inorder(
f = c(
'PR1.2',
'PR1.2',
'PR1.2',
'PR1.2',
'PR1.2',
'PR1.2',
'PR2.4',
'PR2.4',
'PR2.4',
'PR2.4',
'PR2.4',
'PR2.4',
'PR3.6',
'PR3.6',
'PR3.6',
'PR3.6',
'PR3.6',
'PR3.6',
'PR1.2T',
'PR1.2T',
'PR1.2T',
'PR1.2T',
'PR1.2T',
'PR1.2T',
'PR2.4T',
'PR2.4T',
'PR2.4T',
'PR2.4T',
'PR2.4T',
'PR2.4T',
'PR3.6T',
'PR3.6T',
'PR3.6T',
'PR3.6T',
'PR3.6T',
'PR3.6T'
),
ordered = TRUE
)
foldchange <-
c(
577.19,
2.642,
-697.90,
50.23,
12.582,
-30.542,
-15.376,
30.674,
-1.973,
-5.324,
-132.761,
146.678,
500.19,
2.233,-656.90,
49.23,
13.582,
-80.542,
577.19,
2.642,
-697.90,
50.23,
12.582,
-30.542,
577.19,
2.642,
-697.90,
50.23,
12.582,
-30.542,
577.19,
2.642,
-697.90,
50.23,
12.582,
-30.542
)
pval <- c(4, 2, 2, 2, 3, 3, 2, 3, 1, 1, 4, 4, 4, 2, 2, 2, 3, 3)
data <- data.frame(genes, concentration, foldchange, pval)
# now make dot plot using ggplot2
p <- ggplot(data, aes(x = concentration, y = genes, size = pval))
geom_point(alpha = 0.9)
geom_point(aes(colour = cut(foldchange,
breaks = c(
500,
250,
100,
50,
25,
10,
5,
2,
-2,
-5,
-10,
-25,
-50,
-100,
-250,
-500
))))
labs(y = "Gene")
scale_color_manual(
name = "fold change",
values = c(
"(500, Inf]" = "firebrick4",
"(250,500]" = "firebrick",
"(100,250]" = "red3",
"(500,100]" = "red2",
"(25,50]" = "red",
"(10,25]" = "firebrick2",
"(5,10]" = "firebrick1",
"(2,5]" = "rosybrown1",
"(-2,2]" = "gray98",
"(-5,-2]" = "lightskyblue",
"(-10,-5]" = "deepskyblue",
"(-25,-10]" = "dodgerblue2",
"(-50,-25]" = "dodgerblue4",
"(-100,-50]" = "blue",
"(-250,-100]" = "blue3",
"(-500,-250]" = "darkblue",
"(-Inf,-500]" = "navy"),
labels = c("500", "250", "100", "50", "25", "10", "5", "2", "-2", "-5", "-10", "-25", "-50", "-100", "-250", "-500"),
breaks = c(500, 250, 100, 50, 25, 10, 5, 2, -2, -5, -10, -25, -50, -100, -250, -500))
p scale_size(breaks = c(1,2,3,4), labels=c("pval >0.05", "0.01<pval<0.05", "0.001<pval<0.01", "pval<0.001"))