2012-10-21 13 views
14

Ho tre fattori (set1, set2 e set3) per ciascuno di circa 50 individui. I valori per set1, set2 e set3 sono "A", "B", "C". Mi piacerebbe creare una trama simile a Heatmap di questi dati, ma la legenda mostra il colore associato ai valori (ad es., A = 'rosso', B = 'blu', C = 'nero'). Eventuali suggerimenti?grafico simile alla heatmap, ma per le variabili categoriali

Grazie.

risposta

23

ho deciso che sarebbe stato easist per avvicinarsi a questo con ggplot2 (per me comunque):

#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

Grazie per una bella soluzione e ho upvoted ma penso che ci sia un errore di battitura nella libreria (rimodellare) dove 's' che manca da rimodellare – discipulus

+0

Grazie! Possiamo avere più di una legenda, infatti una legenda per riga perché ho variabili categoriali che significano diverse per righe diverse, ma ne ho solo quattro righe. – discipulus

+0

Sì, ma non so come. Ti incoraggio a fare una nuova domanda. –

3

Una trama simile può essere fatto anche con la grafica di base. Ecco un metodo che utilizza la funzione base image. Questo esempio ha una risposta categorica piuttosto che una numerica.

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]) 

che produrrà questa immagine.

sample image

Problemi correlati