R语言 如何用ggplot设置一个有固定中点的渐变色?

64jmpszr  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(300)

我想用自定义填充色标制作一个条形图。假设下面的数据z_score既有正值也有负值:

data_1 <- data.frame(
  name = paste('Pathway', 1:5),
  p_val = c(0.01, 0.05, 0.03, 0.001, 0.02),
  z_score = c(-2, -3, 3, 4, 2.5)
)

data_1 |>
  ggplot(aes(x = p_val, y = fct_reorder(name, p_val))) +
  geom_bar(aes(fill = z_score), stat = 'identity') +
  scale_fill_gradientn(
    colours = colorRampPalette(c('#709AE1', '#FFFFFF', '#FD7446'))(100)
  )

上面的代码按预期工作。现在,假设一个数据只有负z_score

data_2 <- data.frame(
  name = paste('Pathway', 1:5),
  p_val = c(0.01, 0.05, 0.03, 0.001, 0.02),
  z_score = c(-2, -3, -3, -4, -2.5)
)
data_2 |>
  ggplot(aes(x = p_val, y = fct_reorder(name, p_val))) +
  geom_bar(aes(fill = z_score), stat = 'identity') +
  scale_fill_gradientn(
    colours = colorRampPalette(c('#709AE1', '#FFFFFF', '#FD7446'))(100)
  )

这会产生不正确的绘图,因为我希望颜色从白色Map到蓝色(所有z_score值都是负值):

我尝试改变填充颜色,以便在所有z_score值都为负的情况下,只有白色和蓝色,但这会给出一个不正确的图:

对于仅为负的z_score,我希望白色只用于接近零的值。不知何故,比例应该是固定的。例如,z_score为-2不应该Map到白色,但仍然应该是蓝色,即使它是最小的值。这有意义吗?
感谢任何提示!

wj8zmpe1

wj8zmpe11#

看看scale_fill_gradient2函数是否达到了你的目标。你可以为lowhighmid值设置颜色。默认情况下,中点设置为零,颜色为白色。
使用此功能,无论值为负或正值,都可以使用相同的填充比例。

library(tidyverse)

data_1 |>
  ggplot(aes(x = p_val, y = fct_reorder(name, p_val))) +
  geom_bar(aes(fill = z_score), stat = 'identity') +
  scale_fill_gradient2(low = '#709AE1', high = '#FD7446')

data_2 |>
  ggplot(aes(x = p_val, y = fct_reorder(name, p_val))) +
  geom_bar(aes(fill = z_score), stat = 'identity') +
  scale_fill_gradient2(low = '#709AE1', high = '#FD7446')

p3rjfoxz

p3rjfoxz2#

我们可以修改scale_fill_gradientn函数的breakslimits参数:

library(ggplot2)

data_2 |>
  ggplot(aes(x = p_val, y = fct_reorder(name, p_val))) +
  geom_bar(aes(fill = z_score), stat = 'identity') +
  scale_fill_gradientn(
    colours = colorRampPalette(c('#709AE1', '#FFFFFF', '#FD7446'))(100),
    breaks=c(-4,0,4),
    limits=c(-4, 4)
  )

相关问题