3

このに従って、プロットするポリゴンを作成します。この例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の完全なポリゴンを取得するには、で指定されているように各IDですべての行を取得する必要がありますがcon.hull.pos、各グループの最初の行も追加する必要があります。

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の凸包の最初の行と同じではないため、ここで私のコードは失敗します。したがって、ポリゴンは完全ではありません。誰かが変数でグループ化することによって与えられたを適用するのを手伝ってくれませんか。

手動でサブセット化する場合、このコードは3つのID領域をカバーする3つの別々のポリゴンを作成するため機能します

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
4

1 に答える 1

4

2つのヒント:

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

ここに画像の説明を入力してください

于 2012-07-18T20:34:51.687 に答える