Pie*_*roB 2 r raster colors ggplot2 color-palette
我试图绘制一些全局地图(光栅文件),我在为我的数据设置一个好的色标时遇到了一些问题.我想做的是使用发散调色板(例如cm.colors)绘制我的数据,并且我想将这种比例的颜色"白色"居中,其值为零,但不必在比例中设置对称值(即相同的值,无论是消极的还是积极的,即limits=c(-1,1)).另外,我想用相同的颜色绘制高于和/或低于某个值的所有值.
换句话说,如果我们假设我的地图的范围是-100到150,我想用不同的调色板绘制我的地图,其中"白色"颜色对应于值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))
Run Code Online (Sandbox Code Playgroud)
有一些简单的方法可以实现此目的,例如事先截断数据,或者使用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])
Run Code Online (Sandbox Code Playgroud)
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))}
Run Code Online (Sandbox Code Playgroud)
但我之前想过这个任务,并对此感到不满意.预截断不会留下漂亮的标签,并且cut选项总是很繁琐(特别是必须调整seq内部参数cut并弄清楚如何重新定位分档).所以我试着定义一个可重用的转换,它会为你做截断和重新标记.
我没有完全调试这个,我要出城了,所以希望你或其他的回答者可以对它进行破解.主要问题似乎是边缘情况下的碰撞,因此有时候视觉上的限制与预期的中断重叠,以及格式化的一些意外行为.我只是使用了一些虚拟数据来创建所需的-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)))
Run Code Online (Sandbox Code Playgroud)
也可以使用盒装图例而不是彩条,只需使用 ... + guides(fill = guide_legend(label.hjust = 1, reverse = T)) + ...
| 归档时间: |
|
| 查看次数: |
1288 次 |
| 最近记录: |