2016-11-03 7 views
1

Я работаю с некоторыми данными сетки, и у меня возникают проблемы с работой с дискретными расходящимися шкалами. В частности, как установить среднюю точку, чтобы она не находилась в центре диапазона. Это воспроизводимый пример, чтобы получить то, что я имею в виду:Средняя точка дискретного расходящегося масштаба в 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") 

Здесь, в центре шкалы не разрыв между положительными и отрицательными значениями. Я знаю, что могу использовать непрерывный масштаб, но я считаю, что с меньшим количеством цветов помогает то, что я пытаюсь показать.

Есть ли способ сдвинуть среднюю точку в дискретном масштабе? Также приветствуются другие альтернативы, которые достигают такого же результата.

ответ

5

Проблема заключается в том, что ваши точки резания не падают симметрично вокруг 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

+0

Я полагал, что я должен был сделать что-то подобное. Благодарю. Теперь я пытаюсь использовать расширенную палитру (поскольку на моем реальном сюжете мне нужно больше, чем 11 цветов, предлагаемых пивоваром), и проблема в том, что в нем нет легенды 'ggplot (сетка, aes (долгота, широта)) + geom_raster (АЕС (заполняющая = покрой (г, порезы))) + scale_fill_manual (палитра = div_pal, имя = "Z", scale_name = "г", падение = F) ' –

+0

Обычно 'scale _ * _ manual' принимает аргумент' values', а не 'palette'. Что такое 'div_pal'? Является ли это функцией или вектором цветов? –

+0

Это функция, сделанная с помощью colorRampPalette, чтобы расширить масштаб RdBu от цветного пивовара: 'div_pal <- colorRampPalette (пивовар.pal (name = "RdBu", n = 11)) ' –

Смежные вопросы