ggplot2用离散帽填充渐变填充梯度

时间:2017-04-26 17:26:52

标签: r ggplot2

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

总而言之,我希望填充从0到75的蓝色变为绿色,任何大于75的值都用红色填充。我现在的代码就是这样做了,但仍然从76到100的值从绿色到红色,而不是全部都是红色。

我在帖子中使用了Brian Diggs的答案(ggplot2 heatmap with colors for ranged values),但该答案并不包括如何处理填充梯度刻度的上限值以外的所有值。

帖子(ggplot geom_point() with colors based on specific, discrete values)似乎回答了一个非常类似的geom_point问题,但我无法将其改编为geom_tile。

我的示例代码如下,任何帮助表示赞赏!

#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 个答案:

答案 0 :(得分:2)

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

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,则会发生故障,正如我所提到的,将其显示在颜色栏中是另一个困境。

编辑补充:快速搜索提出了一些解决方案: Add a box for the NA values to the ggplot legend for a continous map