Сбросить color aestheti c при использовании нескольких аргументов ggplot2 geom_crossbar - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь контролировать цвет двух отдельных вызовов geom_crosbar, используя зеленый для первого графика и синий для второго графика. Однако я получаю предупреждение от второго вызова geom_crossbar. Масштаб для «заливки» уже присутствует:

Предупреждение: добавление другого масштаба для «заливки», который заменит существующий масштаб.

Вот пример моего кода:

   my.data %>%
   ggplot(aes(site, npp_nofert)) +
    geom_crossbar(aes(ymin=npp_nofert-npp.sd_nofert,ymax=npp_nofert+npp.sd_nofert, 
                      fatten=1.0,fill=period),position='dodge', alpha=0.5)   +
    scale_fill_brewer(palette="Greens") + 
    #labs(y=expression(paste("MMM %",Delta," (+/- 1",sigma,")")), x="", fill="", title="") + theme_bw() + 
    labs(y="",x="", fill="", title="") + theme_bw() + 
    theme(legend.key.size=unit(1.0,"cm"),legend.direction="horizontal",legend.position=c(0.3,0.05), 
          axis.text.x=element_blank(),axis.ticks.x=element_blank(), 
          plot.title=element_text(size=12,margin=margin(t=5,b=-20)), legend.spacing=unit(0,"cm"),
          text = element_text(size=15)) + 
   new_scale_fill() +
   geom_crossbar(aes(ymin=npp_fert-npp.sd_fert,ymax=npp_fert+npp.sd_fert, fatten=1.0,fill=period), 
                 position='dodge',alpha=0.5)   +
   scale_fill_brewer(palette="Blues")

И пример вывода: enter image description here

К сожалению, я не могу dput() data, поскольку у меня нет на это разрешения. Как я могу сделать первый график зеленым, а второй синий? Кроме того, только что заметил призыв к альфе в легенде. Как это убрать?

Примечания: Период с 1980 по 1999 год, есть только один участок (т.е. без обработки), поэтому для этого периода не будет наложенных участков. Ось x представляет места изучения, я могу исправить метки позже.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Общий способ go об этом заключался бы в использовании пакета ggnewscale, который позволяет вам «сбросить» aestheti c в какой-то момент процесса построения.

Так как там нет данных для использования, я сделаю несколько фиктивных данных, которые имеют смутное сходство с тем, что вы показываете выше.

library(ggplot2)
library(ggnewscale)

df <- data.frame(
  x = 1:5,
  blue_low = 1:5,
  blue_mid = 2:6,
  blue_high = 3:7,
  green_low = 0:4,
  green_mid = 2:6,
  green_high = 4:8
)

ggplot(df, aes(x = 1, group = x)) +
  geom_crossbar(aes(ymin = green_low, y = green_mid, ymax = green_high, 
                    fill = as.factor(x)),
                position = "dodge", alpha = 0.5) +
  scale_fill_brewer(palette = "Greens") +
  new_scale_fill() + # Important to put this after you defined the first scale
  geom_crossbar(aes(ymin = blue_low, y = blue_mid, ymax = blue_high, 
                    fill = paste0(x, "_blue")), # paste to differentiate scale
                position = "dodge", alpha = 0.5) +
  scale_fill_brewer(palette = "Blues")

Создано 2020-06-18 с помощью пакета REPEX (v0.3.0)

Я уверен, что взять new_scale_fill() и вставить его не составит труда правильная позиция в вашем коде построения, который, я думаю, находится после scale_fill_brewer(palette="Greens").

0 голосов
/ 19 июня 2020

Итак, я решил, что подход, который я использовал для сюжета, выглядит ужасно. Лучшее решение, IMO, - использовать geom_crossbar с geom_pointrange.

Вот пример с использованием данных, которые предоставил Teubrand:

library(ggplot2)
library(ggnewscale)

df <- data.frame(
  x = 1:5,
  blue_low = 1:5,
  blue_mid = 2:6,
  blue_high = 3:7,
  green_low = 0:4,
  green_mid = 2:6,
  green_high = 4:8
)

ggplot(df, aes(x = 1, group = x)) +
   geom_crossbar(aes(ymin = green_low, y = green_mid, ymax = green_high, 
                     fill = as.factor(x)),
                 position = "dodge", alpha = 0.8) +
   scale_fill_brewer(palette = "Greens") +
   new_scale_fill() + # Important to put this after you defined the first scale
   geom_pointrange(aes(ymin = blue_low, y = blue_mid, ymax = blue_high, 
                     fill = as.factor(x)), # paste to differentiate scale
                 position = position_dodge(width=0.9), color="gray30") +
   scale_fill_brewer(palette = "Blues")

enter image description here

...