2016-11-08 229 views
2

我想生成一些內部有六邊形陣列的方塊圖,如繪製的here。我想繪製常規(幾何規則)和異常六邊形鑲嵌,所以我不認爲「sp」包中的工具可以工作。R - 繪製六角形棋盤格

下面是我嘗試使用owin和plot的正六邊形鑲嵌。


library(maptools) 
library(spatstat) 

twid <- 20 
theight <- 20 
sideL <- 2 
rp1 <- (sideL/2)*sqrt(3) 
rp2 <- 2*(sideL/2)*sqrt(3) 
rp3 <- 3*sideL 

    bx <- c(1:floor(twid/rp3)) 
    by <- c(1:floor(theight/rp3)) 
    hex_array1 <- list(bx) 
    hex_array2 <- list(by) 

    for(i in 1:ceiling(twid/rp3)){ 
     bx[i] <- list(x=c(0+rp3*i,1+rp3*i,3+rp3*i,4+rp3*i,3+rp3*i,1+rp3*i)) 
     by[i] <- list(y=c(rp1,rp2,rp2,rp1,0,0)) 
      hex_array1[i] <- bx[i] 
      hex_array2[i] <- by[i] 
    } 

    har1 <- list(x=c(0,1,3,4,3,1), y=c(rp1,rp2,rp2,rp1,0,0)) 

    har2 <- list(x=hex_array1,y=hex_array2) 


hexig <- owin(poly=list(list(x=c(0,twid,twid,0), y=c(0,0,theight,theight)), 
         har1, har2 
         ) 
       ) 
    plot(hexig) 

然而,上面似乎錯誤,因爲Har2基不正確格式化爲一個列表的列表。

上面顯然只適用於單排六邊形,但我想到一旦我得到第一行,我只是將單行包裝在for循環中,爲每行添加一組x和y距離。我只是無法弄清楚如何格式化har2,以便我可以直接將其插入到owin的poly函數中。

我打算徹底改變上述做法,我對R還是比較陌生的,所以我絕對還是不知道如何以最有效率的方式做事。我目前在Win 10 x64上運行R版本3.3.2運行RStudio V0.99.903

任何幫助表示讚賞。

謝謝!

回答

2

我認爲spatstat剛剛你正在尋找的功能:hextessaffine.tess

查看affine.tess的示例。這裏 是你可以做什麼的例子(添加trim = FALSE避免 邊框):

library(spatstat) 
H <- hextess(square(5), 0.2) 
plot(H) 

shear <- matrix(c(1,0,0.6,1), 2, 2) 
sH <- affine(H, shear) 
plot(sH) 

+0

與我的ggplot hack相比,這直接創建了所需的tesselation模式,並且在轉換方面更加靈活。希望OP會回來並選擇這個作爲最佳答案。另外,如果你擺脫了所有'#>'和'#> affn.t>',並提供了裸代碼,這樣人們可以複製和粘貼而無需編輯光標字符,這將會很有幫助。 – eipi10

+0

感謝您的好評@ eipi10。我已經更新了我的答案,以便更容易複製和粘貼。 –

2

只要做一個hexbin圖然後重寫着色可能會更容易(不是說它不是一個有趣的編程練習來直接繪製六邊形鑲嵌線)。例如,使用GGPLOT2:

library(ggplot2) 

dat = data.frame(x=runif(5000, 0,10), y=runif(5000,0,10)) 

# Basic plot 
p = ggplot(dat, aes(x,y)) + 
    geom_hex(colour="black", fill="white", bins=10) + 
    theme_minimal() + 
    guides(fill=FALSE) + 
    scale_y_continuous(limits=c(-0.4,10.6)) + 
    scale_x_continuous(limits=c(-0.4,10.6)) + 
    theme(axis.text=element_blank(), 
     axis.title=element_blank()) 

# Regular hexagons 
p + coord_equal(ratio=1) 

# 2:1 aspect ratio 
p + coord_equal(ratio=2) 

geom_hex僅使用直角座標的工作的,所以這種方法只能生產具有不同縱橫比的六邊形,而不是剪或其它扭曲。

enter image description here

+0

哇,感謝這麼多。這正是我所希望的。你知道一種方法來輕鬆鑲嵌其他形狀的組合。例如,tesselate正方形,六邊形和三角形在一起?我正在想像你可以在下面的鏈接看到的東西。 http://www.principlesofnature.com/references/semiregular_tessellations_of_the_plane.htm。 – Nathan