2016-11-08 7 views
2

Je voudrais générer des parcelles carrées qui ont des réseaux d'hexagones à l'intérieur d'entre eux, comme dessiné here. Je voudrais tracer à la fois des pavages hexagonaux réguliers (géométriquement réguliers) et anormaux, donc je ne pense pas que les outils du paquetage "sp" fonctionneront.R - Traçage Hexagone Tessellations

Ci-dessous est ma tentative de tesselation hexagone régulier à l'aide owin et l'intrigue.


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) 

Cependant, ce qui précède semble à l'erreur parce Har2 n'est pas formaté comme une liste de listes correctement. Ce qui précède est évidemment seulement pour une seule rangée d'hexagones, mais je me suis dit une fois que j'ai obtenu la première rangée, je voudrais juste envelopper la seule rangée dans une boucle for qui a ajouté un ensemble x et y distances pour chaque rangée. Je n'arrive pas à comprendre comment formater le har2 pour pouvoir le brancher directement sur la fonction poly d'owin.

Je suis ouvert à changer complètement la façon dont je l'ai fait ce qui précède, je suis encore relativement nouveau pour R, donc je vraiment ne sais toujours pas comment faire les choses de la façon la plus efficace/élégant. Je suis actuellement en cours d'exécution version R 3.3.2 sur Windows 10 x64 en cours d'exécution rstudio V0.99.903

Toute aide est appréciée.

Merci!

Répondre

2

Je pense que spatstat a juste les fonctions que vous recherchez: hextess et affine.tess.

Jetez un oeil à des exemples pour affine.tess. Ici est un exemple de ce que vous pouvez faire (ajouter trim = FALSE pour éviter la zone de délimitation ):

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

Par rapport à mon hack ggplot, cela crée directement le motif de tesselation désiré et est beaucoup plus flexible en termes de transformations. Espérons que le PO reviendra et choisira ceci comme la meilleure réponse. Aussi, il serait utile si vous vous êtes débarrassé de tous les # #> et # # affn.t> 'et juste fourni le code nu afin que les gens puissent copier et coller sans avoir à éditer les caractères du curseur. – eipi10

+0

Merci pour les commentaires positifs @ eipi10.J'ai mis à jour ma réponse pour la rendre plus facile à copier et à coller. –

2

Il pourrait être plus facile à faire juste une parcelle hexbin puis passer outre la coloration (pas que ce ne serait pas un exercice de programmation intéressant de tracer les lignes de tesselation hexagonaux directement). Par exemple, en utilisant 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 fonctionne uniquement avec les coordonnées cartésiennes, cette méthode ne peut produire hexagones avec différents rapports d'aspect, mais pas cisailles ou d'autres distorsions.

enter image description here

+0

Wow, merci beaucoup. C'est exactement ce que j'espérais. Connaissez-vous un moyen de tesselliser facilement d'autres combinaisons de formes. Par exemple, tesselate des carrés, des hexagones et des triangles ensemble? Je pense à quelque chose comme ce que vous pouvez voir sur le lien ci-dessous. http://www.principlesofnature.com/references/semiregular_tessellations_of_the_plane.htm. – Nathan