Есть ли форма ggplot2 для "реверса" только одной оси (geom_bar ()), когда я строю две оси "y" в R - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь построить две оси «у», первая с «содержанием воды в почве» в% (geom_line ()) и geom_bar () с данными об осадках. Проблема в графике осадков. Мне нужно «повернуть» сюжет.

У меня есть этот график сейчас:

Soil water content (%) and precipitation (cm) time serie

, и мне нужны временные ряды содержания воды в почве, как на рисунке выше, но осадки, как на следующем изображении

precipitation as i need but water content reversed

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

, фрейм данных "hum_melt10" представляет собой фрейм данных с 3 столбцами: fecha = дата (ежедневно), значение = содержание воды (%) и переменная = если данныевзят из зонда o из модели

фрейм данных "pp_melt" представляет собой фрейм данных с 3 столбцами: fecha = дата (суточная), значение = см осадков за каждый день и переменная = если водаот осадков или орошения

gpp = ggplot() +
  geom_line(data = hum_melt10,aes(x = fecha, y = value, color = variable), size = 1.0) + 
  xlab("Fecha") +
  geom_bar(data = pp_melt, aes(x = fecha, y = value / 20, fill  = variable), stat="identity",position = 'dodge', na.rm = TRUE) +
  scale_y_continuous(name = "Contenido de agua (%)",sec.axis = sec_axis(~.*20, name = "pp y riego (cm)")) + 
  scale_x_date(breaks = '2 month', labels = fecha, date_labels = '%b %y') +
  theme(plot.title = element_text(lineheight=.8, face="bold", size = 20)) +
  theme_bw() + theme( panel.grid.major = element_blank(),
                      panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"), aspect.ratio = 0.3) 

Спасибо!

1 Ответ

2 голосов
/ 24 октября 2019

Соглашаясь с @dmp, использование sec_axis только добавляет метки справа;если вы хотите изменить то, как это выглядит на графике, вам нужно либо

  1. Использовать scale_y_reverse(), что перевернет все ;
  2. Вручную перевернитесериалы в эстетике;или
  3. Вручную переверните ряд в самих данных.

Поскольку вы хотите сторнировать только один из рядов данных, а не все, № 1 пропал. # 3 работает, хотя вам все равно нужно изменить вызов на sec_axis, поэтому я сделаю это просто: # 2.

library(ggplot2)
mt <- transform(mtcars, rn = 1:nrow(mtcars))
ggplot(mt) +
  geom_bar(aes(x = rn, y = drat), stat = "identity") +
  geom_line(aes(x = rn, y = disp/100), stat = "identity", color = "red", size = 1) +
  scale_y_continuous(sec.axis = sec_axis(~ . * 100))

ggplot of original data

Отражая только красную линию, мы меняем как то, как оно определено в эстетике (хотя это может быть изменено в самой раме), так и sec_axis.

ggplot(mt) +
  geom_bar(aes(x = rn, y = drat), stat = "identity") +
  geom_line(aes(x = rn, y = 5 - disp/100), stat = "identity", color = "red", size = 1) +
  # changes:                ^^^             vvv
  scale_y_continuous(sec.axis = sec_axis(~ (5 - .) * 100))

ggplot where one data is flipped in the aesthetic

(Важно помнить, что точка переворачивания (5 в приведенном выше примере) основана на масштабе главной оси, а не на новых данных.)

Без тестирования, я подозреваю, что исправление для вашего кода было бы примерно таким (где 9 выведено из графика).

gpp = ggplot() +
  geom_line(data = hum_melt10,aes(x = fecha, y = value, color = variable), size = 1.0) + 
  xlab("Fecha") +
  geom_bar(data = pp_melt, aes(x = fecha, y = 9 - value / 20, fill  = variable), stat="identity",position = 'dodge', na.rm = TRUE) +
  #  changes:                                 ^^^                          vvv
  scale_y_continuous(name = "Contenido de agua (%)", sec.axis = sec_axis(~(9 - .)*20, name = "pp y riego (cm)")) + 
  scale_x_date(breaks = '2 month', labels = fecha, date_labels = '%b %y') +
  theme(plot.title = element_text(lineheight=.8, face="bold", size = 20)) +
  theme_bw() + theme( panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"), aspect.ratio = 0.3) 
...