这个问题在这里已有答案:
我有一个非常奇怪的问题......我正在尝试在循环中创建绘图并将它们放到列表中,之后将它们全部绘制在一个页面上。当我这样做时:
for (i in 1:ncol(df)){
plot[[i]] <- ggplot(df, aes(x = df[,i], y=(..count..)/sum(..count..))) +
geom_bar(fill="#003366") +
labs(title = dfcolnames[i], x = "Variable Values", y = "Frequency")
}
return(multiplot(plotlist=plot, cols = 2))
我得到3个相同的图,但是当我没有for循环时这样做:
plot[[1]] <- ggplot(df, aes(x = df[,1], y=(..count..)/sum(..count..))) + geom_bar(fill="#003366") + labs(title = dfcolnames[1], x = "Variable Values", y = "Frequency")
plot[[2]] <- ggplot(df, aes(x = df[,2], y=(..count..)/sum(..count..))) + geom_bar(fill="#003366") + labs(title = dfcolnames[2], x = "Variable Values", y = "Frequency")
plot[[3]] <- ggplot(df, aes(x = df[,3], y=(..count..)/sum(..count..))) + geom_bar(fill="#003366") + labs(title = dfcolnames[3], x = "Variable Values", y = "Frequency")
return(multiplot(plotlist=plot, cols = 2))
我得到了正确的情节(三种不同)。我不明白发生了什么......有什么想法吗?
问题是aes()
执行惰性评估。传递给aes()
的值仅在您实际绘制绘图时才会得到解决。你真的应该只是将符号名称传递给aes()
。这是因为在循环结束后,i
将被固定在它的循环的最后一个值,你将获得相同的情节三次。
您可以使用aes_string
并循环遍历列名称
plot <- lapply(names(df), function(colname) {
ggplot(df, aes_string(x = colname, y="(..count..)/sum(..count..)")) +
geom_bar(fill="#003366") +
labs(title = colname, x = "Variable Values", y = "Frequency")
})
经过测试
set.seed(10)
df <- data.frame(a=rpois(100, 5), b=rpois(100, 7), c=rpois(100, 3))