使用 base R 分组和堆叠条形图
Grouped and stacked barplot using base R
我想创建一个组合条形图,其中 data1 和 data2 堆叠在一起,而 data1 和 data2 之间在基本 R 图形中分组。
这样的安排:
data1 <- matrix(c(1:5, rep(1,5), rep(4,5)), ncol=5)
data2 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5)
# stacked bar
barplot(data1)
#grouped var
barplot(data1, beside=TRUE)
知道我该怎么做吗?我知道我们可以使用不同的图或方面来做到这一点,但我想在一个图中并排展示它们。
您可以尝试使用 mfrow
并排绘制两个图:
par(mfrow = c(1,2))
barplot(data1, ylim = c(0,13), xlab = "data1")
barplot(data2, ylim = c(0,13), axes = FALSE, xlab = "data2")
library(gridExtra)
data1 <- matrix(c(1:5, rep(1,5), rep(4,5)), ncol=5)
data2 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5)
# stacked bar
plot1 <- barplot(data1)
#grouped var
plot2<- barplot(data1, beside=TRUE)
grid.arrange(plot1, plot2, ncol=2)
您可以使用 barplot
的参数 space
来 移动第二个条形图:
# plot first barplot, using xlim to ensure there is enough space to plot the second one
# (here the spaces are all 0, so the bars are grouped together)
barplot(data1, space=0, xlim=c(-1, ncol(data1)+ncol(data2)+1), las=1)
# plot second barplot (with add=TRUE so the bars appear on the same plot),
# putting a space of 6 (the number of columns of data1 + 1) at the beginning,
# to plot the "new" bars on the right of the first bars (the other spaces are 0):
barplot(data2, space=c(ncol(data1)+1, rep(0, ncol(data2)-1)), las=1, add=TRUE)
我知道您正在寻找 base-R 解决方案。真遗憾。 ggplot2 为此类任务提供了巨大的可能性:
data3 = data.frame(data_nr = rep(c("data1","data2"), each=15),
cat_1 = rep(rep(letters[1:5], each=3),2),
cat_2 = rep(rep(LETTERS[1:3], 5),2),
height = c(1:5, rep(1,5), rep(4,5), 2:6, rep(2,5), rep(3,5)))
ggplot(data3, aes(x=cat_1, y=height, fill=cat_2)) +
geom_bar(stat="identity", position="stack") +
facet_grid(~ data_nr)
给出:
我可以想出一个(不太优雅的)纯 base-R 解决方案,使用一些技巧:
data12 = cbind(data1, rep(NA,3), data2)
barplot(data12, space=0)
给出:
这是自定义函数,您可以在组图之间和组内操作,并且可以使用您想要绘制的任意数量的数据来完成。
multistack.bar <- function(x=list(x), betweenspace = 2, withinspace=0, ...){
# note that number of rows in each component matrix of the list
# should be equal
# if you have missing value use "NA", to make it complete
# number of column can differ
mylist <- x
space = list()
space[[1]] <- c(rep(withinspace,ncol(mylist[[1]] )),betweenspace )
for ( i in 2:length(mylist)){
if(i == length(mylist)){
space[[i]] <- c(rep(withinspace,ncol(mylist[[i]] )-1))
} else{
space[[i]] <- c(rep(withinspace,ncol(mylist[[i]] )-1),betweenspace )
}
}
un.space <- c(unlist(space))
newdata <- do.call("cbind", mylist)
barplot(newdata, space= un.space, ...)
}
以下是三个数据集的示例。请注意,所有数据都具有相同的行数,但列不同。由于行值是堆叠的,应该是相同的数字,但可以通过为缺少的组放置 NA 或 0 来使行相等。
data1 <- matrix(c(1:5, rep(1,5), rep(4,5)), ncol=5)
data2 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5)
data3 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5)
data4 <- matrix(c(1:4, rep(1,4), rep(4,4)), ncol=4)
mylist <- list(data1, data2, data3, data4)
multistack.bar(mylist, betweenspace=3, withinspace=0.1,
col = c("pink", "blue", "purple"), xlab="groups", ylab="frequency", ylim = c(0, 16))
# you can decrease space between bars to 0 no space and between plots
multistack.bar(mylist, betweenspace=1, withinspace=0,
col = c("pink", "blue", "purple"), xlab="groups", ylab="frequency",
ylim = c(0, 16))
# now you can use any thing you want just make it elegant or useful.
legend(8, 14.8, c("A", "B", "C"), fill = c("pink", "blue", "purple"), ncol=3 )
abline(h=4, lty =2, col= "red")
我想创建一个组合条形图,其中 data1 和 data2 堆叠在一起,而 data1 和 data2 之间在基本 R 图形中分组。
这样的安排:
data1 <- matrix(c(1:5, rep(1,5), rep(4,5)), ncol=5)
data2 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5)
# stacked bar
barplot(data1)
#grouped var
barplot(data1, beside=TRUE)
知道我该怎么做吗?我知道我们可以使用不同的图或方面来做到这一点,但我想在一个图中并排展示它们。
您可以尝试使用 mfrow
并排绘制两个图:
par(mfrow = c(1,2))
barplot(data1, ylim = c(0,13), xlab = "data1")
barplot(data2, ylim = c(0,13), axes = FALSE, xlab = "data2")
library(gridExtra)
data1 <- matrix(c(1:5, rep(1,5), rep(4,5)), ncol=5)
data2 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5)
# stacked bar
plot1 <- barplot(data1)
#grouped var
plot2<- barplot(data1, beside=TRUE)
grid.arrange(plot1, plot2, ncol=2)
您可以使用 barplot
的参数 space
来 移动第二个条形图:
# plot first barplot, using xlim to ensure there is enough space to plot the second one
# (here the spaces are all 0, so the bars are grouped together)
barplot(data1, space=0, xlim=c(-1, ncol(data1)+ncol(data2)+1), las=1)
# plot second barplot (with add=TRUE so the bars appear on the same plot),
# putting a space of 6 (the number of columns of data1 + 1) at the beginning,
# to plot the "new" bars on the right of the first bars (the other spaces are 0):
barplot(data2, space=c(ncol(data1)+1, rep(0, ncol(data2)-1)), las=1, add=TRUE)
我知道您正在寻找 base-R 解决方案。真遗憾。 ggplot2 为此类任务提供了巨大的可能性:
data3 = data.frame(data_nr = rep(c("data1","data2"), each=15),
cat_1 = rep(rep(letters[1:5], each=3),2),
cat_2 = rep(rep(LETTERS[1:3], 5),2),
height = c(1:5, rep(1,5), rep(4,5), 2:6, rep(2,5), rep(3,5)))
ggplot(data3, aes(x=cat_1, y=height, fill=cat_2)) +
geom_bar(stat="identity", position="stack") +
facet_grid(~ data_nr)
给出:
我可以想出一个(不太优雅的)纯 base-R 解决方案,使用一些技巧:
data12 = cbind(data1, rep(NA,3), data2)
barplot(data12, space=0)
给出:
这是自定义函数,您可以在组图之间和组内操作,并且可以使用您想要绘制的任意数量的数据来完成。
multistack.bar <- function(x=list(x), betweenspace = 2, withinspace=0, ...){
# note that number of rows in each component matrix of the list
# should be equal
# if you have missing value use "NA", to make it complete
# number of column can differ
mylist <- x
space = list()
space[[1]] <- c(rep(withinspace,ncol(mylist[[1]] )),betweenspace )
for ( i in 2:length(mylist)){
if(i == length(mylist)){
space[[i]] <- c(rep(withinspace,ncol(mylist[[i]] )-1))
} else{
space[[i]] <- c(rep(withinspace,ncol(mylist[[i]] )-1),betweenspace )
}
}
un.space <- c(unlist(space))
newdata <- do.call("cbind", mylist)
barplot(newdata, space= un.space, ...)
}
以下是三个数据集的示例。请注意,所有数据都具有相同的行数,但列不同。由于行值是堆叠的,应该是相同的数字,但可以通过为缺少的组放置 NA 或 0 来使行相等。
data1 <- matrix(c(1:5, rep(1,5), rep(4,5)), ncol=5)
data2 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5)
data3 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5)
data4 <- matrix(c(1:4, rep(1,4), rep(4,4)), ncol=4)
mylist <- list(data1, data2, data3, data4)
multistack.bar(mylist, betweenspace=3, withinspace=0.1,
col = c("pink", "blue", "purple"), xlab="groups", ylab="frequency", ylim = c(0, 16))
# you can decrease space between bars to 0 no space and between plots
multistack.bar(mylist, betweenspace=1, withinspace=0,
col = c("pink", "blue", "purple"), xlab="groups", ylab="frequency",
ylim = c(0, 16))
# now you can use any thing you want just make it elegant or useful.
legend(8, 14.8, c("A", "B", "C"), fill = c("pink", "blue", "purple"), ncol=3 )
abline(h=4, lty =2, col= "red")