gpt4 book ai didi

r - ggplot2:通过设置连续色标处理极值

转载 作者:行者123 更新时间:2023-12-03 03:49:44 25 4
gpt4 key购买 nike

我正在尝试绘制一些全局 map (光栅文件),但在为数据设置良好的色标时遇到一些问题。我想做的是使用发散的调色板(例如 cm.colors)来绘制数据,并且我想将这种比例的颜色“白色”与值零居中,但不必须在比例中设置对称值(即负值和正值相同,即 limits=c(-1,1))。此外,我想用相同的颜色绘制高于和/或低于某个值的所有值。

换句话说,如果我们假设我的 map 的范围为 -100 到 150,我想使用发散调色板来绘制我的 map ,其中“白色”颜色对应于值 0,并且具有所有值,例如低于 -20 和高于 50 用相同的颜色绘制,即分别使用调色板的负极值和正极值。

这是我目前使用的代码示例:

ggplot(df, aes(y=Latitude, x=Longitude)) +
geom_raster(aes(fill=MAP)) +
coord_equal()+
theme_gray() +
theme(panel.background = element_rect(fill = 'skyblue2', colour = 'black'),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = "right",
legend.key = element_blank()) +
scale_fill_gradientn("MAP", limits=c(-0.5,1), colours=cm.colors(20))

最佳答案

有一些简单的方法可以实现此目的,例如预先截断数据,或使用 cut为适当的标签创建离散的垃圾箱。

require(dplyr)
df %>% mutate(z2 = ifelse(z > 50, 50, ifelse(z < -20, -20, z))) %>%
ggplot(aes(x, y, fill = z2)) + geom_tile() +
scale_fill_gradient2(low = cm.colors(20)[1], high = cm.colors(20)[20])

enter image description here

df %>% mutate(z2 = cut(z, c(-Inf, seq(-20, 50, by = 10), Inf)),
z3 = as.numeric(z2)-3) %>%
{ggplot(., aes(x, y, fill = z3)) + geom_tile() +
scale_fill_gradient2(low = cm.colors(20)[1], high = cm.colors(20)[20],
breaks = unique(.$z3), labels = unique(.$z2))}

enter image description here

但是我之前就考虑过这个任务,并对此感到不满意。预截断不会留下漂亮的标签,并且 cut选项总是很繁琐(特别是必须调整 seqcut 的参数并弄清楚如何将垃圾箱重新放置在中心位置)。因此,我尝试定义一个可重用的转换来为您进行截断和重新标记。

我还没有完全调试这个问题,而且我要出城,所以希望你或其他回答者可以尝试一下。主要问题似乎是边缘情况下的冲突,因此有时限制会与预期的视觉中断重叠,以及格式方面的一些意外行为。我只是使用一些虚拟数据来创建您想要的 -100 到 150 范围来测试它。

require(scales)
trim_tails <- function(range = c(-Inf, Inf)) trans_new("trim_tails",
transform = function(x) {
force(range)
desired_breaks <- extended_breaks(n = 7)(x[x >= range[1] & x <= range[2]])
break_increment <- diff(desired_breaks)[1]
x[x < range[1]] <- range[1] - break_increment
x[x > range[2]] <- range[2] + break_increment
x
},
inverse = function(x) x,

breaks = function(x) {
force(range)
extended_breaks(n = 7)(x)
},
format = function(x) {
force(range)
x[1] <- paste("<", range[1])
x[length(x)] <- paste(">", range[2])
x
})

ggplot(df, aes(x, y, fill = z)) + geom_tile() +
guides(fill = guide_colorbar(label.hjust = 1)) +
scale_fill_gradient2(low = cm.colors(20)[1], high = cm.colors(20)[20],
trans = trim_tails(range = c(-20,50)))

enter image description here

也可以使用盒装图例而不是颜色条,只需使用 ... + guides(fill = guide_legend(label.hjust = 1, reverse = T)) + ...

enter image description here

关于r - ggplot2:通过设置连续色标处理极值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44628130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com