【问题标题】:Dynamically coloring boxplot in RR中的动态着色箱线图
【发布时间】:2023-03-27 16:23:01
【问题描述】:

我有以下列的数据:批次、子批次、大小、数据。我有多个批次,每个批次可以有多个子批次。每个子批次的大小为 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("red", "red", "red", .... "green", "green", "green", ... "blue").此解决方案的问题在于,它需要我先验地知道 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

【问题讨论】:

  • 如果您向reproducible example 提供示例输入数据(这不是您机器上的私人文件),则更容易提供帮助。有关如何执行此操作的提示,请参阅提供的链接。
  • 非常感谢您的帮助和指点。我想知道如何放置 xlsx 文件。我已将它放在带有可访问链接的 Google 驱动器上。

标签: r colors boxplot


【解决方案1】:

这就是我会做的:

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)

另外,如果你想要连续的颜色,你可以去掉df$size &lt;- as.factor(df$size)

【讨论】:

  • 哇——谢谢!我没有使用 ggplot 并试图在基本 R 包中执行此操作。这行得通。我没有找到 ggplot 包但是已经安装了 ggplot2。
  • @VikG 另一个错误。我的错。它应该是ggplot2。您也可以使用基本 R 包来执行此操作。 data ~ size * sublot * lot 为每个批次创建 16 个(4 个尺寸 * 4 个子批次)“盒子”,因此您只需将每种颜色重复 16 次,这是由前四行完成的。
  • 糟糕 - 太快按 Enter。对此的一个请求 - 该图仅显示沿 x 轴的批号 - 而箱线图用于 lot.sublot.size 组合。如何让 x 轴也沿 x 轴显示 lot.sublot.size?我尝试编辑上面的代码说 ... aes(lot.sublot... 和 ...aes(lot*sublot... 但都出错了。再次 - 感谢您的帮助。
  • @VikG 不幸的是,在您发表评论之前,我试图弄清楚这一点,但我无法做到。除非其他人想出答案,否则您将不得不坚持使用箱线图。您可以尝试改用facet_wrap 并尝试我上面的内容。它与您所要求的不同,但我认为这可能比将所有内容都放在 x 轴上更容易阅读。让我知道你的想法。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-12-09
    • 2019-09-28
    • 2021-12-19
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多