2013-12-10 11 views
6

Sto riesaminando il problema che ho avuto circa un anno fa. Vorrei che la mia guida 'colourbar' fosse effettivamente visualizzata su una scala di log in modo che il take-away quando lo guardi è che i valori di blu sempre più scuri riflettono un significato maggiore.Ridimensiona/inserisci manualmente interruzioni sulla guida colorbar di geom_tile E sostituisci le etichette sull'asse y

Con questo codice, genero l'immagine qui sotto:

pz <- ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + ylab(NULL) + 
    scale_fill_gradientn(colours=c("#000066","#0000FF","#DDDDDD","white"), 
        values=c(0,0.05,0.050000000000001,1.0), 
        breaks=c(0, 0.000001, 0.01, 0.05, 1), 
        guide = "colourbar") + 
    theme_bw()+ 
    theme(panel.background = element_blank(), 
     panel.border = element_blank(), 
     axis.ticks.x = element_blank(), 
     axis.ticks.y = element_blank()) + 
    theme(legend.position="top", 
     legend.text = element_text(angle=45), 
     axis.text.x = element_text(angle=45) 
) 

colourbar

Oppure, posso visualizzarlo come una "leggenda" in contrapposizione ad un "COLOURBAR":

enter image description here

Ma quello che veramente desidero è qualcosa di simile:

01.235.164,106 mila

enter image description here

Ho provato ad aggiungere 'trans = "log"' (scale_fill_gradientn (trans = "log")), ma ci sono un sacco di zeri nel mio dati che causa un problema. Se avete qualche idea sarebbe molto apprezzato!


formulazione precedente:

Sto cercando di fare una mappa termica del p-value per i campioni differenti per le varie categorizzazioni. Ci sono due cose che vorrei modificare su questo terreno:

  1. vorrei regolare la leggenda della mia geom_tile complotto per sottolineare l'estremità inferiore della scala leggenda pur mantenendo l'intero spettro del gradiente - simile a come sarebbe se fosse una scala di registro. Quindi, in sostanza, la transizione da bianco a blu da 1,0 a 0,05 e la transizione da blu a blu scuro da 0,05 a 0,00 saranno approssimativamente di dimensioni uguali. C'è un modo per regolare manualmente la guida colorbar?

  2. Vorrei sostituire i nomi dell'asse y in modo da poter rimuovere la mia etichetta di riga "vuota". Nota, le Categorie sono semplicemente rappresentate come lettere qui, ma nel mio vero set di dati sono nomi lunghi. Ho inserito righe "fittizie" di dati per suddividere le categorizzazioni in mandrini e ho ordinato che le tessere all'interno di ciascun blocco passassero dal più significativo a non significativo - Sono sicuro che c'è una soluzione migliore a questo, ma questo è quello che ho scoperto dopo molti tentativi falliti di altre idee che ho trovato nello stack overflow! Ho provato a etichettarli con scale_y_discrete, ma questo diventa confuso con l'ordine di cui sopra.

L'aiuto con entrambi questi problemi sarà molto apprezzato!

sample_heatmap

Ecco un set di dati campione:

dput(dat.m) 
structure(list(Category = structure(c(12L, 11L, 10L, 9L, 8L, 
7L, 6L, 5L, 4L, 3L, 2L, 1L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 
4L, 3L, 2L, 1L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 
1L), class = "factor", .Label = c("j", "i", "empty2", "h", "empty1", 
"g", "f", "e", "d", "c", "b", "a")), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L), .Label = c("b2", "c1", "c2"), class = "factor"), 
    value = c(7.40214650772221e-06, 0.0075828339, 0.1825924627, 
    0.0384381317, 0.0440256659, 0.3659284985, 0.9777569144, 1, 
    0.0075828339, 1, 0.2193606406, 0.3659284985, 0.0004289756, 
    0.0011541045, 0.0004289756, 0.4400885491, 0.6121402215, 0.6724032426, 
    0.2735924085, 1, 0.018824582, 1, 0.4386503891, 0.4249526456, 
    1.05094571578633e-05, 0.0027216795, 0.715979827, 0.0050376405, 
    0.7473334763, 0.9053300832, 1, 1, 0.0015392848, 1, 0.039679469, 
    0.0950327519)), .Names = c("Category", "variable", "value" 
), row.names = c(NA, -36L), class = "data.frame") 

