【问题标题】:Selecting data frame columns to plot in ggplot2选择要在 ggplot2 中绘制的数据框列
【发布时间】:2012-10-26 23:20:00
【问题描述】:

我有一个大约 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)

} 

但是当然,这行不通......有没有办法做这种事情?

谢谢!

【问题讨论】:

标签: r ggplot2


【解决方案1】:

是的,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)

} 

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

    • 我仍然不确定如何在不使用循环的情况下仅绘制某些列,使用 ggplot 应该可以,不是吗?
    【解决方案3】:

    aes() 有一个替代方案; aes_string()。有了这个,您可以传入字符串以进行美学映射。请注意,您必须在 fill = "col1" 中引用 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))
    }
    

    【讨论】:

    • 确实,这肯定会让我大吃一惊!
    【解决方案4】:

    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)
    } )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 2021-02-10
      • 1970-01-01
      • 2019-07-28
      • 2021-04-29
      • 2012-04-20
      • 2018-06-23
      相关资源
      最近更新 更多