2012-10-21 9 views
14

Mam trzy czynniki (set1, set2 i set3) dla każdej z około 50 osób. Wartości dla set1, set2 i set3 to "A", "B", "C". Chciałbym sporządzić wykres podobny do mapy termicznej tych danych, ale legenda pokazuje kolor związany z wartościami (np. A = "czerwony", B = "niebieski", C = "czarny"). Jakieś sugestie?Wykres podobny do mapy ciepła, ale dla zmiennych jakościowych

Dzięki.

Odpowiedz

23

postanowiłem byłoby easist podejść do tego z ggplot2 (przynajmniej dla mnie):

#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

Dzięki za miły rozwiązanie i mam upvoted ale myślę, że to literówka w bibliotece (przekształcenia), gdzie „s” brakuje przekształcenia – discipulus

+0

Dzięki! Czy możemy mieć więcej niż jedną legendę, infekować jedną legendę w wierszu, ponieważ mam zmienne kategoryczne, które oznaczają różne dla różnych wierszy, ale mam tylko cztery rzędy z nich. – discipulus

+0

Tak, ale nie wiem jak. Zachęcam cię do zadawania nowego pytania. –

3

Podobna fabuła może być również wykonany z grafiką bazowych. Oto jedna metoda wykorzystująca funkcję base image. Ta próbka ma kategoryczną odpowiedź, a nie numeryczną.

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

, który wykona to zdjęcie.

sample image

Powiązane problemy