【问题标题】:How to use lapply with ggplot2 while indexing variables如何在索引变量时将 lapply 与 ggplot2 一起使用
【发布时间】:2016-01-22 00:32:35
【问题描述】:

我想从一个大数据框中生成数百个连续数据的箱线图,按“年份”因子分层。我首先从包含每个因变量和年份的原始数据框中创建一个列表。

这是一个看起来像我的示例数据集:

l<-list(data.frame(year=c(rep("2010",10),rep("2011",10),rep("2012",10)),     
var1=sample(1:100,30,replace=T)), 
    data.frame(year=c(rep("2010",10),rep("2011",10),rep("2012",10)), 
var2=sample(100:200,30,replace=T)),
    data.frame(year=c(rep("2010",10),rep("2011",10),rep("2012",10)), 
var3=sample(25:50,30, replace=T)))

下一步是在列表上应用 ggplot2 函数。这些函数都不会产生图:

lapply(l, function (j) ggplot(j, aes(x=year, y=j[,2], fill=year)) +    
 geom_boxplot() + ylab(names(j[2])) )

lapply(l, function (j) ggplot(j, aes(x=year, y=j[[1]][2], fill=year)) +  
 geom_boxplot() + ylab(names(j[2])) )

这些脚本会生成相同的错误消息:

错误:绘图中没有图层"

实际上,我的数据框要大得多——2800 个观测值和 250 多个具有唯一描述性名称的不同变量(例如“M2_loss”、“SSC”)。每个变量的尺度不同,因此使用构面不是一个好的解决方案。这个问题与 stackoverflow 上的其他示例的不同之处在于我试图索引数据而不是显式命名它。重要的是我捕获每个变量的唯一名称并使用它来标记 y 轴。

关于如何进行的任何想法?

【问题讨论】:

  • 感谢您指出这一点。 (现已删除)for 循环从我的原始数据框创建列表,但这个可重现的示例不需要它。

标签: r ggplot2 lapply


【解决方案1】:

如果我了解您想要什么,我认为您可以使用aes_string 而不是aes 使事情变得更简单。这允许您将感兴趣的变量指定为字符串而不是名称。下面是一个使用陈旧的iris 数据集的简单示例:

lapply( names(iris)[1:4], function(n) ggplot(data = iris, aes_string(y = n, x = "Species")) + geom_boxplot() ) 这会为iris 数据集中的四个定量变量中的每一个生成并排箱线图(按物种),并且应该很容易根据您的数据框进行调整。

【讨论】:

  • 感谢有关 aes_strings() 的提示。
【解决方案2】:

如果您想让 lapply 函数在 hte 控制台屏幕设备上实际创建输出,只需添加一个 +geom_boxplot 调用:

 plist <- lapply(l, function (j) print( ggplot(j, aes(x=year, y=j[,2], fill=year))     
  ylab(names(j[2])) +geom_boxplot() ) )

如果您想存储在一个列表中,然后稍后再绘制,请忽略打印调用:

 plist <- lapply(l, function (j)  ggplot(j, aes(x=year, y=j[,2], fill=year)) +
                                      ylab(names(j[2])) +geom_boxplot() ) 
# To print ...
plist[[1]]

【讨论】:

  • 看起来我在尝试创建可重现的示例时又犯了一个错误——我遗漏了通常包含在我更广泛的 ggplot2 脚本中的 boxplot geom。现在已经纠正了。当我运行您的代码时,我收到以下错误消息:“eval 中的错误(expr,envir,enclos):找不到对象'j'”。
  • 我正在使用 marrangeGrob() 在 Rmarkdown 中绘制箱线图。令人难以置信的是,R 周一晚上在 Rmarkdown 中很好地绘制了它们,但是当我在周二更新文件时,我遇到了麻烦。我无法确定到底发生了什么变化。
  • 我在运行 R 3.2.3 和 ggplot2_2.0.0 的 Mac (El Cap) 上测试了这两个版本。我确实知道一些 gridExtra 函数最近发生了变化。
【解决方案3】:

问题原来是 Rstudio 的旧版本(3.2.2)。一旦我删除了旧版本,问题就解决了——我原来的 lapply() 函数(第一个例子)工作正常。

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多