多个图中每个图的单独背景颜色
Separate background color for each plot in multiple plots
在连续绘制 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)
说明一下,我希望下图中红色矩形内的区域为灰色。
对不起,这不是很好,但我担心你能做的一切。
如您所见,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)
这是我能想到的最好的。我不得不用 trial-and-error 来近似每个矩形的四个角。我注释掉了三个白色矩形,但没有正确调整它们的大小,但保留了代码以显示它们可以包含所需的颜色。
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()
这是一个 ggplot
替代方案,它需要更少 hard-coding。
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))
解释:
- 将用于绘图的值放在
data.frame
中,并使用相关的分组变量 ('grp') 区分值
- 创建一个唯一组向量 ('grp'),pre-allocate 一个列表 ('l') 来存储绘图,并设置所需的填充颜色 ('cols')
- 遍历组的索引 (
for(i in seq_along(grp))
)
- 根据组 (
df[df$grp == grp[i], ]
) 对数据进行子集化
- Select 背景颜色使用数字向量指示组索引的奇数/偶数值 (
i %% 2 + 1
),以交替灰色和白色背景。
- 情节 (
ggplot
)
- 用'col'填充相关元素。根据口味修改其他
theme
个元素
- 动态创建 x 个标签 (
xlab
):获取当前 'grp' 并计算样本量 (nrow(dat)
)
- 将绘图分配给它的列表元素 (
l[[i]] <- p
)
- 使用
gridExtra::grid.arrange
渲染和排列列表中的地块
- 瞧!
在连续绘制 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)
说明一下,我希望下图中红色矩形内的区域为灰色。
对不起,这不是很好,但我担心你能做的一切。
如您所见,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)
这是我能想到的最好的。我不得不用 trial-and-error 来近似每个矩形的四个角。我注释掉了三个白色矩形,但没有正确调整它们的大小,但保留了代码以显示它们可以包含所需的颜色。
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()
这是一个 ggplot
替代方案,它需要更少 hard-coding。
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))
解释:
- 将用于绘图的值放在
data.frame
中,并使用相关的分组变量 ('grp') 区分值 - 创建一个唯一组向量 ('grp'),pre-allocate 一个列表 ('l') 来存储绘图,并设置所需的填充颜色 ('cols')
- 遍历组的索引 (
for(i in seq_along(grp))
) - 根据组 (
df[df$grp == grp[i], ]
) 对数据进行子集化 - Select 背景颜色使用数字向量指示组索引的奇数/偶数值 (
i %% 2 + 1
),以交替灰色和白色背景。 - 情节 (
ggplot
) - 用'col'填充相关元素。根据口味修改其他
theme
个元素 - 动态创建 x 个标签 (
xlab
):获取当前 'grp' 并计算样本量 (nrow(dat)
) - 将绘图分配给它的列表元素 (
l[[i]] <- p
) - 使用
gridExtra::grid.arrange
渲染和排列列表中的地块 - 瞧!