2016-07-26 36 views
1

Ich habe vor kurzem ein Diagramm gesehen, das ich in R replizieren möchte. Das Diagramm zeigt eine Punktzahl oder andere Messung für mehrere Datensätze als farbige Box, in etwa 4 Farben sortiert. In meinem Bild ist es rot, hellrot, hellgrün und grün. Jeder Datensatz erhält also eine Box für jede Punktzahl, die er hat - die Idee ist, dass jeder Datensatz für einen bestimmten Zeitpunkt über mehrere Zeitpunkte einen Score hat. In meinem Beispiel verwende ich die Testergebnisse der Schüler im Laufe der Zeit, also sagen wir, dass wir 4 Schüler und 8 Tests während des ganzen Jahres haben (in chronologischer Reihenfolge) würden wir 8 Boxen für jeden Schüler haben, was zu 32 Boxen führt. Jede Reihe (Student) würde 8 Boxen haben.Replizieren eines Trenddiagramms mit ggplot

hacked-up attempt of the chart

Hier ist, wie ich einige Beispieldaten erstellt:

totallynotrealdata <- data.frame(Student = c(rep("A",8),rep("B",8),rep("C",8),rep("D",8)),Test = rep(1:8,4), Score = sample(1:99,32,replace = TRUE), BinnedScore = cut(totallynotrealdata$TB,breaks = c(0,25,50,75,100),labels = c(1,2,3,4))) 

Was ich frage mich, wie ich diese Grafik in ggplot neu erstellen können? Irgendwelche Geome, die ich mir anschauen sollte?

Antwort

1

Sie könnten mit geom_rect() spielen. Dies ist sehr einfach, aber ich denke, man kann es leicht für Ihre Zwecke optimieren:

df <- data.frame(Student = c(rep(1,8),rep(2,8),rep(3,8),rep(4,8)), 
       Test = rep(1:8,4), 
       Score = sample(1:99,32,replace = TRUE)) 

df$BinnedScore <- cut(df$Score,breaks = c(0,25,50,75,100),labels = c(1,2,3,4)) 
df$Student  <- factor(df$Student, labels = LETTERS[1:length(unique(df$Student))]) 

library(ggplot2) 

colors <- c("#f23d2e", "#e39e9c", "#bbd3a8", "#68f200")  
numStuds <- length(levels(df$Student)) 
numTests <- max(df$Test) 

ggplot() + geom_rect(data = df, aes(xmin = Test-1, xmax = Test, ymin = as.numeric(Student)-1, ymax = as.numeric(Student)), fill = colors[df$BinnedScore], col = grey(0.5)) + 
    xlab("Test") + ylab("Student") + 
    scale_y_continuous(breaks = seq(0.5, numStuds, 1), labels = levels(df$Student)) + 
    scale_x_continuous(breaks = seq(0.5, numTests, 1), labels = 1:numTests) 

enter image description here

+0

ich geom_rect gesucht hatte(), aber wurde das ästhetische Mapping unter der ggplot Funktion eher als die geom Funktion tun ! Ich werde noch mehr damit spielen müssen – user2784067

+0

Übrigens, Ihr Endergebnis ist sehr angenehm auf das Auge! – user2784067