2012-07-18 64 views
3

我正在關注此example以創建要使用ggplot進行繪製的多邊形我可以按照該示例創建單獨的凸包,如果我的數據是子集的;然而,當我嘗試申請ddply,因爲我有一個分組變量,我無法。下面是從示例代碼以增加分組變量:如何使用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的第一行與凸包的第一行不同。因此,多邊形並不完整。任何人都可以請幫助我應用給定的example通過變量分組。

當手動子集劃分,此代碼的工作,因爲它創建三個單獨的多邊形覆蓋3個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 

回答

4

兩個提示:在基礎R

  1. 使用chull函數來計算的凸包。
  2. 使用dlply所得到的chull存儲在一個列表中,而不是一個數據幀

然後你的代碼變成:

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

plot(Y~X, df) 
lapply(x, polygon) 

將會產生這樣的情節:

enter image description here


如果您想繪製這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() 

enter image description here

+0

哦~~。這是如此接近。謝謝Andrie。我看到多邊形實際上會試圖在現有的情節上繪圖。我們如何將多邊形值存儲在數據框中?或者我們如何使用ggplot' – karlos 2012-07-18 20:51:15

+0

'ggplot'代碼添加來繪製多邊形。更容易。現在它只是兩行代碼。 – Andrie 2012-07-18 20:57:07

+0

謝謝。謝謝。謝謝。這是偉大的東西! – karlos 2012-07-18 21:10:25