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))