ggplot2中离散分歧尺度的中点

Eli*_*lli 4 plot r ggplot2

我正在使用一些网格数据,而且我在使用离散分支秤时遇到了问题.具体来说,如何设置中点使其不在范围的中心.这是一个可重现的例子来得到我的意思:

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")
Run Code Online (Sandbox Code Playgroud)

这里,标度的中心不是正值和负值之间的分界线.我知道我可以使用连续刻度,但我发现颜色较少有助于我想要显示的内容.

有没有办法在不连续的尺度上改变中点?其他可以达到相同结果的替代方案也是受欢迎的.

Mar*_*son 13

问题是你的切割点不是在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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你愿意使用渐变而不是这种离散颜色,你可以使用scale_fill_gradient2默认中心为0和两种颜色之间的范围:

ggplot(grid, aes(lon, lat)) +
  geom_raster(aes(fill = z)) +
  scale_fill_gradient2()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者,如果您真的想要从Color Brewer进行插值,您可以设置limits参数scale_fill_distiller并以此方式获得渐变.在这里,我将它们设置为0 +-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))
                       )
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你想要更多颜色而不做渐变,你可能需要手动构建自己的调色板,颜色更多.添加的越多,您找到的颜色之间的区别就越小.这是一个将两个调色板拼接在一起的示例,以确保您使用不同的颜色.

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述