如何在ggplot2`geom_curve`函数中传递各个曲率参数?

时间:2019-04-11 08:02:13

标签: r ggplot2

我有一个"vim.sneak": true,带有两个曲线定义,每个曲线定义包含两个点和一个曲率值。目标是使用df ggplot2(或替代方法)绘制两条单独的曲线。

我可以使用以下方法生成预期的输出:

geom_curve

enter image description here

但这并不是真正的解决方案,因为在我的实际情况下,我有很多曲线(而且我不知道提前多少条曲线)。

如何将单个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) } ) 参数绘制每条曲线:

enter image description here


如何为每一行分别传递curvature自变量?

2 个答案:

答案 0 :(得分:4)

更新

您可以先拆分数据,然后使用lapply遍历结果列表,然后我们将其馈送到data的{​​{1}}自变量

geom_curve()

enter image description here

原始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()

enter image description here

来自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"))

结果

enter image description here

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