[英]Plotting Several Grouped Bar Plots in Loop [R]
我的挑战是一次绘制多个条形图,每个不同子集的变量绘制一个图。 我的目标是比较每个变量的区域差异。 我想通过R Markdown将所有结果图打印到html文件中。
我制作自动分组条形图的主要困难是,您需要使用table(data$Var[i], data$Region)
将组列表化table(data$Var[i], data$Region)
但是我不知道如何自动执行此操作。 我对此表示感谢。
这是我的一个子集的示例:
# To Create this example of data:
b <- rep(matrix(c(1,2,3,2,1,3,1,1,1,1)), times=10)
data <- matrix(b, ncol=10)
colnames(data) <- paste("Var", 1:10, sep = "")
data <- as.data.frame(data)
reg_name <- c("North", "South")
Region <- rep(reg_name, 5)
data <- cbind(data,Region)
使用beside = TRUE
,我可以创建一个分组的条形图(根据数据对Var1按Region分组):
tb <- table(data$Var1,data$Region)
barplot(tb, main="Var1", xlab="Values", legend=rownames(tb), beside=TRUE,
col=c("green", "darkblue", "red"))
我想循环此过程以生成例如Var1到Var10的10个图:
for(i in 1:10){
tb <- table(data[i], data$Region)
barplot(tb, main = i, xlab = "Values", legend = rownames(tb), beside = TRUE,
col=c("green", "darkblue", "red"))
}
R更喜欢apply
系列函数,因此我尝试创建一个要应用的函数:
fct <- function(i) {
tb <- table(data[i], data$Region)
barplot(tb, main=i, xlab="Values", legend = rownames(tb), beside = TRUE,
col=c("green", "darkblue", "red"))
}
sapply(data, fct)
我尝试了其他方法,但从未成功。 也许lattice
或ggplot2
将提供更简单的方式来做到这一点。 我只是从R开始,我会很乐意接受任何提示和建议。 谢谢!
(我在Windows上运行,带有最新的Rv3.1.2“泵浦头盔”)
假设您说“我的目标是比较每个变量的区域差异”,那么我不确定您是否选择了最佳绘图策略。 但是可以,您可以按照自己的要求去做。
这是上面的代码提供的默认图,以供参考:
如果您想要一个包含每个变量10个图的列表,则可以执行以下操作(使用ggplot)
many_plots <-
# for each column name in dat (except the last one)...
lapply(names(dat)[-ncol(dat)], function(x) {
this_dat <- dat[, c(x, 'Region')]
names(this_dat)[1] <- 'Var'
ggplot(this_dat, aes(x=Var, fill=factor(Var))) +
geom_bar(binwidth=1) + facet_grid(~Region) +
theme_classic()
})
示例输出,用于many_plots[[1]]
:
如果您希望所有绘图都在一幅图像中,则可以执行此操作(使用reshape和data.table)
library(data.table)
library(reshape2)
dat2 <-
data.table(melt(dat, id.var='Region'))[, .N, by=list(value, variable, Region)]
ggplot(dat2, aes(y=N, x=value, fill=factor(value))) +
geom_bar(stat='identity') + facet_grid(variable~Region) +
theme_classic()
...但这不是一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.