2015-03-23 9 views
5

Di seguito è riportato un esempio riproducibile del problema che sto tentando di risolvere. Ho creato una heatmap di sorta in ggplot2 e le cose stanno andando bene. Dato che ho inserito segni di percentuale sui dati da utilizzare con geom_text, vorrei fare in modo che la legenda di geom_tile mostri anche i segni di percentuale (in questo momento posso solo moltiplicare i valori effettivi di 100). Idealmente, mi piacerebbe che la barra della legenda sulla destra mostri l'8%, il 4%, lo 0%, il -4% e l'8%.Ottieni la legenda di ggplot2 per visualizzare il segno di percentuale r

#load in libraries 
require(plyr) 
require(dplyr) 
require(reshape2) 
require(ggplot2) 
require(scales) 

testDF <- structure(list(strategies = structure(c(8L, 7L, 6L, 5L, 4L, 3L, 
                2L, 1L), .Label = c("Class 1", "Class 2", 
                     "Class 3", "Class 4", "Class 5", "Class 6", 
                     "Class 7", "Class 8"), class = "factor"), 
         School1 = c(0.0355662887589396, 0.0316753241146625, 0.00606392341292672, 
            0.0250738342627283, -0.0405709181701368, 0.0237665074609996, 
            0.00587364885411765, -0.0343914002059331), School2 = c(NA, NA, 
                          NA, 0.0225535750673764, NA, -0.00448947685878404, NA, -0.0446386763157662 
            ), School3 = c(NA, NA, NA, 0.0261099462365593, NA, 0.0199735626692146, 
                NA, -0.0272279264519992), School4 = c(NA, NA, NA, 0.0164004151291513, 
                          NA, 0.00567638888888868, NA, -0.0384017249374949)), .Names = c("schools", 
                                         "School1", "School2", "School3", "School4"), row.names = c(NA, -8L), class = "data.frame") 


GraphMelt <- melt(testDF) 
GraphMelt <- GraphMelt %>% mutate(text = sprintf("%1.2f%%", 100*value)) 
GraphMelt[,"text"] <- ifelse(GraphMelt[,"text"]=="NA%",NA,GraphMelt[,"text"])          
p <- ggplot(GraphMelt, aes(variable, schools)) 
p <- p + geom_tile(aes(fill = value*100), colour = "white") + geom_text(aes(label=text),size=7) 
p <- p + scale_fill_gradient(low = "red", high = "green",limits=c(-8,8)) 
p <- p + theme(
    axis.text.x= element_text(color="black", size=14, vjust=0.5), 
    axis.text.y= element_text(color="black", size=14, vjust=0.5), 
    axis.title.y = element_text(color="black",size=14, vjust=0.5), 
    plot.title = element_text(color="black",size=14,face="bold", hjust=0.5,vjust=1), 
    panel.background = element_blank(), 
    legend.position="right", 
    legend.title = element_blank(), 
    legend.key = element_rect(fill="white"), legend.background = element_rect(fill=NA) 
) 
p <- p + xlab("") + ylab("") + ggtitle("Schools") 
+0

Solo un suggerimento --- la prossima volta, invece di 'dput'ing dati grezzi, quindi caricare plyr e dplyr e reshape2 e rimodellare in' GraphMelt', quindi tracciare, basta usare 'dput (GraphMelt)' così il codice nella tua domanda è più semplice e noi non devi caricare 3 pacchetti extra per eseguire il tuo codice. Grazie per aver reso le cose riproducibili! – Gregor

+0

Questo è davvero un buon feedback e ha perfettamente senso. Sto ancora cercando di ottenere il blocco del post qui, provo a fare solo domande quando sono davvero bloccato. Il mio prossimo post sarà migliore! –

+1

Nessun problema! Stai già facendo molto bene facendo esempi riproducibili --- la sfida è renderli minimi senza tagliare troppo. In questo caso si tratta di un'opzione di visualizzazione del grafico, quindi la manipolazione dei dati non è necessaria. A volte, però, è importante vedere un po 'più del processo, come se ci fosse un potenziale bug lì. – Gregor

risposta

11

caricare il pacchetto scale (è già in possesso, ma voglio essere espliciti su questa dipendenza)

library(scales) 

e aggiungere labels = percent per la vostra scala di riempimento

scale_fill_gradient(low = "red", high = "green",limits=c(-8,8), labels = percent) 
+0

Non credo sia stato così semplice. Dovrebbe aver letto i documenti più per le scale. Pacchetto davvero utile. Grazie ancora per il tuo consiglio. –

Problemi correlati