我想生成一些方形图,其中包含六边形数组,如绘制的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
感谢任何帮助。
谢谢!
答案 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
仅适用于笛卡尔坐标,因此此方法只能生成具有不同宽高比的六边形,而不能产生剪切或其他扭曲。
答案 1 :(得分:2)
我认为spatstat
只包含您要查找的功能:hextess
和affine.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)
我编写了一个 //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