Формат данных
Текущий формат данных обозначается как широкий формат , но ggplot
требует длинный формат данных. Пакет tidyr
(часть tidyverse
) имеет функции для преобразования между широким и длинным форматами. В этом случае вам нужна функция tidyr::pivot_longer
. Например, если у вас есть данные в data.frame (или tibble) под названием df_gene_expr
, точка поворота будет go что-то вроде
library(tidyverse)
df_gene_expr %>%
pivot_longer(cols=2:18, names_to="cancer_type", values_to="gene_expr") %>%
filter(ID == "ABCA8") %>%
ggplot(aes(x=cancer_type, y=gene_expr)) +
geom_point()
, где здесь мы выделяем один ген "ABCA8"
. Измените geom_point()
на любую геометрию, которую вы действительно хотите (возможно, geom_bar(stat='identity')
.
Дискретная линия тренда
Я не уверен, что geom_smooth
полностью подходит - он разработан с учетом непрерывно-непрерывных данных. Вместо этого я бы рекомендовал stat_summary
.
Здесь есть небольшая хитрость, потому что дискретное cancer_type
на оси x. А именно, переменная cancer_type
должна быть factor
, но мы будем использовать базовые коды для значений x в stat_summary
. В противном случае он будет жаловаться, что использование geom='line'
не имеет смысла.
Что-то вроде:
ggplot(df_long, aes(x=cancer_type, y=gene_expr)) +
geom_hline(yintercept=0, linetype=4, color="red") +
geom_line(aes(group=ID), size=0.5, alpha=0.3, color="black") +
stat_summary(aes(x=as.numeric(cancer_type)), fun=mean, geom='line',
size=2, color='orange')
Вывод из поддельных данных введите описание изображения здесь
Технически тот же трюк (aes(x=as.numeric(cancer_type))
) может быть одинаково хорошо применен к geom_smooth
, но я думаю, что все же имеет смысл использовать stat_summary
, который позволяет явно выбирать статистику, которая будет вычислено. Например, возможно, median
вместо mean
может быть более подходящим в этом контексте для функции сводки.