簡體   English   中英

在R中使用ggplot2的兩行使用一個色標

[英]Using one color scale for two lines in R with 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

這兩行獲得了單獨的色譜,但我希望兩條線都使用相同的光譜。 這是我用於此的代碼。

  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 )")

看起來像這樣

在此輸入圖像描述

正如您所看到的,顏色在某個溫度下並不是唯一的。 底線的紅色可以是15°C以上的紅色,但在頂線的相同溫度下仍然是綠色。

我想要一個同樣用於兩條線的色標。 有人知道怎么做嗎?

提前致謝。

歡迎來到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 )")

在此輸入圖像描述

2小時后更新......

好的,我發現了我需要做的事情。

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

我的解決方案是首先創建一個單獨的數據框,然后在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")

現在,這是我的最終結果。 看起來不錯。

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM