在ggplot中循环遍历变量以为每个变量创建一个密度分布网格

时间:2018-11-26 16:57:05

标签: r loops ggplot2 facet-grid

我想为数据集中的多个变量创建一个密度分布图网格,该网格的平均值为垂直虚线。以mtcars数据集为例,单个变量图的代码为:

ggplot(mtcars, aes(x = mpg)) + geom_density() + geom_vline(aes(xintercept = 
mean(mpg)), linetype = "dashed", size = 0.6) 

我不清楚如何更改它以使其遍历数据集中的指定变量并生成包含每个图的网格。似乎会涉及添加facet_grid和“ vars”参数的某种组合,但是我尝试了多种组合,但均未成功。

在我可以在线找到的所有示例中,facet_grid均按变量的子集划分图,同时使每个图的x和y保持相同,但我想让x的图在每个图中都不同,并且y是值的密度。

在尝试解决此问题时,据我了解,新发行的ggplot包含涉及“准引号”的内容,这可能有助于解决我的问题(https://www.tidyverse.org/articles/2018/07/ggplot2-tidy-evaluation/),但是我还是不太清楚如何将此处提供的示例应用于我自己的问题。

1 个答案:

答案 0 :(得分:1)

考虑将数据重塑为长格式,而不是使用构面进行绘制。这里的x和y标尺都是自由的,因为各列的图大小不同。

rdf <- reshape(mtcars, varying = names(mtcars), v.names = "value", 
               times = names(mtcars), timevar = "variable",
               new.row.names = 1:1000, direction = "long")

ggplot(rdf, aes(x = value)) + geom_density() + 
  geom_vline(aes(xintercept = mean(value)), linetype = "dashed", size = 0.6) +
  facet_grid(~variable, scales="free") 

Plot Output