我正在使用一些网格数据,而且我在使用离散分支秤时遇到了问题。具体来说,如何设置中点使其不在范围的中心。这是一个可以重现的例子来得到我的意思:
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 :(得分:12)
问题是你的切割点不是在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)