Мой вопрос похож на тот, который спрашивает примерно то же самое функция, но не то же самое.
Я хотел бы применить расходящуюся цветовую шкалу к p-значениям, где значение 0,05 - моя средняя точка. Значения выше 0,05 должны прогрессировать линейно, тогда как значения ниже должны прогрессировать логарифмически. Возможно ли это с помощью colorspace::scale_fill_continuous_divergingx
или какой-либо другой функции из пакета colorspace
?
В качестве альтернативы я мог преобразовать в логарифмическую шкалу, но мне было трудно визуально обозначить сдвиг выше 0,05.
Ниже вы можете найти то, что я пробовал до сих пор. Любые идеи приветствуются.
df <- structure(list(name = c(3L, 12L, 15L, 14L, 5L, 18L, 11L, 4L,
6L, 17L, 10L, 2L, 9L, 8L, 7L, 1L, 16L, 19L, 13L, 9L, 2L, 8L,
15L, 16L, 17L, 4L, 19L, 10L, 7L, 1L, 6L, 5L, 11L, 12L), p_adjusted = c(4.32596750954342e-06,
3.03135847907459e-05, 0.000118088275490085, 0.000131741744620688,
0.000137720927111689, 0.00427368416054269, 0.00435924240679527,
0.0105749752039341, 0.0108537078105272, 0.0156289799697254, 0.823419406127695,
1, 1, 1, 1, 1, 1, 1, 3.57724493033791e-06, 9.05031572894023e-05,
0.000118883184319132, 0.000143702004459057, 0.00033101896024948,
0.00265474345049394, 0.00453440320908698, 0.00473248203895472,
0.00508912585948996, 0.00881057444851548, 0.0200752446003521,
0.024238863465647, 1, 1, 1, 1), group = c(1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L)), row.names = c(NA,
-34L), class = c("tbl_df", "tbl", "data.frame"))
При этом используется более или менее масштаб по умолчанию. Цветовая шкала дает хорошее представление о том, что происходит выше 0,05.
ggplot2::ggplot(df, ggplot2::aes(x = group, y = name, fill = p_adjusted)) +
ggplot2::geom_tile() +
colorspace::scale_fill_continuous_divergingx(name = "p-value",
mid = 0.05,
palette = "RdYlBu") +
ggplot2::theme_classic() +
ggplot2::scale_x_discrete("Group") +
ggplot2::scale_y_discrete("Feature")
Затем я попытался добиться более быстрого перехода по шкале ниже 0,05, чтобы получить более четкие цвета. Это более или менее не работает.
ggplot2::ggplot(df, ggplot2::aes(x = group, y = name, fill = p_adjusted)) +
ggplot2::geom_tile() +
colorspace::scale_fill_continuous_divergingx(
name = "p-value",
mid = 0.05,
palette = "RdYlBu",
p1 = 1e-2,
p2 = 1e-2,
p3 = 1.5,
p4 = 1.5
) +
ggplot2::theme_classic() +
ggplot2::scale_x_discrete("Group") +
ggplot2::scale_y_discrete("Feature")
Наконец, я могу использовать шкалу с логарифмическим преобразованием, которая четко показывает различную величину ниже 0,05, но не может различать выше. Также я хотел бы четко различать среднюю точку 0,05 на шкале палитры.
ggplot2::ggplot(df, ggplot2::aes(x = group, y = name, fill = p_adjusted)) +
ggplot2::geom_tile() +
colorspace::scale_fill_continuous_divergingx(
name = "p-value",
mid = 0.05,
palette = "RdYlBu",
labels = function(x)
format(x, digits = 3, big.mark = ","),
trans = "log"
) +
ggplot2::theme_classic() +
ggplot2::scale_x_discrete("Group") +
ggplot2::scale_y_discrete("Feature")
1 ответ
Вы были правы с шкалой преобразования журнала. Единственная проблема заключается в том, что существует ошибка, при которой средняя точка не трансформируется. Итак, предварительно преобразовав значение средней точки, мы должны получить расходящуюся шкалу с центром в средней точке.
library(ggplot2)
df <- structure(list(
name = c(3L, 12L, 15L, 14L, 5L, 18L, 11L, 4L, 6L, 17L, 10L, 2L, 9L, 8L, 7L,
1L, 16L, 19L, 13L, 9L, 2L, 8L, 15L, 16L, 17L, 4L, 19L, 10L, 7L, 1L,
6L, 5L, 11L, 12L),
p_adjusted = c(4.32596750954342e-06, 3.03135847907459e-05,
0.000118088275490085, 0.000131741744620688,
0.000137720927111689, 0.00427368416054269,
0.00435924240679527, 0.0105749752039341, 0.0108537078105272,
0.0156289799697254, 0.823419406127695, 1, 1, 1, 1, 1, 1, 1,
3.57724493033791e-06, 9.05031572894023e-05,
0.000118883184319132, 0.000143702004459057,
0.00033101896024948, 0.00265474345049394, 0.00453440320908698,
0.00473248203895472, 0.00508912585948996, 0.00881057444851548,
0.0200752446003521, 0.024238863465647, 1, 1, 1, 1),
group = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L)
), row.names = c(NA, -34L), class = c("tbl_df", "tbl", "data.frame"))
ggplot2::ggplot(df, ggplot2::aes(x = group, y = name, fill = p_adjusted)) +
ggplot2::geom_tile() +
colorspace::scale_fill_continuous_divergingx(
trans = "log10",
name = "p-value",
mid = log10(0.05),
palette = "RdYlBu"
) +
ggplot2::theme_classic() +
ggplot2::scale_x_discrete("Group") +
ggplot2::scale_y_discrete("Feature")
Создано 30 марта 2021 года пакетом REPEX (v1.0.0)
Похожие вопросы
Связанные вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.