【问题标题】:Separate background color for each plot in multiple plots多个图中每个图的单独背景颜色
【发布时间】:2017-01-11 22:29:16
【问题描述】:

在连续绘制 5 个箱形图时,我正在尝试制作条纹图(改变白色和灰色背景)。为什么背景颜色没有应用于我的代码中的整个情节?当我单独绘制箱形图时,背景颜色确实会发生变化。

set.seed(42)
dev.off()
windows(width=6, height=4)
par(mfrow=c(1,5))
par(mar=c(2,4,1,1)) # bottom, left, top and right

par(bg = 'white')
boxplot(rnorm(20), ylab = "A")
title(xlab="n = 54", line=0)

par(bg = 'grey')
boxplot(rnorm(20),  ylab = "B")
title(xlab="n = 54", line=0)

par(bg = 'white')
boxplot(rnorm(20),  ylab = "C")
title(xlab="n = 54", line=0)

par(bg = 'grey')
boxplot(rnorm(20),  ylab = "D")
title(xlab="n = 26", line=0)

par(bg = 'white')
boxplot(rnorm(20),  ylab = "E")
title(xlab="n = 6", line=0)

为了澄清,我希望下图中红色矩形内的区域为灰色。

【问题讨论】:

  • 我不确定您在问什么,但这可能会有所帮助:stackoverflow.com/questions/14604439/… 您的代码向我表明您对箱形图的填充颜色而不是图的背景颜色感兴趣.
  • 所以不仅仅是我的解决方案中的情节区域,而是整个区域
  • 顺便说一句,我的外观可以通过在第二次打印灰色背景的箱线图时添加col="white"来改善

标签: r plot boxplot


【解决方案1】:

对不起,这不漂亮,但我担心你能做的一切。

正如您发现的那样, bg 仅控制框本身的背景颜色,而不是整个情节。该解决方案具有将数据绘制两次的丑陋特征。一次得到所有将被绘制的位置,使用它来显示背景矩形,然后再次绘制数据。但我相信这就是你要找的。

set.seed(42)
dev.off()
windows(width=6, height=4)
par(mfrow=c(1,5))
par(mar=c(2,4,1,1)) # bottom, left, top and right

Data = rnorm(20)
boxplot(Data,  ylab = "A")
rect(par("usr")[1],par("usr")[3],par("usr")[2],par("usr")[4],col = "white")
boxplot(Data,  ylab = "A", add=TRUE)
title(xlab="n = 54", line=0)

Data = rnorm(20)
boxplot(Data,  ylab = "B")
rect(par("usr")[1],par("usr")[3],par("usr")[2],par("usr")[4],col = "grey")
boxplot(Data,  ylab = "B", add=TRUE)
title(xlab="n = 54", line=0)

Data = rnorm(20)
boxplot(Data,  ylab = "C")
rect(par("usr")[1],par("usr")[3],par("usr")[2],par("usr")[4],col = "white")
boxplot(Data,  ylab = "C", add=TRUE)
title(xlab="n = 54", line=0)

Data = rnorm(20)
boxplot(Data,  ylab = "D")
rect(par("usr")[1],par("usr")[3],par("usr")[2],par("usr")[4],col = "grey")
boxplot(Data,  ylab = "D", add=TRUE)
title(xlab="n = 26", line=0)

Data = rnorm(20)
boxplot(Data,  ylab = "E")
rect(par("usr")[1],par("usr")[3],par("usr")[2],par("usr")[4],col = "white")
boxplot(Data,  ylab = "E", add=TRUE)
title(xlab="n = 6", line=0)

【讨论】:

    【解决方案2】:

    这是一个ggplot 替代方案,它需要较少的硬编码。

    library(ggplot2)
    library(gridExtra)
    
    df <- data.frame(grp = rep(letters[1:5], c(12, 8, 11, 9, 10)), y = rnorm(50))
    
    grp <- unique(df$grp)
    cols <- c("grey80", "white")
    
    l <- vector(length = length(grp), "list")
    
    for(i in seq_along(grp)){
      dat <- df[df$grp == grp[i], ]
      col <- cols[i %% 2 + 1]
      p <- ggplot(dat) +  
        geom_boxplot(aes(x = factor(1), y = y), fill = col) +
        theme(plot.background = element_rect(fill = col),
              panel.background = element_rect(fill = col),
              panel.border = element_rect(fill = NA, colour = "black"),
              panel.grid = element_blank()) +
        scale_x_discrete(breaks = NULL) +
        xlab(paste0(grp[i], "\n", "n = ", nrow(dat)))
      l[[i]] <- p
    }
    
    do.call(grid.arrange, c(l, nrow = 1))
    


    解释:

    1. 将用于绘图的值放在 data.frame 中,并带有区分这些值的相关分组变量 ('grp')
    2. 创建一个唯一组向量 ('grp'),预先分配一个列表 ('l') 来存储绘图,并设置所需的填充颜色 ('cols')
    3. 循环遍历组的索引 (for(i in seq_along(grp)))
    4. 根据组对数据进行子集化 (df[df$grp == grp[i], ])
    5. 使用指示组索引的奇数/偶数值 (i %% 2 + 1) 的数字向量选择背景颜色,以交替使用灰色和白色背景。
    6. 绘图 (ggplot)
    7. 用“col”填充相关元素。根据口味修改其他theme元素
    8. 动态创建 x 个标签 (xlab):获取当前 'grp' 并计算样本大小 (nrow(dat))
    9. 将绘图分配给其列表元素 (l[[i]] &lt;- p)
    10. 使用gridExtra::grid.arrange 渲染和排列列表中的图
    11. 瞧!

    【讨论】:

      【解决方案3】:

      这是我能想到的最好的。我不得不通过反复试验来近似每个矩形的四个角。我注释掉了三个白色矩形,但没有正确调整它们的大小,但保留了代码以显示它们可以包含在所需的颜色中。

      setwd('C:/Users/general1/Documents/simple R programs/')
      
      jpeg(filename = "boxplot_background_color_with_layout.jpeg")
      
      set.seed(1223)
      par(xpd = NA, mar = c(2,4,1,1), bg = 'white')
      layout(matrix(c(1,2,3,4,5), 1, 5, byrow = TRUE))
      
      boxplot(rnorm(20), ylab = "A")
      title(xlab="n = 54", line=0)
      #rect(-1, -2.375, 1.585, 2, col = rgb(0,0,0,alpha=0.5), border=FALSE) 
      
      boxplot(rnorm(20), ylab = "B")
      title(xlab="n = 54", line=0)
      rect(-0.4, -2.229, 1.6, 2.0, col = rgb(0.5,0.5,0.5,alpha=0.5), border=FALSE) 
      
      boxplot(rnorm(20), ylab = "C")
      title(xlab="n = 54", line=0)
      #rect(-1, -2.375, 1.585, 2, col = rgb(0,0,0,alpha=0.5), border=FALSE)
      
      boxplot(rnorm(20), ylab = "D")
      title(xlab="n = 54", line=0)
      rect(-0.4, -2.5, 1.6, 2.5, col = rgb(0.5,0.5,0.5,alpha=0.5), border=FALSE) 
      
      boxplot(rnorm(20), ylab = "E")
      title(xlab="n = 54", line=0)
      #rect(-1, -2.375, 1.585, 2, col = rgb(0,0,0,alpha=0.5), border=FALSE)
      
      dev.off()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2015-01-04
        • 2023-02-21
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        相关资源
        最近更新 更多