【问题标题】:How to rescale color mapping in scale_color_distiller (ggplot2)?如何在 scale_color_distiller (ggplot2) 中重新缩放颜色映射?
【发布时间】:2021-12-28 09:37:42
【问题描述】:

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

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)] &lt;- 100 与上面相同的ggplot 代码之后返回此图:

显然,问题在于这一点改变了比例,我们得到了一个信息很少的图。我的解决方案是使用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() 内将change limits 参数传递给limits= c(0, 10),但这没有帮助。

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

【问题讨论】:

  • 也许你想通过对数转换来重新缩放。不确定转换为排名是否总能准确反映您的数据分布。
  • @tjebo 是的,有different ways 来规范化数据。出于我的目的,使用排名没问题。
  • @tjebo 该链接回答了如何用颜色更好地显示数据的差异。这不是我的问题,因为我用rank 为我解决了这个问题。此外,我尝试了不同的方法,但我无法弄清楚如何将rescale(...) 解决方案从您的链接中包含在scale_color_distiller() 中。这是建议吗?

标签: r ggplot2 colors scale


【解决方案1】:

将排名重新调整为原始 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 创建于 2021-11-17 (v2.0.1)

【讨论】:

    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2018-08-04
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多