Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R ggplot循环添加曲线失败,但一次只能添加一条曲线_R_Ggplot2 - Fatal编程技术网

R ggplot循环添加曲线失败,但一次只能添加一条曲线

R ggplot循环添加曲线失败,但一次只能添加一条曲线,r,ggplot2,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_

我有一个非常简单的循环,尝试使用
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
它很好用。有人能解释一下魔法吗?

你可以明确地说

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

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

正如baptise和前面提到的那样,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
#制作数据并将其全部放入一个df中
df=数据帧(x=0:10/10)
df=cbind(df,sapply(4:1/4,函数(t)df$x^t))
#启动ggplot
g建议首先创建包含所有变量的整个data.frame,然后绘制它(最好是长格式)。创建需要在列上循环的宽格式数据

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

# 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


请注意,通过在调用
aes()
中包含颜色美学,默认情况下会创建一个适当的图例。

您需要捕获环境(每个阶段的当前值t)否则,在ggplot2实际生成绘图时,只有最后一个会存在。您签出了吗?@Baptiste建议以长格式创建数据。您的答案以较宽的格式创建数据,这对于
ggplot2
不太可取,并且不必要地需要在列上循环。因此,您在这里对正确方法的陈述非常有力。@UweBlock,在某些情况下,例如解决方案链接,for循环是不可避免的。此外,OP还关心为什么for循环不工作,从而得到响应。如果是我的代码,我会把数据转换成长格式,让ggplot处理细节。我同意for循环有时是无法避免的。但无论是在这种情况下,还是在关联解决方案中,它们都不是正确的解决方案,因为在这两种情况下,整个方法都被误导了。对我来说,这两种情况都是。这两个OP都遇到了在for循环中向ggplot对象添加图层的问题,因为他们没有以ggplot更喜欢的格式创建数据。一个更好的问题是,例如,“如何准备数据,用ggplot绘制参数化曲线?”。我接受了这一点,尽管@baptiste的答案很短,并且说得更多。这是如此简洁,我无法理解什么是长格式与宽,直到我看到这个答案的另一个。
# continous scale
gg + aes(colour = exp)
# discrete scale
gg + aes(colour = factor(exp))