如何使用for循环在ggplot中添加图层 [英] how to add layers in ggplot using a for-loop

查看:54
本文介绍了如何使用for循环在ggplot中添加图层的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将数据帧的每一列绘制到 ggplot2 中的单独图层.逐层构建绘图效果很好:

I would like to plot each column of a dataframe to a separate layer in ggplot2. Building the plot layer by layer works well:

df<-data.frame(x1=c(1:5),y1=c(2.0,5.4,7.1,4.6,5.0),y2=c(0.4,9.4,2.9,5.4,1.1),y3=c(2.4,6.6,8.1,5.6,6.3))

ggplot(data=df,aes(df[,1]))+geom_line(aes(y=df[,2]))+geom_line(aes(y=df[,3]))

有没有办法使用单个函数将所有可用列绘制在一个位置?

Is there a way to plot all available columns at ones by using a single function?

我试图这样做,但它不起作用:

I tried to do it this way but it does not work:

    plotAllLayers<-function(df){
    p<-ggplot(data=df,aes(df[,1]))
    for(i in seq(2:ncol(df))){ 
        p<-p+geom_line(aes(y=df[,i]))
        }
        return(p)
    }

plotAllLayers(df)

推荐答案

一种方法是使用库 reshape2 中的函数 melt() 将数据框从宽格式重塑为长格式.在新数据框中,您将拥有 x1 值、确定数据来自哪个列的 variable 以及包含所有原始 y 值的 value.

One approach would be to reshape your data frame from wide format to long format using function melt() from library reshape2. In new data frame you will have x1 values, variable that determine from which column data came, and value that contains all original y values.

现在你可以用一个 ggplot()geom_line() 调用和使用 variable 来绘制所有数据,例如为每一行.

Now you can plot all data with one ggplot() and geom_line() call and use variable to have for example separate color for each line.

 library(reshape2)
 df.long<-melt(df,id.vars="x1")
 head(df.long)
  x1 variable value
1  1       y1   2.0
2  2       y1   5.4
3  3       y1   7.1
4  4       y1   4.6
5  5       y1   5.0
6  1       y2   0.4
 ggplot(df.long,aes(x1,value,color=variable))+geom_line()

如果你真的想使用 for() 循环(不是最好的方法)那么你应该使用 names(df)[-1] 而不是 seq().这将生成列名称的向量(第一列除外).然后在 geom_line() 中使用 aes_string(y=i) 按名称选择列.

If you really want to use for() loop (not the best way) then you should use names(df)[-1] instead of seq(). This will make vector of column names (except first column). Then inside geom_line() use aes_string(y=i) to select column by their name.

plotAllLayers<-function(df){
  p<-ggplot(data=df,aes(df[,1]))
  for(i in names(df)[-1]){ 
    p<-p+geom_line(aes_string(y=i))
  }
  return(p)
}

plotAllLayers(df)

这篇关于如何使用for循环在ggplot中添加图层的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