2012-10-21 12 views
14

Ich habe drei Faktoren (set1, set2 und set3) für jede von etwa 50 Personen. Die Werte für set1, set2 und set3 sind "A", "B", "C". Ich möchte eine Heatmap-artige Darstellung dieser Daten erstellen, aber die Legende soll die Farbe zeigen, die den Werten zugeordnet ist (z. B. A = 'rot', B = 'blau', C = 'schwarz'). Irgendwelche Vorschläge?heatmap-like plot, aber für kategoriale Variablen

Danke.

Antwort

23

Ich beschloss, es easist wäre dies mit ggplot2 zu nähern (für mich jedenfalls):

#recreate a data set 
dat <- data.frame(person=factor(paste0("id#", 1:50), 
    levels =rev(paste0("id#", 1:50))), matrix(sample(LETTERS[1:3], 150, T), ncol = 3)) 

library(ggplot2); library(reshape2) 
dat3 <- melt(dat, id.var = 'person') 
ggplot(dat3, aes(variable, person)) + geom_tile(aes(fill = value), 
    colour = "white") + scale_fill_manual(values=c("red", "blue", "black")) 

enter image description here

+0

Vielen Dank für eine schöne Lösung, und ich habe upvoted aber ich denke, dass es ein Tippfehler in der Bibliothek ist (umformen), wo ‚s‘ fehlt reshape – discipulus

+0

Dank! Können wir mehr als eine Legende haben, tatsächlich eine Legende pro Zeile, da ich kategoriale Variablen habe, die für verschiedene Zeilen unterschiedlich sind, aber ich habe nur vier Reihen davon. – discipulus

+0

Ja, aber ich weiß nicht wie. Ich würde Sie ermutigen, eine neue Frage zu stellen. –

3

Ein ähnliches Grundstück kann auch mit Basis Grafiken gemacht werden. Hier ist eine Methode, die die Basisfunktion image verwendet. Dieses Beispiel hat eine kategorische Antwort und keine numerische Antwort.

dx <- data.frame(Tasks = c('1','2','3','4'), 
        Phase1 = c('Done','Done','Done','WIP'), 
        Phase2 = c('WIP','Done','Done',''), 
        Phase3 = c('','WIP','Done','')) 

ff<-factor(as.matrix(dx[,2:4]), 
    levels=c("Done","WIP",""), 
    labels=c("done","wip","-empty-") 
) 
fx<-matrix(as.numeric(ff), ncol=ncol(dx)-1) 

#use labels to assign colors 
col<-c(done="darkgreen",wip="orange","-empty-"="black") 

imgflip<-function(x) {t(x[nrow(x):1,])} 

image(imgflip(fx), 
    breaks=(1:(nlevels(ff)+1))-.5, 
    col=col[levels(ff)], 
    xaxt="n", yaxt="n" 
) 
axis(2, at=seq(0,1,length.out=nrow(dx)), labels=rev(paste("Task",dx$Tasks)), las=2) 
axis(3, at=seq(0,1,length.out=length(names(dx))-1), labels=names(dx)[-1]) 

, die dieses Bild produzieren wird.

sample image

Verwandte Themen