2017-05-04 94 views
1

我正在嘗試做一些預測數據的box和whisker繪圖。並且想要將觀察結果作爲一條線添加到情節。我在這裏生成一個數據樣本,以便您可以瞭解它的外觀。如何使用ggplot2將線條添加到boxplot

$forecasts<- data.frame(f_type=c(rep("A",9),rep("B",9)),Date=c(rep(as.Date("2007-01-31"),3),rep(as.Date("2007-02-28"),3),rep(as.Date("2007-03-31"),3),rep(as.Date("2007-01-31"),3),rep(as.Date("2007-02-28"),3),rep(as.Date("2007-03-31"),3)),value=c(10,50,60,05,90,20,30,46,39,69,82,48,65,99,75,15,49,27))

$observation<- data.frame(Dt=c(as.Date("2007-01-31"),as.Date("2007-02-28"),as.Date("2007-03-31")),obs=c(30,49,57))

與預測,我可以使用像GGPLOT2下面繪製盒須圖。

$p<- ggplot(data = forecasts, aes(x=as.factor(Date), y=value)) p<- p + geom_boxplot(aes(fill=f_type))

現在,我想補充的意見對那些日期爲線,以該地塊。到目前爲止,我已經嘗試了以下內容:

  1. $p<- p + geom_line(data = observation,aes(x=Dt,y=obs))。 這給出了一個錯誤說:

    Error: Invalid input: date_trans works with objects of class Date only

  2. 與x軸的因素是這樣的: $p<- p + geom_line(data = observation,aes(x=as.factor(Dt),y=obs))爲此,我得到以下錯誤:

    geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?

任何人都可以請建議我怎麼能完成這個?提前致謝。

回答

1

試試這個:

p<- ggplot(data = forecasts, aes(x=as.factor(Date), y=value)) 
p<- p + geom_boxplot(aes(fill=f_type)) 

p <- p + geom_hline(aes(yintercept=12), colour="#990000") 
p 

這裏有一個鏈接:http://www.cookbook-r.com/Graphs/Lines_(ggplot2)/

+0

我不想添加一條水平線。我想添加一條代表觀察結果的線。 –

1
forecasts<- data.frame(f_type = c(rep("A",9), rep("B",9)), Date = c(rep(as.Date("2007-01-31"),3), rep(as.Date("2007-02-28"),3), rep(as.Date("2007-03-31"),3), rep(as.Date("2007-01-31"),3), rep(as.Date("2007-02-28"),3), rep(as.Date("2007-03-31"),3)), value = c(10,50,60,05,90,20,30,46,39,69,82,48,65,99,75,15,49,27)) 

observation<- data.frame(Dt = c(as.Date("2007-01-31"), as.Date("2007-02-28"), as.Date("2007-03-31")), obs = c(30,49,57)) 
p <- ggplot(data = forecasts, aes(x = as.factor(Date), y = value)) 
p <- p + geom_boxplot(aes(fill = f_type)) 
p <- p + geom_line(data = observation,aes(x = as.factor(Dt), y = obs, group = 1)) 
print(p) 

boxplot with line

+0

謝謝。似乎使用geom_line的羣組參數解決了這個問題。 –

0
ggplot() + 
    geom_boxplot(data = forecasts, 
       aes(x = Date, y = value, 
        group = interaction(Date, f_type), 
        fill = f_type), 
       width = 10) + 
    geom_line(data = observations, 
      aes(x = Dt, y = obs), size = 2) 

這是你想要的。您需要x作爲連續日期變量(而不是您的代碼中的as.factor)。這種方式對於x軸的數據類型在兩個數據集中都是相同的。您需要添加group =行,以便它知道爲每個日期和f_type製作一個單獨的框。然後添加該行很簡單。

enter image description here

如果希望x是一個持續的日期,那麼你的as.factor使用是正確的,但你需要添加一個groupgeom_line所以它知道如何連接點跨離散因素。

ggplot() + 
    geom_boxplot(data = forecasts, 
       aes(x = as.factor(Date), y = value, 
        group = interaction(Date, f_type), 
        fill = f_type)) + 
    geom_line(data = observations, 
      aes(x = as.factor(Dt), y = obs, group = 1), size = 2) 

enter image description here

還要注意,我除去第二圖表的width選項(這意味着我只是使用默認ggplot值)。你可以玩這個價值,看看你的數據看起來最好。

最後,在我的兩個例子中,我將數據和美學轉移到要使用它們的geom聲明中。在複雜的圖形中,有時很難記住哪些圖層使用哪些數據和哪些美學,因此在調試和故障排除時,最好在主要的ggplot()調用中沒有任何數據。

+0

完美。我正在尋找像你的第二種方法。非常感謝。 –

+0

有沒有什麼辦法來定義這個情節的鬍鬚?我嘗試了stat_summary與定義的功能和geom =「boxplot」。雖然這確實包含了給定的範圍定義,但弄亂了這些組。 –

+0

定義如何?根據http://ggplot2.tidyverse.org/reference/geom_boxplot.html文檔,晶須延伸到四分位間距範圍的1.5倍,但可以使用geom_boxplot內的'coef ='進行調整。如果你想要鬍鬚是其他的統計,你需要一個函數像你嘗試的那樣傳遞給'stat_summary',但是你需要從上面包含'aes(...)'來保持分組的正確性。 – Brian