关于r:ggplot2带有离散上限的比例填充梯度

ggplot2 scale fill gradient with discrete cap

我正在寻找价值的热点图。我希望热图从低值(示例代码中为0)的蓝色变为高值(示例代码中为75)的绿色。但是,数据包含的值大于75。我希望任何大于75的值都用红色填充。

因此,总而言之,我希望将填充从0的前75个蓝色缩放为绿色,并将大于75的任何值填充为红色。我现在使用的代码可以做到这一点,但是仍然可以将绿色值从76缩放为红色,而不是将它们全部设置为红色。

我在帖子中使用了Brian Diggs的答案(ggplot2热图,带有用于范围值的颜色),但是该答案并未涵盖如何填充超出梯度上限值的所有值。

帖子(ggplot geom_point()的颜色基于特定的离散值)似乎为geom_point回答了一个非常相似的问题,但是我很难将其调整为geom_tile。

我的示例代码在下面,感谢您的帮助!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#Check packages to use in library
{
  library('ggplot2')
  library('scales')
}

#Data

horizontal_position <- c(-2, -1, 0, 1, 2)
vertical_position <- c(-2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2)
data_val <- sample(0:100, 25)
all_data <-data.frame(horizontal_position, vertical_position, data_val)

     all_data %>%
      ggplot(aes(horizontal_position, vertical_position)) +
      geom_tile(aes(fill = data_val), colour ="transparent") +
      geom_text(aes(label = data_val),colour="white")+
      scale_fill_gradientn(colours = c("blue","lightblue","lightgreen","green","red"),
                           breaks=c(0,25,50,75,Inf),
                           guide ="colorbar")

这是一个部分解决方案,它为图形着色,但使图例不完全正确:

1
2
3
4
5
6
7
8
all_data %>%
  mutate(val2 = replace(data_val, data_val > 75, NA)) %>%
  ggplot(aes(horizontal_position, vertical_position)) +
  geom_tile(aes(fill = val2), colour ="transparent") +
  geom_text(aes(label = data_val),colour="white")+
  scale_fill_gradientn(colours = c("blue","lightblue","lightgreen","green"),
                       breaks=c(0,25,50,75,Inf),
                       na.value ="red")

enter image description here

技巧是将边界值设置为NA,该值在大多数美学标度中都有一个特殊的可选值。 当然,如果您的实际数据具有真实的NA,则这种情况会恶化,并且正如我提到的,将其显示在颜色栏中是另一个难题。

编辑添加:快速搜索提出了一些解决方案:
在连续图的ggplot图例中添加一个NA值框