在for循环中打印ggplot,每次迭代使用不同的列

时间:2015-09-01 05:08:15

标签: r ggplot2

我正在尝试使用ggplot2使用for循环为我的数据创建多个图表。为此,我试图打印返回错误的ggplot对象

  

[.data.frame中的错误(df ,,(i)):选择了未定义的列。

此外,我无法在图表上打印图例。如果我不打印它会显示一个图表。

for(i in seq(from=2, to=ncol(pvp), by=4)){
  sq= as.numeric(c(1,(i):(i+3)))

  print(sq)
  df=pvp[,sq]
  print(head(df))
  colordf=colnames(df)[((i):(i+3))]


  p=ggplot(df,aes(x=df$tot_urls_read)) + 
    geom_line(aes(y=df[,(i)]),color="red")
  p=p+ geom_line(aes(y=df[,(i+1)]),color="green")
  p=p+ geom_line(aes(y=df[,(i+2)]),color="blue")
  p=p+ geom_line(aes(y=df[,(i+3)]),color="black") + 
    xlab("Percentage") + 
    ylab("Pvs") + 
    scale_fill_identity(name = '', guide = 'legend',labels = colordf) +
    scale_colour_manual(name = 'Topic lines', values =c('red'='red','green'='green','blue'='blue','black'='black'), 
                        labels = colordf)
  print(p)
}

这是我数据的一部分。其中有更多列

  tot_urls_read Andhra       Goa Maharashtra Karnataka        UP        MP      West    Bengal Assam
1             1      1 100.00000   100.00000 100.00000 100.00000 100.00000 100.00000 100.00000   100
2             2      2  51.28552    50.25325  50.00000  50.00000  50.00000  51.95487  50.70178    50
3             3      3  34.70799    33.67254  33.33333  33.33333  33.33333  35.23031  33.90084    33
4             4      4  26.28165    25.26571  25.00000  25.00000  25.00000  26.73067  25.36423    25
5             5      5  21.18226    20.31540  20.00000  20.00000  20.00000  21.62096  20.48651    22
6             6      6  17.83460    16.92501  16.66667  16.66667  16.76647  18.20869  16.99758    16

enter image description here

如何使用for循环创建多个图表并提供标题? 我没有这个想法,似乎到处都是。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

要添加图例,您需要正确映射相应的美学。不是绘制四个不同的geom_lines,而是将数据重新整形为长形并绘制同一调用中的所有行:

library(ggplot2)

for(i in seq(from=2, to=ncol(pvp), by=4)){
  sq= as.numeric(c(1,(i):(i+3)))

  df=pvp[,sq]

  library(tidyr)
  dft <- gather(df,key, value,-tot_urls_read)

  p=ggplot(dft,aes(x=tot_urls_read)) + 
    geom_line(aes(y=value,color=key)) +
    xlab("Percentage") + 
    ylab("Pvs") +
    scale_color_manual(values = c("red","green","blue","black"))
  print(p)
}