【问题标题】:How to get convex hull using ddply?如何使用 ddply 获得凸包?
【发布时间】:2012-07-17 23:13:52
【问题描述】:

我正在关注example 来创建要使用ggplot 绘制的多边形,如果我的数据被子集化,我可以按照该示例创建单独的凸包;但是,当我尝试应用 ddply 因为我有一个分组变量时,我无法做到。这是示例中添加了分组变量的代码:

library(grDevices) # load grDevices package
df <- data.frame(X = c(-62,  -40,   9,  13,  26,  27,  27),
             Y = c( 7, -14,  10,   9,  -8, -16,  12), id = c(1, 1, 1, 2, 2, 3, 3))
con.hull.pos <- ddply(df, .(id), summarize, hullpos = chull(X, Y)) # get convex hull positions by each ID

现在,要为每个 ID 获取完整的多边形,我们需要按照 con.hull.pos 中给出的每个 ID 获取所有行,但我们还需要添加每个组的第一行。

df[ddply(con.hull.pos, .(id), function(x) x[1, ])$hullpos, ] # first row of position
df[con.hull.pos$hullpos  ,]  ## all rows of position
rbind(df[con.hull.pos$hullpos  ,] , df[ddply(con.hull.pos, .(id), function(x) x[1, ])$hullpos, ])

这里我的代码失败了,因为使用 ddply 的第一行与 ID 的凸包的第一行不同。因此,多边形是不完整的。任何人都可以通过按变量分组来帮助我应用给定的example

手动设置子集时,此代码会创建三个独立的多边形,覆盖三个 id 区域

id1_df <- subset(df, id==1)
id1_con.hull.pos <- chull(id1_df$X, id1_df$Y)   

id2_df <- subset(df, id==2)
id2_con.hull.pos <- chull(id2_df$X, id2_df$Y)

id3_df <- subset(df, id==3)
id3_con.hull.pos <- chull(id3_df$X, id3_df$Y)

id1_con.hull <- rbind(id1_df[id1_con.hull.pos,], id1_df [id1_con.hull.pos[1],])
id2_con.hull <- rbind(id2_df [id2_con.hull.pos ,], id2_df  [id2_con.hull.pos [1],])
id3_con.hull <- rbind(id3_df [id3_con.hull.pos,], id3_df [id3_con.hull.pos[1],])             

poly_borders <- rbind(id1_con.hull, id2_con.hull, id3_con.hull)     

plot(Y ~ X, data = df) # plot data
lines(poly_borders) # add lines for convex hull

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    两个提示:

    1. 使用基础 R 中的 chull 函数计算凸包。
    2. 使用dlply 将生成的chull 存储在列表中,而不是数据框中

    然后你的代码变成:

    x <- dlply(df, .(id), function(piece)piece[chull(piece$X, piece$Y), -3])
    
    plot(Y~X, df)
    lapply(x, polygon)
    

    这会产生这个情节:


    如果你想在ggplot 中绘制这个更容易,但使用ddply

    x <- ddply(df, .(id), function(piece)piece[chull(piece$X, piece$Y), ])
    ggplot(x, aes(X, Y, group=id)) + geom_polygon(fill="cyan", colour="blue") + geom_line()
    

    【讨论】:

    • 哦。这太近了。谢谢安德烈。我看到多边形实际上会尝试在现有图上绘图。我们如何将多边形值存储在数据框中?或者我们如何使用ggplot 绘制多边形
    • ggplot 代码已添加。更容易。现在只有两行代码。
    猜你喜欢
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2018-10-30
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多