在R中动态着色boxplot

时间:2016-10-12 18:30:38

标签: r colors boxplot

我有以下列的数据:lot,sublot,size,data。我有多个批次,每个批次可以有多个子批次。每个子图的大小为1到4。

我使用以下代码为此数据创建了一个箱形图:

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语句。
  3. 我更愿意创建一个“动态”解决方案,根据我文件中的批次条目数创建颜色向量。

    我试图创建:

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

    但是因为colr向量中的条目没有重复size.sublot.lot的唯一组合的数量而被卡住了。注意:我希望批量ABC的所有箱图都用一种颜色着色,所有用于批量DEF的箱图用另一种颜色着色等。

    我正在附上未上色的箱线图。 Uncolored Boxplot

    可以通过以下链接访问原始数据(example.xlsx): example.xlsx

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

感谢回复中提供的指针,经过深入挖掘后,我能够找到解决自己问题的方法。我想提交这段代码以防有人需要复制。

这是此代码创建的boxplot的图片(我想创建)。 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)