ggplot2中离散分歧尺度的中点

时间:2016-11-03 17:35:53

标签: r plot 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")

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

有没有办法以离散比例改变中点?其他可以达到相同结果的替代方案也是受欢迎的。

1 个答案:

答案 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)

enter image description here

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

ggplot(grid, aes(lon, lat)) +
  geom_raster(aes(fill = z)) +
  scale_fill_gradient2()

enter image description here

或者,如果您真的想要从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))
                       )

enter image description here

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

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)

enter image description here