2016-11-08 2 views
2

Ich möchte einige quadratische Plots erstellen, die Reihen von Sechsecken in ihnen haben, wie gezeichnet here. Ich möchte sowohl reguläre (geometrisch regelmäßige) als auch abnormale Hexagon-Tessellationen zeichnen, daher glaube ich nicht, dass Werkzeuge aus dem "sp" -Paket funktionieren.R - Plotten Hexagon Tessellations

Unten ist mein Versuch einer regelmäßigen Hexagon Tesselation mit owin und 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) 

Allerdings scheint die oben auf Fehler, weil HAR2 nicht als eine Liste von Listen korrekt formatiert ist.

Das oben genannte ist offensichtlich nur für eine einzelne Reihe von Sechsecken, aber ich dachte, sobald ich die erste Reihe bekam, würde ich die einzelne Reihe in eine for-Schleife wickeln, die einen Satz x und y Abstände für jede Reihe hinzufügte. Ich kann einfach nicht herausfinden, wie man har2 formatiert, damit ich es direkt in die Poly-Funktion von owin einbinden kann.

Ich bin offen dafür, die Art, wie ich das oben getan habe, komplett zu verändern, ich bin immer noch relativ neu für R, also weiß ich definitiv noch nicht, wie man die Dinge am effizientesten/elegantesten macht. Ich laufe gerade R Version 3.3.2 auf Win 10 x64 mit RStudio V0.99.903

Jede Hilfe wird geschätzt.

Vielen Dank!

Antwort

2

Ich denke spatstat nur die Funktionen, die Sie suchen: hextess und affine.tess.

Werfen Sie einen Blick auf die Beispiele für affine.tess. Hier ist ein Beispiel dafür, was man tun kann (add trim = FALSE die Begrenzungsrahmen zu vermeiden):

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

Verglichen mit meinem ggplot-Hack erzeugt dies direkt das gewünschte Tesselationsmuster und ist viel flexibler in Bezug auf Transformationen. Hoffentlich kehrt das OP zurück und wählt dies als beste Antwort aus. Außerdem wäre es hilfreich, wenn Sie alle '#>' und '#> affn.t>' loswerden würden und nur den blanken Code zur Verfügung stellen würden, so dass Leute kopieren und einfügen können, ohne die Cursor-Zeichen bearbeiten zu müssen. – eipi10

+0

Danke für das positive Feedback @ eipi10.Ich habe meine Antwort aktualisiert, um das Kopieren und Einfügen zu erleichtern. –

2

Es könnte einfacher sein, einfach ein Hexbin-Plot zu erstellen und dann die Färbung zu überschreiben (nicht, dass es keine interessante Programmierung wäre, um die Hexagon-Tesselationslinien direkt zu zeichnen). Zum Beispiel mit 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 nur kartesisch arbeitet, so dass dieses Verfahren nur Hexagonen mit variierenden Seitenverhältnissen erzeugen, aber nicht Scheren oder andere Verzerrungen.

enter image description here

+0

Wow, vielen Dank. Genau das habe ich mir erhofft. Weißt du, wie man andere Formenkombinationen leicht tessellieren kann? Zum Beispiel, Quadrate, Sechsecke und Dreiecke zusammen tesselieren? Ich denke an etwas, was Sie unter dem folgenden Link sehen können. http://www.principlesofnature.com/references/semiregular_tessellations_of_the_plane.htm. – Nathan