2017-04-26 87 views
2

我正在寻找具有值的热图。我希望热图从低值(我的示例代码中为0)变为蓝色,高值(我的示例代码中为75)变为绿色。但是,数据包含的值大于75.我希望任何大于75的值都填充为红色。所以总而言之,我想要填充从0到75的顶端从蓝色到绿色,任何大于75的填充为红色。我现在有这样的代码是这样做的,但仍然从76-100的值从绿色变为红色,而不是全部变为红色。ggplot2使用分立顶点填充渐变

我已经在帖子中使用了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") 

回答

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,它在大多数美学尺度上具有特殊的可选值。当然,如果你的实际数据具有真正的NAs,这就会失效,正如我所提到的,让它出现在彩条上是另一个泥潭。

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

+1

该解决方案的伟大工程,我唯一的评论是,特定值的阴影依赖于其他值。换句话说,如果将此解决方案扩展为包含2个项目,每个项目包含一组从0到100的25个数据点,则值43可以具有不同于项目1的颜色阴影,而不是项目2可能具有的值关于其他24个数据点是什么。这看起来不是基于数据值而是根据其相对于其他数据点的位置缩放颜色分配。我正在为这个问题提出另一个问题。 – User247365

+1

简单的解决方法是在'breaks = c(0,25,50,75,Inf)'后添加'limits = c(0,75)'。这限制了总是返回相同的颜色条。然而,我认为你的观察是不正确的:无论其他值如何,43总会被映射到从“lightblue”到“lightgreen”的方式的72%。唯一的区别是其他值是否显示在彩条中。 – Brian

+0

玩过之后,你的观察是正确的,但“限制”仍然是你想要的解决方案。 – Brian