2015-03-23 6 views
5

Im Folgenden finden Sie ein reproduzierbares Beispiel für das Problem, das ich lösen möchte. Ich habe in ggplot2 eine Heatmap erstellt und die Dinge laufen gut. Da ich Prozentzeichen auf die Daten gesetzt habe, die mit geom_text verwendet werden, möchte ich die Legende von geom_tile auch dazu bringen, Prozentzeichen anzuzeigen (ich kann die tatsächlichen Werte nur mit 100 multiplizieren). Idealerweise hätte ich gerne den Legendenbalken auf der rechten Seite, der 8%, 4%, 0%, -4%, -8% anzeigt.Rufen Sie die ggplot2-Legende auf, um das Prozentzeichen in r anzuzeigen

#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

Nur ein Vorschlag --- Das nächste Mal, anstelle von "dput" rohe Daten, dann laden plyr und dplyr und reshape2 und Umgestaltung in 'GraphMelt', dann Plotten, einfach' dput (GraphMelt) ', so dass der Code in Ihrer Frage einfacher ist und wir muss nicht geladen werden 3 zusätzliche Pakete zum Ausführen Ihres Codes Danke, dass Sie Dinge reproduzierbar machen! – Gregor

+0

Das ist wirklich gutes Feedback und macht total Sinn. Ich versuche immer noch, den Dreh raus zu bekommen und versuche nur Fragen zu stellen, wenn ich wirklich feststecke. Mein nächster Post wird besser sein! –

+1

Keine Sorge! Sie machen bereits sehr gut reproduzierbare Beispiele - die Herausforderung besteht darin, sie zu minimieren, ohne zu viel zu schneiden. In diesem Fall dreht sich alles um eine Anzeigeoption für die Darstellung, so dass die Datenbearbeitung nicht notwendig ist. Manchmal ist es jedoch wichtig, ein wenig mehr von dem Prozess zu sehen, etwa wenn es dort einen potenziellen Fehler gibt. – Gregor

Antwort

11

Legen Sie die Waage Paket (Sie bereits haben, aber ich möchte über diese Abhängigkeit explizit sein)

library(scales) 

und fügen labels = percent zu satt Skala

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

Kann nicht glauben, dass es so einfach war. Sollte die Dokumente mehr für Skalen gelesen haben. Wirklich hilfreiches Paket. Nochmals vielen Dank für Ihren Rat. –