2015-03-23 16 views
5

Aşağıda, çözmeye çalışıyorum sorunun yeniden üretilebilir bir örneğidir. Ggplot2'de bir çeşit ısı haritası oluşturdum ve işler iyi gidiyor. Geom_text ile kullanılacak verilere yüzde işaretler koyduğumdan, geom_tile efsanesini de yüzde işaretlerini göstermek istiyorum (gerçek değerleri şimdi 100 ile çarpabilirim). İdeal olarak, sağdaki gösterge çubuğu% 8,% 4,% 0,% -4, -8% göstermesini istiyorum.ggplot2 gösterge tablosunu yüzde işaretini görüntülemek için yararlanın.

#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

Sadece bir öneri için labels = percent eklemek --- bir dahaki sefere, 'dput' ham verileri yerine, daha sonra plyr ve dplyr ve reshape2 'yi yükleyerek ve' GraphMelt '' e yeniden biçimlendirmek, sonra çizim yapmak, sadece 'dput' (GraphMelt) 'yi kullanmak yeterlidir, böylece sorunuzdaki kod daha basittir ve biz yüklemek zorunda değilsiniz Kodunuzu çalıştırmak için 3 ekstra paket. Yeniden üretilebilir şeyler yaptığınız için teşekkürler! – Gregor

+0

Bu gerçekten iyi geribildirim ve tam anlam ifade ediyor. Hala burada asılmaya çalışıyorum, sadece gerçekten sıkışıp kaldığımda soru sormaya çalışıyorum. Bir sonraki yazı daha iyi olacak! –

+1

Endişeye gerek yok! Zaten çok iyi bir şekilde yeniden üretilebilir örnekler yapıyorsunuz --- zorluk, çok fazla kesintiye uğramadan onları en aza indiriyor. Bu durumda her şey bir arsa görüntüleme seçeneğidir, bu yüzden veri manipülasyonu gerekli değildir. Ancak, bazen, potansiyel bir hata varsa, işlemin biraz daha fazlasını görmek önemlidir. – Gregor

cevap

11

Yük ölçekler paketi (zaten sahip ama bu bağımlılık hakkında açık olmak istiyorum)

library(scales) 

ve dolgu ölçek

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

Bu kadar basit olduğuna inanıyorum. Ölçekler için dokümanlar daha fazla okumalıydı. Gerçekten yararlı bir paket. Tavsiyen için tekrar teşekkürler. –

İlgili konular