2016-05-13 2 views
1

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

Данные выглядит следующим образом

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 

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

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, но все же зеленый для той же температуры в верхней строке.

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

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

+0

Это просто дикая догадка, но, возможно, проблема заключается в том, что вы используете два geom_line вызовов. Какова структура вашего 'dataByYear'? Некоторые изменения данных должны позволить вам использовать один вызов geom_line. – zelite

+0

Возможно, но я хотел бы сохранить две строки, если это возможно, поскольку они являются независимыми данными. –

+0

Не могли бы вы объяснить, как данные необходимо реструктурировать? –

ответ

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

+0

Проверьте запись документа для этой функции, у нее есть хорошие примеры. 'df' - это ваш кадр данных (' dataByYear'), 'temp' и' value' - это имена столбцов для преобразованного (длинного) кадра данных. '-MESS_DATUM' - это спецификация преобразования (то есть, что использовать в качестве ключа). – tonytonov

+0

Возможно, вы должны установить 'tidyr' и заменить' df' 'dataByYear'. – tonytonov

+0

Сначала мне нужно было проверить руководство по тидиру, затем я узнал, что делать. Я обновил свой вопрос своим решением. Большое спасибо! –

1

Update 2 часа спустя ...

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

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

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

#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

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