我正在处理一些网格数据,但在处理离散发散尺度时遇到了问题。具体来说,如何设置中点使其不在范围的中心。这是一个可重现的例子来理解我的意思:
library(ggplot2)
grid <- expand.grid(lon = seq(0, 360, by = 2), lat = seq(-90, 0, by = 2))
grid$z <- with(grid, cos(lat*pi/180) - .7)
ggplot(grid, aes(lon, lat)) +
geom_raster(aes(fill = cut_width(z, .1))) +
scale_fill_brewer(palette = "RdBu")
在这里,尺度的中心不是正值和负值之间的分界线。我知道我可以使用连续比例尺,但我发现颜色越少对我想要展示的内容有帮助。
有没有办法在离散尺度上移动中点?也欢迎其他达到相同结果的替代方案。
最佳答案
问题是您的切割点没有在 0 附近对称下降,而是直接映射到您的颜色。一种方法是手动设置您的切割点,使它们以 0 为中心。然后,请确保不要在图例中删除未使用的级别:
zCuts <-
seq(-.7, 0.7, length.out = 10)
ggplot(grid, aes(lon, lat)) +
geom_raster(aes(fill = cut(z, zCuts))) +
scale_fill_brewer(palette = "RdBu"
, drop = FALSE)
如果您愿意使用渐变而不是这种离散颜色,则可以使用
scale_fill_gradient2
默认情况下,它以 0 为中心,范围介于两种颜色之间:ggplot(grid, aes(lon, lat)) +
geom_raster(aes(fill = z)) +
scale_fill_gradient2()
或者,如果您真的想要 Color Brewer 的插值,您可以设置
limits
参数在 scale_fill_distiller
并以这种方式获得渐变。在这里,我将它们设置在 +
和 -
0 附近的范围(max(abs(grid$z))
与 0 的偏差最大,无论是最小值还是最大值,以确保范围是对称的)。如果您使用的可用值超过 11 个,这可能是最好的方法:ggplot(grid, aes(lon, lat)) +
geom_raster(aes(fill = z)) +
scale_fill_distiller(palette = "RdBu"
, limits = c(-1,1)*max(abs(grid$z))
)
如果您想要更多颜色,而不进行渐变,您可能需要使用更多颜色手动构建自己的调色板。添加的越多,您发现的颜色之间的区别就越小。这是一个将两个调色板拼接在一起的示例,以确保您使用不同的颜色进行工作。
zCuts <-
seq(-.7, 0.7, length.out = 20)
myPallette <-
c(rev(brewer.pal(9, "YlOrRd"))
, "white"
, brewer.pal(9, "Blues"))
ggplot(grid, aes(lon, lat)) +
geom_raster(aes(fill = cut(z, zCuts))) +
scale_fill_manual(values = myPallette
, drop = FALSE)
关于r - ggplot2中离散发散尺度的中点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407909/