2012-09-17 30 views
4

我是R新的故障,最近用它來製作一些BoxLots。我還在我的boxplot中添加了平均值和標準偏差。我想知道我是否可以在不同的百分點上添加某種刻度標記或圓圈。比方說,如果我想在每個HOUR boxplot中標記第85個,第90個百分點,有沒有辦法做到這一點?我的數據包括每小時在MW中的一年的裝載量&我的輸出包括每個月每小時24個箱形圖。我每個月都在做一次,因爲我不確定是否有辦法一次運行所有96個(每個月,平日/週末,4個不同的區域)箱形圖。預先感謝您的幫助。在R的箱櫃圖中添加不同的百分位數

JANWD <-read.csv("C:\\My Directory\\MWBox2.csv") 
JANWD.df<-data.frame(JANWD) 
JANWD.sub <-subset(JANWD.df, MONTH < 2 & weekend == "NO") 

KeepCols <-c("Hour" , "Houston_Load") 
HWD <- JANWD.sub[ ,KeepCols] 

sd <-tapply(HWD$Houston_Load, HWD$Hour, sd) 
means <-tapply(HWD$Houston_Load, HWD$Hour, mean) 

boxplot(Houston_Load ~ Hour, data=HWD, xlab="WEEKDAY HOURS", ylab="MW Differnce", ylim= c(-10, 20), smooth=TRUE ,col ="bisque", range=0) 

points(sd, pch = 22, col= "blue") 
points(means, pch=23, col ="red") 

#Output of the subset of data used to run boxplot for month january in Houston 
str(HWD) 
'data.frame': 504 obs. of 2 variables: 
`$ Hour  : int 1 2 3 4 5 6 7 8 9 10 ...' 
`$ Houston_Load: num 1.922 2.747 -2.389 0.515 1.922 ...' 

#OUTPUT of the original data 
str(JANWD) 
'data.frame': 8783 obs. of 9 variables: 
$ Date  : Factor w/ 366 levels "1/1/2012","1/10/2012",..: 306 306 306 306 306 306 306 306 306 306 ... 
`$ Hour  : int 1 2 3 4 5 6 7 8 9 10 ...' 
` $ MONTH  : int 8 8 8 8 8 8 8 8 8 8 ...' 
`$ weekend  : Factor w/ 2 levels "NO","YES": 1 1 1 1 1 1 1 1 1 1 ...' 
`$ TOTAL_LOAD : num 0.607 5.111 6.252 7.607 0.607 ...' 
`$ Houston_Load: num -2.389 0.515 1.922 2.747 -2.389 ...' 
`$ North_Load : num 2.95 4.14 3.55 3.91 2.95 ...' 
`$ South_Load : num -0.108 0.267 0.54 0.638 -0.108 ...' 
`$ West_Load : num 0.154 0.193 0.236 0.311 0.154 ...' 
+2

如果你的例子是[reproducible](http://stackoverflow.com/q/5963269/289572)(即可供我們玩的數據),我會試試看。而且我認爲只有在使用'boxplot'和'points'時你不需要'lattice'。 – Henrik

+0

當然。我如何向你發送樣本文件格式?對於不熟悉R數據集中的可重複示例,我表示歉意。 – Gyve

回答

5

以下是一種方法,使用quantile()爲您計算相關百分位數。我使用rug()添加標記。

set.seed(1) 
X <- rnorm(200) 
boxplot(X, yaxt = "n") 

## compute the required quantiles 
qntl <- quantile(X, probs = c(0.85, 0.90)) 

## add them as a rgu plot to the left hand side 
rug(qntl, side = 2, col = "blue", lwd = 2) 

## add the box and axes 
axis(2) 
box() 

更新:爲響應OP提供str()輸出,這裏是類似於OP具有到手的數據爲例:

set.seed(1) ## make reproducible 
HWD <- data.frame(Hour = rep(0:23, 10), 
        Houston_Load = rnorm(24*10)) 

現在得到你想要我相信蜱在第85百分位和第90百分位各Hour?如果是這樣,我們需要通過Hour的數據拆分,並通過quantile()計算爲我展示了前面:

quants <- sapply(split(HWD$Houston_Load, list(HWD$Hour)), 
       quantile, probs = c(0.85, 0.9)) 

這給:

R> quants <- sapply(split(HWD$Houston_Load, list(HWD$Hour)), 
+     quantile, probs = c(0.85, 0.9)) 
R> quants 
      0   1  2   3   4   5  6 
85% 0.3576510 0.8633506 1.581443 0.2264709 0.4164411 0.2864026 1.053742 
90% 0.6116363 0.9273008 2.109248 0.4218297 0.5554147 0.4474140 1.366114 
      7   8  9  10  11  12  13  14 
85% 0.5352211 0.5175485 1.790593 1.394988 0.7280584 0.8578999 1.437778 1.087101 
90% 0.8625322 0.5969672 1.830352 1.519262 0.9399476 1.1401877 1.763725 1.102516 
      15  16  17  18  19  20  21 
85% 0.6855288 0.4874499 0.5493679 0.9754414 1.095362 0.7936225 1.824002 
90% 0.8737872 0.6121487 0.6078405 1.0990935 1.233637 0.9431199 2.175961 
      22  23 
85% 1.058648 0.6950166 
90% 1.145783 0.8436541 

現在我們可以在箱線圖的x位置畫標記

boxplot(Houston_Load ~ Hour, data = HWD, axes = FALSE) 
xlocs <- 1:24 ## where to draw marks 
tickl <- 0.15 ## length of marks used 
for(i in seq_len(ncol(quants))) { 
    segments(x0 = rep(xlocs[i] - 0.15, 2), y0 = quants[, i], 
      x1 = rep(xlocs[i] + 0.15, 2), y1 = quants[, i], 
      col = c("red", "blue"), lwd = 2) 
} 
title(xlab = "Hour", ylab = "Houston Load") 
axis(1, at = xlocs, labels = xlocs - 1) 
axis(2) 
box() 
legend("bottomleft", legend = paste(c("0.85", "0.90"), "quantile"), 
     bty = "n", lty = "solid", lwd = 2, col = c("red", "blue")) 

生成的數字應該如下所示:

extended boxplot example

+0

謝謝Gavin。當我嘗試,我得到以下錯誤.--->在錯誤'[。數據框架(x,順序(x,na.last = na.last,遞減=遞減)):< - 我嘗試了一些像之前一樣,但我只獲得了第1小時的百分位,而不是其餘時間。 – Gyve

+0

這就是爲什麼一個可重複的例子有幫助。你可以用正確的格式填寫一些數據,並將其添加到你的問題中,以便我們可以看到你有什麼,然後提出相應的建議? –

+0

那麼,我在這裏研究了可重複使用的例子這個術語,並且試圖爲我的例子創建一個例子,並且失敗了。有辦法給我發電子郵件給你樣本數據嗎?我第一次在這個網站上,仍然試圖找出基本知識。抱歉給不便的人。 – Gyve