【问题标题】:Create plot for every variable in data (all variables are categorical)为数据中的每个变量创建图(所有变量都是分类的)
【发布时间】:2019-08-24 08:17:14
【问题描述】:

我正在使用 R 中 mlbench 包中的大豆数据集。

我想通过为每个变量(所有分类)创建简单的条形图来显示频率分布。 绘图应如下所示:

https://www.statmethods.net/graphs/images/barplot1.jpg

提前非常感谢, M

【问题讨论】:

    标签: r loops plot


    【解决方案1】:

    作为替代方案,您也可以尝试{purrr} 对数据的每一列应用{ggplot2} 进程。我在这里使用了aes_string(),因此列名可以作为字符串传递给ggplot 美学。

    编辑:使用 gridExtra::marrangeGrob() 生成所有图形的 6 x 6 排列。

    library(mlbench)
    library(purrr)
    library(ggplot2)
    library(gridExtra)
    
    data("Soybean")
    
    marrangeGrob(
      map(
        names(Soybean), 
        ~ ggplot(Soybean, aes_string(.x)) + 
          geom_bar()
      ),
      ncol = 6,
      nrow = 6,
      top = "Soybean Distribution"
    )
    

    【讨论】:

    • 感谢您的意见,这正是我想要的。但是,我正在考虑创建一个 6 x 6 的绘图空间,以便我可以同时查看它们。有没有办法将其合并到您的代码中?非常感谢,
    • 我编辑了答案,以便您获得 6 x 6 的绘图。我使用了 gridExtra::marrangeGrob()。计算时间有所增加,但我希望没关系。
    【解决方案2】:

    如果您想一一绘制所有变量的图表,您可以在数据集的列名上使用循环。使用ggplot() 和函数get() 关注变量的名称。

    library(mlbench)
    data(Soybean)
    library(ggplot2)
    library(dplyr)       
    
    for(j in 1:ncol(Soybean)){
    
      var <- colnames(Soybean)[j]
    
      Soybean %>% 
        ggplot(aes(x = get(var))) + 
        geom_histogram(stat = 'count') +
        labs(x = 'var')
    
    }
    

    它将生成 36 个像这样的图形:

    【讨论】:

    • 感谢您的意见。它运行良好,正是我想要的。再次,非常感谢。但是,计算时间比上面评论中的方法要长。
    【解决方案3】:

    使用base R,您可以通过以下方式获得所需的结果:

    my.barplot.function = function(x){ 
      heights = table(x)
      barplot(heights, names.arg = levels(x))
    }
    
    apply(Soybean, 2, my.barplot.function)
    

    您将获得所有变量的如下图:

    【讨论】:

    • 感谢您的意见。它工作得很好。很好的意见,非常感谢您的帮助。
    • @MLU :很高兴听到它对您很有效。即使它不是最佳答案,如果您发现代码和结果对解决您的问题和未来编程有用,请考虑给它一个赞:)
    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 2020-10-21
    • 2014-08-03
    • 2021-04-03
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多