2016-04-08 4 views
0

Ich arbeite daran, ein Bürogebäude in R zu repräsentieren. Später muss ich mehrere Etagen darstellen, aber jetzt muss ich mit einer Etage beginnen. Es gibt Cluster von Würfeln, alle in einer regelmäßigen Struktur. Es gibt vier kleine Würfel für das Junior-Personal (4x4) und zwei größere Würfel für einen leitenden Ingenieur und einen Manager (4x6). Sobald diese festgelegt sind, muss ich in der Lage sein zu zeigen, ob sie besetzt sind oder frei für neue Mitarbeiter - nach Farbe (wie rot für besetzt, grün für verfügbar). Diese sind alle gleich aufgebaut, mit den großen an einem Ende. Zum BeispielR Blaupausen/Grundriss

+----+--+--+ 
| S |J1|J2| 
+----+--+--+ 
<-hallway--> 
+----+--+--+ 
| M |J3|J4| 
+----+--+--+ 

Ich dachte zuerst konnte ich ggplot und nur Streudiagramm alle verwenden, aber ich kann nicht herausfinden, wie die verschiedene Größe Würfel mit geom_point zu erfassen. Ich habe einige Zeit damit verbracht, Karten zu betrachten, aber es scheint, als könnte ich die regelmäßige Struktur meines Grundrisses nicht wirklich ausnutzen - vielleicht ist das wirklich der richtige Weg und ich nutze meine reguläre Struktur beim Aufbau einer Karte? Hat R ein Konzept, das ich für diese Art von Struktur verwenden sollte?

Am Ende werde ich eine lange Datendatei mit dem Typ der Zelle, den x- und y-Koordinaten des Clusters und einem "R" oder "G" (4 Spalten) bekommen.

+0

Vielleicht können Sie 'geom_tile' von' ggpolot2'? http://docs.ggplot2.org/current/geom_tile.html –

+0

Ich sah das, aber es sieht so aus, als ob alle Kacheln die gleiche Größe haben müssen? – chrysrobyn

+0

Einfachste Lösung wäre ein Hintergrundbild mit Grundriss und einem 'geom_point' /' geom_rect' zu verwenden, wäre das ausreichend? –

Antwort

0

Sie auch eine Low-Level-Grafik-Funktion schreiben kann; manchmal ist es einfacher wird, als mehr und mehr Komponenten aus einer komplexen Handlung zu entfernen,

enter image description here

library(grid) 
library(gridExtra) 

floorGrob <- function(S = c(TRUE, FALSE), J = c(TRUE, FALSE, TRUE, TRUE), 
         draw=TRUE, newpage=is.null(vp), vp=NULL){ 
    m <- rbind(c(1,3,4), # S1 J1 J2 
      c(7,7,7), # hall 
      c(2,5,6)) # S2 J3 J4 
    fills <- c(c("#FBB4AE","#CCEBC5")[c(S, J)+1], "grey90") 
    cellGrob <- function(f) rectGrob(gp=gpar(fill=f, col="white", lwd=2)) 
    grobs <- mapply(cellGrob, f=fills, SIMPLIFY = FALSE) 
    g <- arrangeGrob(grobs = grobs, layout_matrix = m, vp = vp, as.table = FALSE, 
       heights = unit(c(4/14, 1/14, 4/14), "null"), 
       widths = unit(c(6/14, 4/14, 4/14), "null"), respect=TRUE) 

    if(draw) { 
    if(newpage) grid.newpage() 
    grid.draw(g) 
    } 
    invisible(g) 
} 

floorGrob() 
0

Wie wäre es?

df <- expand.grid(x = 0:5, y = 0:5) 
df$color <- factor(sample(c("green", "red"), 36, replace = T)) 
head(df) 
# x y color 
# 1 0 0 green 
# 2 1 0 green 
# 3 2 0 green 
# 4 3 0 red 
# 5 4 0 green 
# 6 5 0 red 

library(ggplot2) 
ggplot(df, aes(x, y, fill = color)) + 
    geom_tile() + 
    scale_fill_manual(name = "Is it open?", 
        values = c("lightgreen", "#FF3333"), 
        labels = c("open", "not open")) 

Plot

+0

Ich kann nicht herausfinden, wie geom_tile(), dass einige X zu sagen (oder Y) Fliesen sind größer als andere. Fehle ich etwas Einfaches? – chrysrobyn

+0

Sie können Parameter 'geom_tile (aes (width = w, height = h))' für jede Kachel bereitstellen. – rhole