2016-10-12 78 views
0

我有以下列的數據:lot,sublot,size,data。我有多個地段,每個地段可以有多個子地段。每小批具有1至4在R中動態着色boxplot

我已經使用以下代碼創建該數據的箱線圖的大小(S):

df <- 
    readXL("Z:/R_Files/example.xlsx", 
    rownames=FALSE, header=TRUE, na="", sheet="Sheet1", 
    stringsAsFactors=TRUE) 

x11() 
par(mar=c(10.1, 5.1, 4.1, 2.1)) 
boxplot(data ~ size*sublot*lot, 
    xlab="", ylab="Data", main="Data by Size, Sublot, Lot", 
    las=2, 
    data=df) 
title(xlab='Size.Sublot.Lot', line=9) 

我想用boxfill命令着色基於所述各盒形圖很多#。我見過兩種解決方案:

  1. 創建一個向量並明確指定要使用的顏色,例如, colr = c(「紅色」,「紅色」,「紅色」,...「綠色」,「綠色」,「綠色」,...「藍色」)。這個解決方案的問題是它需要我先知道df中的批次數量和顏色需要重複的次數。
  2. 使用「ifelse」語句。這個解決方案的問題是(a)我需要知道批次的數量和(b)我需要創建多個嵌套的ifelse語句。

我寧願創建一個「動態」解決方案,它根據我在文件中的批次條目數創建顏色矢量。

我試圖創建:

uniqlot <- unique(df$lot) 
colr <- palette(rainbow(length(uniqlot))) 

但我堅持,因爲在COLR矢量項不重複進行的size.sublot.lot的獨特組合的數量。注意:我希望ABC批次的所有箱型圖都用一種顏色着色,批量DEF的所有箱型箱用另一種顏色着色等。

我附上了無色箱型圖的圖片。 Uncolored Boxplot

原始數據(example.xlsx)可以在下面的鏈接訪問: example.xlsx

+1

它更容易幫助,如果你提供一個[重複的例子(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)與樣品輸入數據(這不是您的機器上的私人文件)。請參閱提供的鏈接,瞭解如何做到這一點的提示。 – MrFlick

+0

非常感謝您的幫助和指點。我想知道如何放置xlsx文件。我已將它放在帶有可訪問鏈接的Google驅動器上。 – VikG

回答

0

這是我會做什麼:

n1 <- length(unique(df$sublot)) 
n2 <- length(unique(df$size)) 
colr <- palette(rainbow(length(n))) 
colr <- rep(colr, each = n1*n2) 

boxplot(data ~ size*sublot*lot, 
     col = colr, 
     xlab="", ylab="Data", main="Data by Size, Sublot, Lot", 
     las=2, 
     data=df) 

使用ggplot:

df$size <- as.factor(df$size) 

ggplot(df, aes(sublot, data, group = interaction(size, sublot), col = size)) + 
    geom_boxplot() + 
    facet_wrap(~lot, nrow = 1) 

enter image description here

另外,如果你想要連續的顏色,你可以擺脫df$size <- as.factor(df$size)

+0

哇 - 謝謝!我沒有使用ggplot,並試圖在基本R包中執行此操作。這工作。我沒有找到ggplot軟件包,但安裝了ggplot2。 – VikG

+0

@VikG另一個錯誤。我的錯。它應該是ggplot2。你也可以用base R包來做。 '數據大小*子槽*批次'爲每個批次創建16個(4個大小* 4個子批次)「框」,因此您只需要重複每種顏色16次,這由前四行完成。 – parksw3

+0

糟糕 - 打太快了。對此的一個要求 - 該圖僅顯示沿x軸的批號 - 而boxplots用於lot.sublot.size組合。我如何讓x軸也沿x軸顯示lot.sublot.size?我嘗試編輯上面的代碼來說... aes(lot.sublot ...和... aes(很多sublot ...但都出錯了。再次 - 謝謝你的幫助。 – VikG

0

感謝的反應與周圍多一點挖後提供的指針,我能夠找到一個解決方案,以我自己的問題。我想提交這段代碼以防有人需要複製。

下面是該代碼創建箱線圖的照片(我想創造)。 colored boxplot

df <- 
     readXL("Z:/R_Files/example.xlsx", 
     rownames=FALSE, header=TRUE, na="", sheet="Sheet1", 
     stringsAsFactors=TRUE) 

unqlot <- unique(df$lot) 
unqsublot <- unique(df$sublot) 
unqsize <- unique(df$size) 
cul  <- palette(rainbow(length(unqlot))) 
culur  <- character() 

for (i in 1:length(unqsize)) { 
    culur_temp = rep(cul[i], each=(length(unqsize)*length(unqsublot))) 
    culur = c(culur, culur_temp) 
} 

par(mar=c(10.1, 5.1, 4.1, 2.1)) 
boxplot(data ~ size*sublot*lot, 
    xlab="", ylab="Data", main="Data by Size, Sublot, Lot", 
    col = culur, 
    las=2, 
    data=df)