r - ggplot2中离散发散尺度的中点

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



在这里,尺度的中心不是正值和负值之间的分界线。我知道我可以使用连续比例尺,但我发现颜色越少对我想要展示的内容有帮助。

有没有办法在离散尺度上移动中点?也欢迎其他达到相同结果的替代方案。

最佳答案

问题是您的切割点没有在 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

关于r - ggplot2中离散发散尺度的中点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407909/

相关文章:

R:使用 MatchIt 进行倾向得分匹配。如何使用replace = TRUE查找匹配观察值的数量?

r - 用另一个具有不同列名的 data.table 过滤 data.table

Matlab 在标准差线之间绘制不同的阴影

r - 在 ggplot 条形图和箱线图上放置星星 - 以指示显着性水平(p 值)

r - 控制R中ggplot2中scale_colour_gradient的刻度限制和方向?

r - 将自 2000 年 1 月 1 日以来的天数转换为日期格式

R 水平图和插值

加法双向表 Tukey 图的 R 实现

python - 如何删除 Matplotlib 图中的线条

r - 指定图例列中的因子数