我有两组数据,我想用一个带有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之间的差异很容易看出

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之间的差异很难看到

发布于 2018-01-24 18:50:32
您可以定义任意的重新标度函数。不确定这看起来有多好,可能需要一些图例工作,但原则上,这种机制允许您以任何方式将数据值映射到规模上。
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)

发布于 2019-02-19 10:01:53
编辑2022-05-03:现在刻度函数被称为scale_fill_viridis_c() .
@ClausWilke的解决方案更好,因为它显示在图例中,但有时只需要一个快速的解决方案,而不必编写太多的特定代码。这个程序还依赖于scales包。
ggplot(DataSet2, aes(x, y, fill = z)) +
geom_tile() +
scale_fill_viridis_c(limits = c(0.2, 1), oob = scales::squish) +
geom_text(aes(label = round(z, 2)), size = 2)

发布于 2018-01-24 16:06:29
你在找这样的东西吗?
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)

使用viridis颜色,asper推荐。
ggplot(DataSet2, aes(x, y, fill = z)) +
geom_tile() +
scale_fill_gradientn(colors = viridis_pal()(9), limits=c(0, 1.2),
na.value = "#FDE725FF") +
geom_text(aes(label = round(z, 2)), size = 2)

https://stackoverflow.com/questions/48424682
复制相似问题