Мой вопрос похож на тот, который спрашивает примерно то же самое функция, но не то же самое.

Я хотел бы применить расходящуюся цветовую шкалу к 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")

A heatmap showing p-values from zero to one on a color scale from yellow to blue.

Затем я попытался добиться более быстрого перехода по шкале ниже 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")

A heatmap showing p-values from zero to one on a color scale from yellow to blue. Values below 0.05 should turn to red but don't.

Наконец, я могу использовать шкалу с логарифмическим преобразованием, которая четко показывает различную величину ниже 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")

A heatmap showing p-values from zero to one on a color scale from red to yellow. The color scale is log-transformed. Values below 0.05 quickly progress to red but values above are all yellow.

1
Midnighter 30 Мар 2021 в 16:03

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)

1
teunbrand 30 Мар 2021 в 13:30