【问题标题】:Plotting distributions of all columns in an R data frame绘制 R 数据框中所有列的分布
【发布时间】:2018-01-29 18:03:55
【问题描述】:

我试图想出一种简洁的方法来绘制 R 数据框中所有列的网格视图。问题是我的数据框中既有离散值又有数值。为简单起见,我们可以使用 R 提供的名为 iris 的样本数据集。我会使用par(mfrow(x, y)) 来分割我的地块,也许使用mapply 来循环浏览每一列?我不确定这里最好的是什么。

我在想类似的事情:

ggplot(iris, aes(Sepal.Length))+geom_density()

而是为每一列绘制。我担心的是“物种”列是离散的。也许“geom_density”在这里不适合使用,但我们的想法是在一个图中查看每个数据框的变量分布——甚至是离散的。离散值的条形图可以达到目的。基本上我正在尝试执行以下操作:

  • 循环浏览数据框中的每一列
  • 如果是数字,则绘制直方图
  • 如果是离散的(基本上是字符串),则绘制条形图

任何想法或建议将不胜感激!

【问题讨论】:

  • 我强烈推荐skimr 包来了解发行版。试试这个:library(skimr); skim(iris).
  • 类似GGally::ggpairs(iris)?或者你只想要单变量?
  • 使用 ggplot 我倾向于将一组图用于数字变量,另一组用于非数字变量。试试这个library(tidyverse); iris %>% select_if(is.numeric) %>% gather() %>% ggplot(aes(value))+ geom_density()+ facet_wrap(~key); iris %>% select_if(negate(is.numeric)) %>% gather() %>% ggplot(aes(value))+ geom_bar()+ facet_wrap(~key)。我不会将此作为答案发布,因为您要求一个情节。 :-)
  • 有时值得一看plot(iris)!!
  • plot(iris) 确实很有帮助,非常适合研究变量之间的相关性。它并不关注每个变量的分布。

标签: r ggplot2


【解决方案1】:

您可以使用cowplot 包中的函数plot_grid。此函数获取ggplot 生成的绘图列表并创建一个新绘图,将它们组合在一个网格中。

首先,使用lapply 创建一个绘图列表,对数字变量使用geom_density,对其他所有变量使用geom_bar。

my_plots <- lapply(names(iris), function(var_x){
  p <- 
    ggplot(iris) +
    aes_string(var_x)

  if(is.numeric(iris[[var_x]])) {
    p <- p + geom_density()

  } else {
    p <- p + geom_bar()
  } 

})

现在我们只需调用plot_grid。

plot_grid(plotlist = my_plots)

【讨论】:

  • 这很棒!我确实必须更新我的 R 版本才能让cowplot 工作,但这正是我想要的。感谢您向我介绍is_numeric 和cowplot。
猜你喜欢
  • 2011-06-20
  • 2019-08-29
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多