2016-11-08 230 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