我有一个非常简单的循环,尝试使用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
它运作得很好。有人可以解释这个魔法吗?
答案 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
请注意,此处使用geom_line()
因为它按x轴上的变量顺序连接观察值。 geom_path()
按照它们在数据中出现的顺序连接观察结果。
不同的曲线也可以用颜色编码:
# continous scale
gg + aes(colour = exp)
# discrete scale
gg + aes(colour = factor(exp))
请注意,通过在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