3

我正在尝试修改热图的比例,以geom_raster使颜色变化发生在数据的子集上,并且该子集之外的任何内容都不会变得更加丰富多彩。

library(tidyverse)
library(viridis)
library(reshape2)

q <- letters[1:5]
w <- rev(letters)[1:5]
x1 <- rnorm(5, 0, 1)
x2 <- rnorm(5, 0, 1)
x3 <- rnorm(5, 0, 1)
x4 <- rnorm(5, 0, 1)
x5 <- rnorm(5, 10, 1)

test.df <- melt(data.frame(q,w,x1,x2,x3,x4,x5))

ggplot(test.df, aes(q,variable,fill=value))+geom_raster()+scale_fill_viridis()

如果你运行它,你会得到这个热图:

热图.

顶行是“占用”一些颜色范围。由于绝大多数数据在 -2 和 2 之间,我想让它使色阶变化发生在该范围内,而超出该范围的任何东西都只是黄色或紫色。对我来说,任何超过 2 的东西都应该是“非常高”,而任何低于 -2 的东西都应该是“非常低”,但 -2 和 2 之间的数字是我想看到的。

我不认为cut这是我想要的,因为那时我需要提供一堆颜色,并且我不想删除任何数据或将任何数据更改为某个最大值或类似的值。在命令中设置限制scale_viridis有助于但删除限制之外的数据。

4

3 回答 3

3

您可以使用诸如dplyr::case_when截断端点处的值之类的函数。然后,如果需要,您可以相应地在图例上设置标签。请注意,我手动输入了标签以执行"<= -2"and ">= 2"; 不确定这是否足够,或者您是否需要更动态的东西。

library(tidyverse)
library(viridis)
library(reshape2)

set.seed(1234)
q <- letters[1:5]
w <- rev(letters)[1:5]
x1 <- rnorm(5, 0, 1)
x2 <- rnorm(5, 0, 1)
x3 <- rnorm(5, 0, 1)
x4 <- rnorm(5, 0, 1)
x5 <- rnorm(5, 10, 1)

test.df <- melt(data.frame(q,w,x1,x2,x3,x4,x5)) %>%
  mutate(val_trimmed = case_when(
    value > 2 ~ 2,
    value < -2 ~ -2,
    T ~ value
  )) 

ggplot(test.df, aes(x = q, y = variable, fill = val_trimmed)) +
  geom_raster() +
  scale_fill_viridis(labels = c("<= -2", "-1", "0", "1", ">= 2"), breaks = -2:2) +
  labs(caption = "Note: values truncated above 2 and below -2")

reprex 包(v0.2.0)于 2018 年 8 月 13 日创建。

于 2018-08-13T21:33:05.333 回答
2

如果值仅在一端超出比例(您的数据看起来就是这种情况,您的值大于 2,但不小于 -2),您可以将超出最大值的值更改为数据框中的值,NA然后使用na.value =选项scale_fill_viridis()以使所有 NA 值都具有某种颜色。

#change values greater than 2 to NA
test.df$value <- ifelse(test.df$value <= 2, test.df$value, NA)

ggplot(test.df, aes(q, variable, fill = value)) +
  geom_raster() +
  scale_fill_viridis(na.value = "yellow", #make NAs (values > 2) yellow
                     limits = c(-2,2), #define limits of scale
                     labels = c(as.character(-2:1), ">= 2"), breaks = -2:2)

在此处输入图像描述

此解决方案不如其他答案灵活,因为如果您的值超出范围的高端和低端范围,它将不起作用,但如果您只有异常值,这是一种简单、简洁的方法天平的一端。

于 2018-08-13T22:58:38.617 回答
2

您可以使用scale_fill_gradientn它来完全控制您的颜色渐变。下面的代码将分配不同的颜色,[-2, 2]但在这些值之外保持边缘颜色一致。请尝试使用set.seed可重复性在您的问题中设置种子。

ggplot(test.df, aes(q, variable, fill = value)) + 
  geom_raster() + 
  scale_fill_gradientn(
    colours = c("blue", "blue", "red", "red"),
    values = c(-999, -2, 2, 999)
  )

只需增加颜色和值的数量即可扩展颜色渐变。

于 2018-08-13T21:31:58.577 回答