2017-01-16 24 views
1

我做了一個氣候圖,我使用geom_ribbon來顯示,降水在哪裏比溫度低。ggplot2:由一條線定義的更多單獨的色帶

但是,由於我在一行中定義了geom_ribbon,因此它想要將其中的一半合併爲一個,因此它使得灰色「線」的片段,就像您在圖像上看到的那樣。

你有什麼想法如何擺脫這個片段?

enter image description here

tit <- "Name" 
subtit <- "280 m a.s.l., 8.5 °C, 500 mm" 

abb<- c("J","F","M","A","M","J","J","A","S","O","N","D") 
magnify <- 2 
dat<-as.data.frame(1:12) 
dat$'1:12' <- clim$code 
names(dat) <- ("code") 
dat$T<-c(-4.2,-0.6,8.6,19.0,28.4,34.8,38.4,38.2,29.6,18.6,8.0,-0.8) 
dat$prec<-c(26,23,31,28,60,72,61,40,10,20,36,35) 
dat$code <- factor(1:12, levels = 1:12) 
dat$T <- dat$T * magnify 
head(dat) 
dat.new = cbind.data.frame(
    code=seq(1,12,length=200), 
    sapply(dat[,c("prec","T")], function(T) approxfun(dat$code, T)(seq(1,12,length=200))) 
)  
#subsetting data 
cut_max <- (dat.new$prec>=dat.new$T) 
cut_min <- (dat.new$prec<=dat.new$T) 
sub_max <- dat.new[cut_max, ] 
sub_min <- dat.new[cut_min, ] 

繪圖:

#plotting 
library(ggplot2) 
ggplot(dat.new, aes(x = code)) + 
    geom_ribbon(data = sub_max, aes(ymin = T, ymax = prec), alpha = 0.5, fill = "grey25") + 
    #geom_ribbon(data = sub_min, aes(ymin = T, ymax = prec), fill = "red", alpha = 0.2) + 
    geom_line(aes(y = prec, group = 1), colour = "blue", size = 1.5, alpha = 1) + 
    geom_line(aes(y = T, group = 1), colour = "red", size = 1.5, alpha = 1) + 
    expand_limits(y = 0, ymax = 200) + 
    geom_line(aes(y = 0, group = 1), size = 0.5) + 
    theme_bw() + 
    theme(plot.title = element_text(lineheight=.8, face="bold"))+ 
    scale_y_continuous(name = 'Precipitation (mm)', 
        sec.axis = sec_axis(trans = ~ . * (1/magnify), name = 'Temperature (°C)')) + 
    theme(legend.position = "none", 
     panel.grid.minor.y = element_blank(), 
     panel.grid.minor.x = element_blank(), 
     axis.title.x = element_blank(), 
     text=element_text(size=16, family="Comic Sans MS"))+ 
    scale_x_continuous(breaks=1:12, labels=abb)+ 
    labs(title = tit, subtitle = subtit) 
+1

您可以使用一個類似的技術[這個答案](http://stackoverflow.com/a/41663887/496488)本打算昨天問的問題,除非你想ymin和ymax等於溫度高於降水量的x值的紅色線的值(這樣,色帶將成爲紅線正下方的細線,因此將不可見)。 – eipi10

+1

其他一些事情:您可能希望將軸標題(可能是軸文本)的顏色設置爲降水的藍色,對於溫度的顏色設置爲紅色,以便更容易看出哪條軸適用於每條曲線。另外,爲了節省一些輸入,你可以使用'abb = substr(month.abb,1,1)'。 – eipi10

回答

1

您可以設置「組」,將共同繪製,這將讓他們與其他羣體成員通過設置group審美分開。通常,這用於爲單獨的單位/個人製作許多相同的行(或相似)。在你的情況下,你希望它是你試圖繪製的圖的不同部分。

因爲您的數據沒有任何自然組,所以您需要創建它們。在這裏,我使用dplyr對數據進行了一些操作,以創建將在其中包含組的新版本的sub_max。首先,我創建了一個專欄,說明我們是否保留那一行。接下來,我設置了一個標誌,以顯示我們想要突出顯示的部分何時開始以及何時我們要做的下一部分而不是想要突出顯示開始。然後,我將基於該標誌(組向上,以便在部分份額都排在同一組號碼,最後,我只保留我們要在突出的行。

newSubMax <- 
    dat.new %>% 
    mutate(toKeep = prec > T 
     , changed = toKeep != lag(toKeep, default = toKeep[1]) 
     , group = cumsum(changed)) %>% 
    filter(toKeep) 

現在,我們只需更換。您的舊geom_ribbon新數據,並添加group = groupaes映射只是該行現在是:

geom_ribbon(data = newSubMax 
      , aes(ymin = T 
        , ymax = prec 
        , group = group) 
      , alpha = 0.5, fill = "grey25") 

和整個情節代碼:

ggplot(dat.new, aes(x = code)) + 
    geom_ribbon(data = newSubMax 
       , aes(ymin = T 
        , ymax = prec 
        , group = group) 
       , alpha = 0.5, fill = "grey25") + 
    #geom_ribbon(data = sub_min, aes(ymin = T, ymax = prec), fill = "red", alpha = 0.2) + 
    geom_line(aes(y = prec, group = 1), colour = "blue", size = 1.5, alpha = 1) + 
    geom_line(aes(y = T, group = 1), colour = "red", size = 1.5, alpha = 1) + 
    expand_limits(y = 0, ymax = 200) + 
    geom_line(aes(y = 0, group = 1), size = 0.5) + 
    theme_bw() + 
    theme(plot.title = element_text(lineheight=.8, face="bold"))+ 
    scale_y_continuous(name = 'Precipitation (mm)', 
        sec.axis = sec_axis(trans = ~ . * (1/magnify), name = 'Temperature (°C)')) + 
    theme(legend.position = "none", 
     panel.grid.minor.y = element_blank(), 
     panel.grid.minor.x = element_blank(), 
     axis.title.x = element_blank(), 
     text=element_text(size=16, family="Comic Sans MS"))+ 
    scale_x_continuous(breaks=1:12, labels=abb)+ 
    labs(title = tit, subtitle = subtit) 

給出

enter image description here

+0

謝謝!我喜歡你的答案,因爲它更復雜。但我已經完成了eipi10在他的評論中提到的方式。我只是把它藏在降水藍線下。 –

相關問題