如何在 scale_color_distiller (ggplot2) 中重新缩放颜色映射?

How to rescale color mapping in scale_color_distiller (ggplot2)?

我的数据由三个数字变量组成。像这样:

set.seed(1)
df <- data.frame(x= rnorm(10000), y= rnorm(10000))
df$col= df$x + df$y + df$x*df$y

将其绘制为热图看起来不错:

ggplot(df, aes(x, y, col= col)) + geom_point(size= 2) + scale_color_distiller(palette = "Spectral")

但是真实变量可能有一些偏斜或异常值,这完全改变了情节。在 df$col[nrow(df)] <- 100 与上面相同的 ggplot 代码之后 returns 这个情节:

很明显,问题是这一点改变了比例,我们得到了一个信息很少的图。我的解决方案是使用 rank() 对数据进行排名,这为我迄今为止尝试过的任何变量提供了合理的颜色渐变。看这里:

ggplot(df, aes(x, y, col= rank(col))) + geom_point(size= 2) + scale_color_distiller(palette = "Spectral")

此解决方案的问题是新比例(2,500 到 10,000)显示为颜色标签。我希望原始比例显示为颜色标签(o 到 10)。因此,我希望颜色级数与排名数据相对应;即我需要以某种方式将原始值映射到排名颜色值。那可能吗?我试图在 scale_color_distiller() 中对 limits= c(0, 10) 进行 论证,但这没有帮助。

旁注:我不想删除异常值。排名效果很好。我想使用 scale_color_distiller()。如果可能的话,我不想使用除 ggplot2 之外的任何其他包。

将排名重新调整为原始 df$col 的范围。

library(tidyverse)
set.seed(1)
df <- data.frame(x = rnorm(10000), y = rnorm(10000))
df %>%
  mutate(
    col = x + y + x * y,
    scaled_rank = scales::rescale(rank(col), range(col))
  ) %>%
  ggplot(aes(x, y, col = scaled_rank)) +
  geom_point(size = 2) +
  scale_color_distiller(palette = "Spectral")

reprex package (v2.0.1)

于 2021-11-17 创建