如何限制 viridis 色标的范围?
How do I limit the range of the viridis colour scale?
我有两组数据,我想使用带有绿色色标的热图来呈现它们。对于第一个数据集,我的值范围从 0 到 1.2,我可以很容易地看到我想要看到的差异。然而,我的第二个数据集有一些异常值,导致范围从 0 到 2。现在更难看出 0 和 1 之间有趣范围的差异,并且更难以直接比较两个图像。是否有可能使用 viridis 色标显示 0 到 1.2 的数据,同时以黄色显示较高的值("highest" viridis 色标的颜色)?
这是一个例子:
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 之间的差异
这不一定是改进,但您可以这样做以黄色显示更高的值:
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")
也许如果您在音阶中使用截止值以及 begin=
和 end=
参数,它们控制您正在使用的 viridis
音阶部分,就可以达到你想要的结果。 (请注意,每个绘图只能有一个填充比例,但您可以设置额外的常量填充,就像我在此处使用黄色所做的那样。)
您在找这样的东西吗?
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 jazzurro 推荐。
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)
您可以定义任意缩放函数。不确定这看起来是否很棒,可能需要对图例进行一些处理,但原则上,这种机制允许您以任何您想要的方式将数据值映射到比例尺上。
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)
编辑 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)
我有两组数据,我想使用带有绿色色标的热图来呈现它们。对于第一个数据集,我的值范围从 0 到 1.2,我可以很容易地看到我想要看到的差异。然而,我的第二个数据集有一些异常值,导致范围从 0 到 2。现在更难看出 0 和 1 之间有趣范围的差异,并且更难以直接比较两个图像。是否有可能使用 viridis 色标显示 0 到 1.2 的数据,同时以黄色显示较高的值("highest" viridis 色标的颜色)? 这是一个例子:
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 之间的差异
这不一定是改进,但您可以这样做以黄色显示更高的值:
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")
也许如果您在音阶中使用截止值以及 begin=
和 end=
参数,它们控制您正在使用的 viridis
音阶部分,就可以达到你想要的结果。 (请注意,每个绘图只能有一个填充比例,但您可以设置额外的常量填充,就像我在此处使用黄色所做的那样。)
您在找这样的东西吗?
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 jazzurro 推荐。
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)
您可以定义任意缩放函数。不确定这看起来是否很棒,可能需要对图例进行一些处理,但原则上,这种机制允许您以任何您想要的方式将数据值映射到比例尺上。
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)
编辑 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)