2017-03-01 3 views
2

Dies ist eine etwas andere Frage als ein früherer Beitrag (ggplot hexbin shows different number of hexagons in plot versus data frame).Automatisierte Möglichkeit, ggplot Hexbin daran zu hindern, Geome aus Achsen zu schneiden

Ich verwende hexbin(), um Daten in sechseckige Objekte zu zerlegen, und ggplot(), um die Ergebnisse zu plotten. Ich bemerke, dass manchmal die Sechsecke am Rand der Handlung halbiert sind. Unten ist ein Beispiel.

library(hexbin) 
library(ggplot2) 

set.seed(1) 
data <- data.frame(A=rnorm(100), B=rnorm(100), C=rnorm(100), D=rnorm(100), E=rnorm(100)) 
maxVal = max(abs(data)) 
maxRange = c(-1*maxVal, maxVal) 

x = data[,c("A")] 
y = data[,c("E")] 
h <- hexbin(x=x, y=y, xbins=5, shape=1, IDs=TRUE, xbnds=maxRange, ybnds=maxRange) 
hexdf <- data.frame (hcell2xy (h), hexID = [email protected], counts = [email protected]) 
ggplot(hexdf, aes(x = x, y = y, fill = counts, hexID = hexID)) + 
    geom_hex(stat = "identity") + 
    coord_cartesian(xlim = c(maxRange[1], maxRange[2]), ylim = c(maxRange[1], maxRange[2])) 

Dies schafft eine Grafik, wo ein Sechseck ist an der Spitze und ein Sechseck abgeschnitten wird am Boden abgeschnitten:

enter image description here

Ein weiterer Ansatz, den ich hart Code ausprobieren kann, ist, Wert (hier 1.5), der zu den Grenzen der x- und y-Achse addiert wird. Dies scheint das Problem zu lösen, da keine Sechsecke mehr abgeschnitten werden.

ggplot(hexdf, aes(x = x, y = y, fill = counts, hexID = hexID)) + 
    geom_hex(stat = "identity") + 
    scale_x_continuous(limits = maxRange * 1.5) + 
    scale_y_continuous(limits = maxRange * 1.5) 

enter image description here

Doch obwohl der zweite Ansatz, das Problem in diesem Fall löst, ist der Wert von 1,5 willkürlich. Ich versuche, diesen Prozess für eine Vielzahl von Daten und eine Vielzahl von Behältergrößen und Sechskantgrößen zu automatisieren, die verwendet werden könnten. Gibt es eine Lösung, um alle Sechsecke im Diagramm vollständig sichtbar zu machen, ohne einen willkürlichen Wert fest codieren zu müssen, der für bestimmte Fälle zu groß oder zu klein sein kann?

+0

bearbeitet gerade die Antwort auf enthalten die Möglichkeit, die Anzahl der Bins anstelle der Binwidth manuell festzulegen – lbusett

Antwort

1

Bedenken Sie, dass Sie die Berechnung von hexbin überspringen können, und lassen Sie Ggplot den Job erledigen.

Dann, wenn Sie zu bevorzugen manuell die Breite der Fächer eingestellt Sie die binwidth und ändern die Grenzen festlegen:

bwd = 1 
    ggplot(data, aes(x = x, y = y)) + 
    geom_hex(binwidth = bwd)  + 
    coord_cartesian(xlim = c(min(x) - bwd, max(x) + bwd), 
        ylim = c(min(y) - bwd, max(y) + bwd), 
        expand = T) + 
    geom_point(color = "red")  + 
    theme_bw() 

diese Art und Weise, Hexagone sollte nie (abgeschnitten werden, obwohl Sie können am Ende mit einigem "leeren" Raum

Ergebnis mit bwd = 1.

enter image description here

Ergebnis mit bwd = 3:

enter image description here

Wenn stattdessen Sie bevorzugen programmatisch die Anzahl der Bins eingestellt, können Sie verwenden:

nbins_x <- 4 
    nbins_y <- 6 

    range_x <- range(data$A, na.rm = T) 
    range_y <- range(data$E, na.rm = T) 
    bwd_x <- (range_x[2] - range_x[1])/nbins_x 
    bwd_y <- (range_y[2] - range_y[1])/nbins_y 

    ggplot(data, aes(x = A, y = E)) + 
    geom_hex(bins = c(nbins_x,nbins_y)) + 
    coord_cartesian(xlim = c(range_x[1] - bwd_x, range_x[2] + bwd_x), 
        ylim = c(range_y[1] - bwd_y, range_y[2] + bwd_y), 
        expand = T) + 
    geom_point(color = "red")+ 
    theme_bw() 

enter image description here

Verwandte Themen