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)
我知道你正在寻找一个基于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)
提供:
我可以想到一个纯基础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, ...)
}
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")
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(cbind(data1,data2),space=c(rep(0,ncol(data1)),2,rep(0,ncol(data2))))
的意思是绘制一个并列条形图,其中data1
和data2
是两个数据集,它们被合并在一起显示。space
参数用于调整两组数据之间的间距。 - WaltSncol(data2)-1
以消除警告) - user20650