2015-03-23 13 views
5

Dưới đây là một ví dụ có thể tái tạo của vấn đề mà tôi đang cố giải quyết. Tôi đã tạo ra một bản đồ nhiệt của các loại trong ggplot2 và mọi thứ đã diễn ra tốt đẹp. Vì tôi đã đặt dấu hiệu phần trăm trên dữ liệu để sử dụng với geom_text tôi muốn làm cho truyền thuyết về geom_tile cũng để hiển thị các dấu hiệu phần trăm (tôi chỉ có thể nhân các giá trị thực tế bởi 100 ngay bây giờ). Lý tưởng nhất là tôi muốn thanh truyền thuyết ở bên phải hiển thị 8%, 4%, 0%, -4%, -8%.Nhận chú giải ggplot2 để hiển thị dấu phần trăm trong 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

Chỉ cần một gợi ý --- thời gian tới, thay vì 'dput'ing dữ liệu thô, sau đó tải plyr và dplyr và reshape2 và định lại thành' GraphMelt', sau đó vẽ, chỉ sử dụng 'dput (GraphMelt)' để mã trong câu hỏi của bạn đơn giản hơn và chúng ta không cần phải tải 3 gói bổ sung để chạy mã của bạn. Cảm ơn bạn đã làm mọi thứ có thể tái sản xuất! – Gregor

+0

Thats phản hồi thực sự tốt và làm cho ý nghĩa tổng thể. Vẫn cố gắng để có được treo bài đăng ở đây, tôi cố gắng chỉ đặt câu hỏi khi tôi thực sự bị mắc kẹt. Bài đăng tiếp theo của tôi sẽ tốt hơn! –

+1

Đừng lo! Bạn đã làm rất tốt các ví dụ tái sản xuất --- thách thức là làm cho chúng tối thiểu mà không cần cắt ra quá nhiều. Trong trường hợp này, đó là tất cả về tùy chọn hiển thị ô, do đó thao tác dữ liệu là không cần thiết. Đôi khi, tuy nhiên, điều quan trọng là phải xem thêm một chút về quy trình, như thể có một lỗi tiềm ẩn ở đó. – Gregor

Trả lời

11

tải gói quy mô (bạn đã có nó, nhưng tôi muốn được rõ ràng về sự phụ thuộc này)

library(scales) 

và thêm labels = percent quy mô điền của bạn

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

Không thể tin được điều đó thật đơn giản. Nên đã đọc các tài liệu nhiều hơn cho quy mô. Gói thực sự hữu ích. Cảm ơn một lần nữa cho lời khuyên của bạn. –

Các vấn đề liên quan