2011-12-06 38 views
13

Tôi đang cố tạo bản đồ nhiệt bằng ggplot2. Tôi tìm thấy this example, mà tôi đang cố gắng sao chép dữ liệu của mình, nhưng tôi gặp khó khăn. Dữ liệu của tôi là một tập tin .csv đơn giản mà trông như thế này:Làm thế nào để tạo bản đồ nhiệt với ggplot2?

people,apple,orange,peach 
mike,1,0,6 
sue,0,0,1 
bill,3,3,1 
ted,1,1,0 

Tôi muốn tạo ra một bản đồ nhiệt đơn giản mà tên của quả là trên trục x và người đó là trên trục y . Biểu đồ sẽ mô tả hình vuông nơi màu của mỗi ô vuông là biểu thị số quả tiêu thụ. Hình vuông tương ứng với mike:peach phải là màu tối nhất.

Đây là mã tôi đang sử dụng để cố gắng tạo ra Heatmap:

data <- read.csv("/Users/bunsen/Desktop/fruit.txt", head=TRUE, sep=",") 
fruit <- c(apple,orange,peach) 
people <- data[,1] 
(p <- ggplot(data, aes(fruit, people)) + geom_tile(aes(fill = rescale), colour = "white") + scale_fill_gradient(low = "white", high = "steelblue")) 

Khi tôi âm mưu dữ liệu này tôi nhận được số lượng trái cây trên trục x và nhân dân trên trục y. Tôi cũng không nhận được gradient màu đại diện cho số lượng trái cây. Làm thế nào tôi có thể lấy tên của các loại trái cây trên trục x với số quả ăn bởi một người được hiển thị dưới dạng bản đồ nhiệt? Sản lượng hiện tại tôi nhận được trong R trông như thế này:

enter image description here

Trả lời

30

Thành thật mà nói @ dr.bunsen - ví dụ của bạn ở trên là kém reproducable và bạn đã không đọc phần đầu của hướng dẫn mà bạn linked. Đây có lẽ là những gì bạn đang tìm kiếm:

library(reshape) 
library(ggplot2) 
library(scales) 

data <- structure(list(people = structure(c(2L, 3L, 1L, 4L), 
              .Label = c("bill", "mike", "sue", "ted"), 
              class = "factor"), 
         apple = c(1L, 0L, 3L, 1L), 
         orange = c(0L, 0L, 3L, 1L), 
         peach = c(6L, 1L, 1L, 0L)), 
        .Names = c("people", "apple", "orange", "peach"), 
        class = "data.frame", 
        row.names = c(NA, -4L)) 
data.m <- melt(data) 
data.m <- ddply(data.m, .(variable), transform, rescale = rescale(value)) 
p <- ggplot(data.m, aes(variable, people)) + 
     geom_tile(aes(fill = rescale), colour = "white") 
p + scale_fill_gradient(low = "white", high = "steelblue") 

enter image description here

+0

@GeekOnAcid Tôi cố gắng để chạy mã trên với dữ liệu trong câu hỏi ban đầu, nhưng nó thất bại với: Lỗi trong rescale (giá trị): Cách sử dụng : rescale (x, newrange) trong đó x là một đối tượng số và newrange là min và max mới. Có chuyện gì vậy? – Ali

+1

@AliSharifi Có, bạn đúng - phải có một số thay đổi trong 'ggplot2' và các gói khác đã xóa hàm' recale' hoặc chuyển nó sang hàm khác. Những gì bạn cần là sử dụng 'rescale' từ gói' scale' để rescale vector số để chỉ định tối thiểu và tối đa. Tôi đã cập nhật mã để có thể sao chép hoàn toàn. –

+0

@GeekOnAcid hoàn hảo! – Ali

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