2011-08-09 26 views
7

Tôi đang sử dụng geom_tile của ggplot để thực hiện các ô mật độ 2-D với một yếu tố. Mọi thang điểm của mọi khía cạnh đều đi từ mức tối thiểu của tất cả dữ liệu đến mức tối đa của tất cả dữ liệu, nhưng geom_tile trong mỗi khía cạnh chỉ mở rộng đến phạm vi dữ liệu được đánh dấu trong khía cạnh đó.Làm cách nào để buộc geom_tile của ggplot lấp đầy mọi khía cạnh?

Ví dụ mã đó chứng tỏ vấn đề:

library(ggplot2) 

data.unlimited <- data.frame(x=rnorm(500), y=rnorm(500)) 
data.limited <- subset(data.frame(x=rnorm(500), y=rnorm(500)), x<1 & y<1 & x>-1 & y>-1) 

mydata <- rbind(data.frame(groupvar="unlimited", data.unlimited), 
       data.frame(groupvar="limited", data.limited)) 

ggplot(mydata) + 
    aes(x=x,y=y) + 
    stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) + 
    facet_wrap(~ groupvar) 

facet

Run mã, và bạn sẽ thấy hai khía cạnh. Một khía cạnh cho thấy một âm mưu mật độ của một phân phối bình thường ngẫu nhiên "không giới hạn". Khía cạnh thứ hai cho thấy một cắt ngắn ngẫu nhiên bình thường nằm trong một hình vuông 2x2 về nguồn gốc. Geom_tile trong phần "giới hạn" sẽ bị giới hạn bên trong hộp nhỏ này thay vì làm đầy khía cạnh.

last_plot() + 
    scale_x_continuous(limits=c(-5,5)) + 
    scale_y_continuous(limits=c(-5,5)) 

specified limits

Ba dòng cuối cùng vẽ cùng một dữ liệu với x nhất định và giới hạn y, và chúng ta thấy rằng không phải khía cạnh mở rộng các phần gạch đến mép trong trường hợp này.

Có cách nào để buộc geom_tile trong mỗi khía cạnh để mở rộng đến phạm vi đầy đủ của các khía cạnh?

Trả lời

14

Tôi nghĩ rằng bạn đang tìm kiếm một sự kết hợp của scales = "free"expand = c(0,0):

ggplot(mydata) + 
    aes(x=x,y=y) + 
    stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) + 
    facet_wrap(~ groupvar,scales = "free") + 
    scale_x_continuous(expand = c(0,0)) + 
    scale_y_continuous(expand = c(0,0)) 

enter image description here

EDIT

Do làm rõ của OP, đây là một lựa chọn thông qua chỉ đơn giản là thiết lập các bảng nền theo cách thủ công:

ggplot(mydata) + 
    aes(x=x,y=y) + 
    stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) + 
    facet_wrap(~ groupvar) + 
    scale_fill_gradient(low = "blue", high = "red") + 
    opts(panel.background = theme_rect(fill = "blue"),panel.grid.major = theme_blank(), 
     panel.grid.minor = theme_blank()) 

enter image description here

+0

Không, tôi muốn tất cả các khía cạnh có cùng thang điểm. Về cơ bản, tôi chỉ muốn rắn màu xanh bên ngoài hộp 2x2 ở phía giới hạn, để chỉ ra rằng có mật độ bằng không ở đó. Nói cách khác, tôi không muốn các vảy co lại đến phạm vi dữ liệu, tôi chỉ muốn che phủ toàn bộ khu vực bằng geom_tile mà không thay đổi tỷ lệ. –

+0

Trong trường hợp đó, tốt hơn hết là bạn chỉ cần đặt nền bảng theo cách thủ công. Tôi sẽ cập nhật một ví dụ ... – joran

+0

@Ryan - Bạn cũng có thể xem [tại đây] (http://stackoverflow.com/questions/6906661/ggplot2-make-missing-value-in-geom-tile-not- trống) cho một tùy chọn khác, mặc dù tôi tin rằng giả sử bạn có các giá trị mật độ trong tay. – joran

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