7

我有一个大约 150 列的大数据表。我需要用其中大约 1/3 制作一系列直方图。我不想在我的脚本中放置 50 行相同的绘图命令,而是想循环一个列表,告诉我要使用哪些列。这是一个测试数据集来说明:

d <- data.frame(c(rep("A",5), rep("B",5)),
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE))

colnames(d) <- c("col1","col2","col3","col4","col5","col6" )


ggplot(data=d, aes(col2, fill= col1)) + geom_density(alpha = 0.5)

所以,与其写这个 50 次并替换这些aes()值,我真的想做更多这样的事情......

cols_to_plot <- c("col2","col4","col6")

for (i in length(cols_to_plot)) {
  ggplot(data=d, aes(cols_to_plot[i], fill= col1)) + geom_density(alpha = 0.5)

} 

但是当然,这不起作用......有没有办法做这种事情?

谢谢!

4

4 回答 4

10

我认为如果你融化你的数据会更好。试试这个:

library(reshape2)
d2 <- melt(d, id='col1')
ggplot(d2, aes(value, fill=col1)) + geom_density(alpha=.5) + facet_wrap(~variable)

或者,如果您想做您最初想做的事情,请使用aes_string,例如:

ggplot(data=d, aes_string(cols_to_plot[i], fill='col1')) + geom_density(alpha = 0.5)
于 2012-11-06T22:50:45.200 回答
7

有一个替代方案aes()aes_string(). 有了这个,您可以传入字符串以进行美学映射。请注意,您必须在col1此处引用fill = "col1"。另请注意,在for()循环中,您需要显式地显示print()一个ggplot对象,以便在当前设备上绘制绘图。

d <- data.frame(c(rep("A",5), rep("B",5)),
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE),     
                sample(c(1:10), 10, replace=TRUE))

colnames(d) <- c("col1","col2","col3","col4","col5","col6" )

cols_to_plot <- c("col2","col4","col6")

for (i in seq_along(cols_to_plot)) {
  print(ggplot(data=d, aes_string(x = cols_to_plot[i], fill= "col1")) +
    geom_density(alpha = 0.5))
}
于 2012-11-06T22:52:39.427 回答
3

是的,aes_string

cols_to_plot <- c("col2","col4","col6")

for (i in cols_to_plot) {
  ggplot(data=d, aes_string(i, fill= 'col1')) + geom_density(alpha = 0.5)

} 
于 2012-11-06T22:49:27.247 回答
2

lapply()可以在这里用来代替for带有 . 的循环aes_string()

cols_to_plot <- c("col2","col4","col6")
lapply(cols_to_plot,function(i){
  ggplot(data=d, aes_string(x=i, fill= 'col1')) + 
    geom_density(alpha = 0.5)
} )
于 2012-11-06T22:54:02.350 回答