2016-05-13 171 views
1

我有我想正確着色的最小和最大溫度數據。使用ggplot2在R中對兩條線使用一條色標

的數據看起來像這樣

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的數值,它可以在底部顯示爲紅色,但對於頂部線上的相同溫度,它仍然爲綠色。

我想要一條用於兩條線的色階。 有沒有人有一個想法如何做到這一點?

在此先感謝。

+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

檢查該函數的doc條目,它有很好的例子。 'df'是你的數據幀('dataByYear'),'temp'和'value'是轉換(長)數據幀的列名。 '-MESS_DATUM'是轉換規範(即用作關鍵字的東西)。 – tonytonov

+0

您可能應該只安裝'tidyr'並用'dataByYear'替換'df'。 – tonytonov

+0

我必須先查看tidyr手冊,然後找出該做什麼。我用我的解決方案更新了我的問題。非常感謝! –

1

更新2個小時後...

好吧,我發現了什麼,我需要做的。

我的問題是,我的數據幀有更多的列,不應該由tidyr.gather()合併。我必須閱讀tidyr.gather()的文檔,但後來我發現我需要創建一個只有這3列的獨立數據框。然後我可以合併它們並在劇情中使用它們。

我的解決方案是首先創建一個單獨的數據框,然後在繪圖命令中調整變量名稱。

#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

相關問題