R - 绘制六边形曲面细分

时间:2016-11-08 04:41:38

标签: r plot hexagonal-tiles spatstat tesselation

我想生成一些方形图,其中包含六边形数组,如绘制的here。我想绘制常规(几何规则)和异常六边形镶嵌,所以我不认为“sp”包中的工具会起作用。

下面是我尝试使用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所以我绝对不知道如何以最有效/优雅的方式做事。我目前正在运行RStudio V0.99.903的Win 10 x64上运行R版本3.3.2

感谢任何帮助。

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

答案 2 :(得分:0)

比例 = 1

enter image description here

比例 = 2

enter image description here

我编写了一个 //select what table you want to scrape (is zero based) //set 0 if there is only one setTable=0; //select what column you want to scrape (is zero based) //in this case I would be scrapping column 2 setColumnToScrape=1; var table = document.getElementsByTagName("tbody")[setTable]; for (var i = 0, row; row = table.rows[i]; i++) { col = row.cells[setColumnToScrape]; document.write(col.innerHTML + "<br>"); } 函数,它是一种基本的 hexagon() 方法。只需要弄清楚六边形的几何形状并将其映射到有意义的索引即可。这是我想出的:

  • graphics::polygon() 六边形是左下角的六边形。它的最左边顶点位于笛卡尔坐标 (0,index_i = 1, index_j=1)。它将在 y=0 线(x 轴)上齐平。

  • opp 六边形将与 index_i = 2, index_j=1 六边形(左下角)的右侧相邻。它会稍微升高。

  • index_i = 1, index_j=1 将位于 index_i=1, index_j=2 六边形(左下角)的正上方。

  • 以这种方式递增 index_i = 1, index_j=1 引用右侧的六边形(将 index_i 视为 x 坐标位置)并递增 index_i 引用上方的六边形(想想 {{ 1}} 作为 y 坐标位置)。

  • index_j 使它们变大或变小

  • 使用 index_j

    将颜色传递给每个六边形
  • 使用双 for 循环进行细分

scale