ggplot循环添加曲线失败,但一次只能运行一个

时间:2017-02-14 05:41:45

标签: r ggplot2

我有一个非常简单的循环,尝试使用ggplot在同一个图形上绘制四条曲线。这是代码:

  df = data.frame(x=0:10/10)
  gg = ggplot(df)
  for (t in 4:1/4)
      gg = gg + geom_path(aes(x,x^t))
  gg  

当我运行它时,它只显示最后一个图形。如果我一次添加一个,例如:

  df = data.frame(x=0:10/10)
  gg = ggplot(df)
  gg = gg + geom_path(aes(x,x^1.00))
  gg = gg + geom_path(aes(x,x^0.75))
  gg = gg + geom_path(aes(x,x^0.50))
  gg = gg + geom_path(aes(x,x^0.25))
  gg

它运作得很好。有人可以解释这个魔法吗?

3 个答案:

答案 0 :(得分:4)

你明确地substitute the value

eval(substitute(expr = {gg = gg + geom_path(aes(x,x^t))}, env = list(t=t)))

但更好的解决方案是首先使用所有变量创建整个data.frame,然后绘制它(最好是长格式)。

答案 1 :(得分:4)

Baptiste建议首先使用所有变量创建整个data.frame,然后绘制它(最好是长格式)answer provided by Gene宽格式创建数据,需要循环遍历列。

下面的代码以长格式创建数据,并在一次调用中绘制所有曲线:

# create data in long format
df <- expand.grid(x = 0:10/10, exp = 1:4/4)
df$y <- df$x^df$exp

# plot
library(ggplot2)
gg <- ggplot(df, aes(x, y, group = exp)) + geom_line()
gg

enter image description here

请注意,此处使用geom_line()因为它按x轴上的变量顺序连接观察值。 geom_path()按照它们在数据中出现的顺序连接观察结果。

不同的曲线也可以用颜色编码:

# continous scale
gg + aes(colour = exp)

enter image description here

# discrete scale
gg + aes(colour = factor(exp))

enter image description here

请注意,通过在aes()的调用中加入颜色美学,默认情况下会创建相应的图例。

答案 2 :(得分:1)

正如baptise和前面提到的solution所提到的那样,由于懒惰的评估,for循环不起作用。这是一个有效的for循环方法,它通过在每个循环中更新提供的数据来工作。正如其他地方所提到的,有更有效的方法来绘制这个

#make the data and put it all into a single df
df = data.frame(x=0:10/10)
df = cbind(df,sapply(4:1/4, function(t) df$x^t))

# initiate ggplot
g <- ggplot(df)

# make some colours
cols = colorRampPalette(c("blue",'green'))(ncol(df))

# loop over columns
for (j in 2:ncol(df)){

  # update the data within the loop
  gg.data <- data.frame(x = df[,1], y = df[,j])

  # add the line
  g <- g + geom_path(data = gg.data, aes(x,y), col = cols[j])
}
g

g plot