heatmap-like plot, but for categorical variables

前端 未结 2 831
醉话见心
醉话见心 2020-12-01 16:54

I have three factors (set1, set2, and set3) for each of about 50 individuals. The values for set1, set2, and set3 are \"A\",\"B\",\"C\". I\'d like to make a heatmap-like p

相关标签:
2条回答
  • 2020-12-01 16:55

    A similar plot can also be made with base graphics. Here is one method using the base image function. This sample has a categorical response rather than a numeric one.

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

    which will produce this picture.

    sample image

    0 讨论(0)
  • 2020-12-01 17:02

    I decided it would be easist to approach this with ggplot2 (for me anyway):

    #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 讨论(0)
提交回复
热议问题