2016-10-12 39 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)