E qui è il mio codice:

col_blue <- c("#FFFFFF","#000099","#000066","#000033") 
ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + ylab(NULL) + 
    scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0),guide="colorbar") + 
    theme_mary(base_size=12) 

UPDATE:

Così ora ho modificato t codice in quanto tale con i seguenti risultati. Mi sto avvicinando a quello che spero di ottenere, ma mi piacerebbe giocare con le proporzioni della barra dei colori per mostrare il gradiente da 0,05 a 0,0 un po 'più chiaramente.

col_blue <- c("#FFFFFF","#000099","#000066","#000033") 
ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + ylab(NULL) + 
    scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0), guide=FALSE) + 
    scale_colour_gradientn(guide = "colourbar", limits = c(0,1),breaks=c(1,0.05,0.01,0),values=c(1,0.05,0.01,0),colours=c("#FFFFFF","#000099","#000066","#000033")) 

image2

+1

da dove proviene 'theme_mary'? –

+0

So che questo è un vecchio commento, ma poiché ho appena aggiornato la domanda qui è la risposta - theme_mary era un tema personalizzato che avevo precedentemente realizzato. L'ho rimosso dal codice aggiornato. Ci scusiamo per qualsiasi confusione! – ONeillMB1

risposta

0

per (1), semplicemente modificare i dati utilizzati per eliminare le righe vuote prima (o vi sono) stampa. es .: ggplot(dat.m[!grepl("^empty", dat.m$Category), ], aes(<etc>...))

per (2), è possibile ignorare l'estetica in modo specifico solo per la legenda. Ecco un esempio, regolare al vostro gusto: + guides(fill=guide_legend(override.aes=list(alpha=1)))

enter image description here

+0

Ciao Ricardo, grazie per il tuo contributo. Penso che non sia stato chiaro il problema numero 2. In realtà voglio la riga vuota lì (è per rompere gli schemi di categorizzazione nei miei dati reali), vorrei solo rimuovere l'etichetta. Per quanto riguarda il n. 1, desidero mantenere la scala dei colori continua. Tuttavia, vorrei avere la guida/legenda che mostra il gradiente da 0 a 0,05 e da 0,05 a circa la stessa lunghezza. – ONeillMB1

+0

Ho riformulato il numero 1 nel mio post per cercare di renderlo più chiaro. – ONeillMB1

+0

@ user2145578, quindi basta cambiare i livelli. 'levels (data) <- list (empty01 =" ", empty02 =" ")' –

2

Possiamo dire scale_fill_gradientn di non visualizzare una guida con guide=FALSE, quindi aggiungere manualmente nostro con limiti stabiliti per c(0,0.1) (o qualunque intervallo che si desidera).

ggplot(dat.m, aes(x=variable,y=Category)) + 
    geom_tile(aes(fill=value)) + 
    xlab(NULL) + 
    ylab(NULL) + 
    scale_fill_gradientn(colours=col_blue, values=c(1,0.05,0.01,0), guide=FALSE) + 
    scale_colour_gradientn(guide = "colorbar", limits = c(0,0.1), colours=col_blue) 

enter image description here

Per quanto riguarda il tuo secondo punto, perché non è sufficiente rimuovere le righe "vuoti" dai dati di origine prima della stampa?

+0

Grazie, questo è utile ma non proprio quello che sto cercando. La scala è in realtà il contrario di ciò che i colori sono indicati, che posso facilmente correggere invertendo l'ordine delle scale di colori. Tuttavia, desidero ancora mostrare l'intera scala, solo non distanziata linearmente, ha senso? Ad esempio, mi piacerebbe mostrare da 0 a 05.05 e da 0.05 a 0.50 in proporzioni approssimativamente uguali sulla guida/legenda. Per quanto riguarda le righe vuote, voglio uno spazio nella trama ed è per questo che ho aggiunto le righe vuote. Il mio attuale set di dati ha più categorie di categorie e vorrei uno spazio. – ONeillMB1

+0

Ho riformulato il problema numero 1 in modo che possa rendere più chiaro ciò che sto cercando di ottenere. – ONeillMB1

Problemi correlati