如何限制绿色色标的范围?

时间:2018-01-24 14:20:30

标签: r ggplot2 viridis

我有两组数据,我想使用带有viridis色标的热图来呈现。对于第一个数据集,我的值范围从0到1.2,我可以很容易地看到我想看到的差异。然而,我的第二个数据集有一些异常值,导致范围从0到2.现在很难看到0到1之间有趣范围的差异,并且比较两个图像更难以实现直。是否有可能使用viridis色标显示0到1.2的数据,同时显示黄色的较高值("最高"绿色标度的颜色)? 这是一个例子:

library(viridis)

#Create Data
DataSet1 <- expand.grid(x = 0:5, y = 0:5)
DataSet1$z <- runif(36, 0, 1.2)

DataSet2 <- expand.grid(x = 0:5, y = 0:5)
DataSet2$z <- runif(36, 0, 2)

#Plot Data
ggplot(DataSet1, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_viridis() +
  geom_text(aes(label = round(z, 2)), size = 2)

DataSet1:0.5和0.7之间的差异很容易看出

enter image description here

ggplot(DataSet2, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_viridis() +
  geom_text(aes(label = round(z, 2)), size = 2)

DataSet2:0.5和0.7之间的差异很难看到

enter image description here

4 个答案:

答案 0 :(得分:4)

您可以定义任意重新缩放功能。不确定这看起来很棒,可能需要对图例进行一些处理,但原则上这种机制允许您以任何方式将数据值映射到比例尺上。

ggplot(DataSet2, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_viridis(rescaler = function(x, to = c(0, 1), from = NULL) {
    ifelse(x<1.2, 
           scales::rescale(x,
                           to = to,
                           from = c(min(x, na.rm = TRUE), 1.2)),
           1)}) +
  geom_text(aes(label = round(z, 2)), size = 2)

enter image description here

答案 1 :(得分:2)

你在找这样的东西吗?

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'siteService' is expected to be of type 'com.app.site.v2.SiteService' but was actually of type 'com.sun.proxy.$Proxy57'

enter image description here

使用 viridis 颜色,asper jazzurro推荐。

ggplot(DataSet2, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_gradient(low="green", high="red", limits=c(0, 1.2), 
                      na.value = "yellow") +
  geom_text(aes(label = round(z, 2)), size = 2)

enter image description here

答案 2 :(得分:0)

这不一定是改进,但你可以做这样的事情来显示更高的黄色值:

DataSet2A <- DataSet2 %>% filter(z <= 1.2)
DataSet2B <- DataSet2 %>% filter(z > 1.2)

ggplot(DataSet2A, aes(x, y, fill = z)) +
  geom_tile() +
  scale_fill_viridis(begin = 0, end = .75) +
  geom_text(aes(label = round(z, 2)), size = 2) +
  geom_tile(data = DataSet2B, aes(x, y), fill = "yellow")

enter image description here

也许如果您使用缩放以及缩放中的begin=end=参数来控制您正在使用的viridis比例的部分,可以达到你想要的效果。 (请注意,每个绘图只能有一个填充比例,但是您可以设置其他常量填充,就像我在这里用黄色一样。)

答案 3 :(得分:0)

@ClausWilke的解决方案更好,因为它可以显示在图例中,但是有时人们只需要一种快速的解决方案而不必编写太多特定的代码。这也依赖于scales

ggplot(DataSet2, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_viridis(limits = c(0.2, 1), oob = scales::squish) +
  geom_text(aes(label = round(z, 2)), size = 2)

enter image description here