使用不连续函数创建单个 ggplot 渐变配色方案

Create single ggplot gradient color scheme with a discontinuous function

这有点远景,但我想知道是否有人曾尝试将两个不同的连续梯度比例组合成一个比例(基本上是两个不同的连续函数组合成一个单一函数)用于 ggplot 中的渐变填充?让我试着用一个例子来解释:

x <- rep(1:10, each = 10)
y <- rep(1:10, 10)
fill <- sample(1:60, 100, replace = TRUE)

df_test <- as.data.frame(cbind(x, y, fill))

ggplot()+
  geom_tile(data = df_test, aes(x = x, y = y, fill = fill))+
  scale_fill_gradient2(low = "red",
                       mid = "white",
                       high = "blue",
                       midpoint = 30)

代码将生成下面的图,其中颜色将从 30 变为为高值和低值设置的相应颜色(在本例中为蓝色和红色)。

但是,如果出于某种原因,我想将中点设置为 50 而不是 30,则代码和绘图将如下所示:

ggplot()+
  geom_tile(data = df_test, aes(x = x, y = y, fill = fill))+
  scale_fill_gradient2(low = "red",
                       mid = "white",
                       high = "blue",
                       midpoint = 50)

正如您在这里看到的,尽管我仍然指定蓝色作为我渐变高点的颜色,但由于我的中点现在是 50,蓝色比以前柔和得多。看起来 scale_gradient2 只是重新调整了颜色,因此 0 仍然是红色,但由于中点现在是 50,所以高点颜色是浅蓝色。

我想要的行为是我为 high 设置的颜色保持在第一个图中的颜色,我意识到我想本质上结合 两个 不同一起缩放单个渐变比例,如果值在 50 到 0 之间,那么它是从白色到红色的红色渐变,如果值在 50 到 60 之间,那么它是从白色到蓝色的蓝色渐变。我考虑过在我的自定义转换中添加一个自定义的填充变量,但这并没有真正奏效。谁有更多 elegant/working 的解决方案?

创建您自己的调色板。

library(RColorBrewer)
reds=colorRampPalette(c("red", "white"))
blues=colorRampPalette(c("white", "blue"))

ggplot()+
  geom_tile(data = df_test, aes(x = x, y = y, fill = fill))+
  scale_fill_gradientn(colors=c(reds(50), blues(10)))