2017-01-11 121 views
3

我試圖在連續繪製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) 

爲了澄清,我想在裏面圖紅色矩形區域的下方是灰色的。

enter image description here

+0

我不確定你在問什麼,但這可能有所幫助:http://stackoverflow.com/questions/14604439/plot-multiple-boxplot-in-one-graph你的代碼表明你是對盒子圖的填充顏色感興趣,而不是圖的背景顏色。 –

+1

因此_not_不僅僅是我的解決方案中的繪圖區域,而是整個區域 – G5W

+1

順便說一句,通過在第二次用灰色背景打印箱形圖時添加'col =「white」'可以改進我的外觀 – G5W

回答

1

這是我已經能夠拿出最好的。我必須通過反覆試驗來逼近每個矩形的四個角。我評論了三個白色矩形,沒有正確調整大小,但保留了代碼以顯示它們可以包含所需的顏色。

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() 

enter image description here

2

對不起,這不是很漂亮,但我擔心這一切,你可以做。

正如你發現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) 

Boxplots with background

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)) 

enter image description here


說明:

  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)動態:抓住當前的「玻璃鋼」,並計算樣本量(nrow(dat)
  9. 情節分配給它的列表元素(l[[i]] <- p
  10. 使用gridExtra::grid.arrange渲染並安排在清單
  11. Voilà!