我有一个"vim.sneak": true
,带有两个曲线定义,每个曲线定义包含两个点和一个曲率值。目标是使用df
ggplot2
(或替代方法)绘制两条单独的曲线。
我可以使用以下方法生成预期的输出:
geom_curve
但这并不是真正的解决方案,因为在我的实际情况下,我有很多曲线(而且我不知道提前多少条曲线)。
如何将单个df <- data.frame(x = c(0,.2), y = c(0,.3), xend = c(1,.4), yend = c(1,.6), curvature = c(-.2,.4))
ggplot(df) + geom_curve(data = df[1, ], aes(x = x, y = y, xend = xend, yend = yend), curvature = df$curvature[1]) + geom_curve(data = df[2, ], aes(x = x, y = y, xend = xend, yend = yend), curvature = df$curvature[2])
参数传递给curvature
调用?
我尝试过:
geom_curve
这会使两条曲线相互重叠,并引发其他警告:
警告:忽略未知的美学因素:曲率
所以我尝试了:
df <- data.frame(x = c(0,0), y = c(0,0), xend = c(1,1), yend = c(1,1), curvature = c(-.2,.8))
library(ggplot2)
ggplot(df) + geom_curve(aes(x = x, y = y, xend = xend, yend = yend, curvature = curvature))
这会引发错误:
图层错误(数据=数据,映射=映射,统计=统计,geom = GeomCurve ,: 找不到对象“曲率”
所以我试图显式传递ggplot(df) + geom_curve(aes(x = x, y = y, xend = xend, yend = yend), curvature = curvature)
冒号:
curvature
这也会引发错误:
seq.default(0,dir * maxtheta,dir * maxtheta /(ncp + 1))中的错误:
'to'mussLänge1 haben另外:警告消息:1:如果发生 (曲率== 0){:条件的长度> 1,并且只有第一个 元素将被使用2:如果(曲率> 0)手<-“右”其他 hand <-“ left”:条件的长度> 1,并且只有第一个 元素将被使用
我从@markus的解决方案中学到,我们可以将ggplot(df) + geom_curve(aes(x = x, y = y, xend = xend, yend = yend), curvature = df$curvature)
传递给lists
对象,所以我尝试了:
ggplot
但这会使用两个ggplot(df) +
lapply(df$curvature, function(i) {
geom_curve(aes(x = x, y = y, xend = xend, yend = yend), curvature = i) }
)
参数绘制每条曲线:
如何为每一行分别传递curvature
自变量?
答案 0 :(得分:4)
更新
您可以先拆分数据,然后使用lapply
遍历结果列表,然后我们将其馈送到data
的{{1}}自变量
geom_curve()
原始ansewr
正如您已经指出的, df2 <- data.frame(x = c(0,.2), y = c(0,.3), xend = c(1,.4), yend = c(1,.6), curvature = c(-.2,.4))
ggplot() +
lapply(split(df2, 1:nrow(df)), function(dat) {
geom_curve(data = dat, aes(x = x, y = y, xend = xend, yend = yend), curvature = dat["curvature"]) }
)
不是一种美学。您可以将列表添加到curvature
,以使其正常工作
ggplot()
来自df <- data.frame(x = c(0,0), y = c(0,0), xend = c(1,1), yend = c(1,1), curvature = c(-.2,.8))
ggplot(df) +
lapply(df$curvature, function(i) {
geom_curve(aes(x = x, y = y, xend = xend, yend = yend), curvature = i) }
)
您可以添加什么?
...
您还可以提供一个列表,在这种情况下,列表的每个元素都会依次添加。
如果要在绘图中显示其他参数-每条线的颜色可能不同,大小不同等-使用help("+.gg")
修改后的数据
Map
情节
df1 <- data.frame(x = c(0,0), y = c(0,0), xend = c(1,1), yend = c(1,1), curvature = c(-.2,.8),
colour = c("red", "blue"))
结果
答案 1 :(得分:1)
您可以使用for循环将ggplot调用建立为文本字符串,并在for循环结束后对字符串进行求值。
graphString <- "ggplot(df) "
for(i in 1:nrow(df)){
newCurve <- paste(" + geom_curve(data = df[",i,", ], aes(x = x, y = y, xend = xend, yend = yend), curvature = df$curvature[",i,"])", sep="")
graphString <- paste(graphString, newCurve,sep="")
}
eval(parse(text = graphString))