У меня есть данные о минимальной и максимальной температуре, которые я хочу правильно раскрасить.

Данные выглядят так

 MESS_DATUM  LUFTTEMPERATUR_MAXIMUM LUFTTEMPERATUR_MINIMUM
20050719       22.1    16.5
20050720       22.8    12.8
20050721       22.6    12.0
20050722       19.1    13.8
20050723       21.9    12.8
20050724       24.8    11.4
20050725       25.8    16.9
20050726       24.7    16.3
20050727       31.6    17.0
20050728       34.5    19.2
20050729       27.3    18.2
20050730       25.5    13.4
20050731       24.5    11.5
20050801       24.4    12.5
20050802       22.1    14.6
20050803       24.9    15.2
20050804       23.4    11.3
20050805       23.4     9.1
20050806       21.0    12.0
20050807       19.2     9.8
20050808       19.2    10.8
20050809       21.0    11.2
20050810       20.2    10.2

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

  p2<-ggplot(dataByYear) +
geom_line(aes(x = MESS_DATUM,y = LUFTTEMPERATUR_MINIMUM, colour = LUFTTEMPERATUR_MINIMUM)) +
geom_smooth(aes(x = MESS_DATUM,y = LUFTTEMPERATUR_MINIMUM), color = "blue",size = 0.5) +
geom_line(aes(x = MESS_DATUM,y = LUFTTEMPERATUR_MAXIMUM, colour = LUFTTEMPERATUR_MINIMUM)) +
geom_smooth(aes(x = MESS_DATUM,y = LUFTTEMPERATUR_MAXIMUM), color = "red",size = 1) +
scale_colour_gradient2(low = "blue", mid = "green" , high = "red", midpoint = 10) +
scale_y_continuous(limits = c(-10,40), breaks = seq(-10,40,5)) +
ggtitle ("Daily average temperature") +
xlab("Date") +  ylab ("Average Temperature ( ºC )")

Это выглядит так

enter image description here

Как видите, цвет не является уникальным для определенной температуры. Он может быть красным в нижней строке для значений выше 15 ° C, но все еще зеленым при той же температуре в верхней строке.

Мне нужна цветовая шкала, которая одинаково используется для обеих линий. Кто-нибудь знает, как это сделать?

Заранее спасибо.

1
Martin S 13 Май 2016 в 16:27

2 ответа

Лучший ответ

Добро пожаловать в SO! Вот быстрое решение: дополнительно используйте group для расплавленных данных. Не обращайте внимания на сломанную дату, я не стал ее исправлять, с вашим фреймом данных все должно быть хорошо. Тем не менее, вы можете увидеть общую цветовую шкалу по желанию.

ggplot(tidyr::gather(df, temp, value, -MESS_DATUM), 
       aes(x = MESS_DATUM, y = value, colour = value)) +
  geom_line(aes(group = temp)) +
  geom_smooth(data = df, aes(x = MESS_DATUM,y = LUFTTEMPERATUR_MINIMUM), color = "blue",size = 0.5) +
  geom_smooth(data = df, aes(x = MESS_DATUM,y = LUFTTEMPERATUR_MAXIMUM), color = "red",size = 1) +
  scale_colour_gradient2(low = "blue", mid = "green" , high = "red", midpoint = 10) +
  scale_y_continuous(limits = c(-10,40), breaks = seq(-10,40,5)) +
  ggtitle ("Daily average temperature") +
  xlab("Date") +  ylab ("Average Temperature ( ºC )")

enter image description here

2
tonytonov 13 Май 2016 в 14:01

Обновить через 2 часа ...

Хорошо, я понял, что мне нужно делать.

Моя проблема заключалась в том, что в моем фрейме данных было еще больше столбцов, которые не следует объединять с помощью tidyr.gather (). Мне пришлось прочитать документацию tidyr.gather (), но потом я понял, что мне нужно создать отдельный фрейм данных только с этими тремя столбцами. Затем я мог объединить их и использовать в сюжете.

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

#Prepare data frame for ggplot
df <-
data.frame(
  dataByYear$MESS_DATUM,
  dataByYear$LUFTTEMPERATUR_MAXIMUM,
  dataByYear$LUFTTEMPERATUR_MINIMUM
)

#Plot data
#tidyr::gather creates Key/Values pairs temp/Temperatures which are used to
#diplay the values equally colored
p2 <-
 ggplot(
  tidyr::gather(df, temp, Temperature,-dataByYear.MESS_DATUM),
  aes(x = dataByYear.MESS_DATUM, y = Temperature, colour = Temperature)
) +
geom_line(aes(group = temp)) +
geom_smooth(
  data = df,
  aes(x = dataByYear.MESS_DATUM, y = dataByYear.LUFTTEMPERATUR_MINIMUM),
  color = "blue",
  size = 0.5
) +
geom_smooth(
  data = df,
  aes(x = dataByYear.MESS_DATUM, y = dataByYear.LUFTTEMPERATUR_MAXIMUM),
  color = "red",
  size = 1
) +
scale_colour_gradient2(
  low = "blue",
  mid = "green" ,
  high = "red",
  midpoint = 10
) +
scale_y_continuous(limits = c(-10, 40), breaks = seq(-10, 40, 5)) +
ggtitle ("Daily average temperature") +
xlab("Date") +  ylab ("Average Temperature ( ºC )") +
scale_x_date(date_breaks = "1 month", date_labels = "%b")

Это мой окончательный результат. Выглядит хорошо.

enter image description here

1
Martin S 13 Май 2016 в 22:03