2011-04-01 30 views
17

Tôi có một khung dữ liệu với 3 biến, tất cả đều là tốc độ gió. Tôi muốn kiểm tra xem phần cứng đã được hiệu chuẩn như thế nào bằng cách vẽ tất cả các biến với nhau. Mặc dù có ba trong trường hợp này, có thể là có tối đa 6.Cách tạo một khía cạnh trong ggplot, ngoại trừ các biến khác nhau

Điều này sẽ dẫn đến 3 biểu đồ khác nhau, nơi các tham số xy tiếp tục thay đổi. Tôi thực sự muốn âm mưu này bằng cách sử dụng facets- hoặc một cái gì đó với sự xuất hiện tương tự.

Dưới đây là một số dữ liệu mẫu, trong một khung dữ liệu được gọi wind:

wind <- structure(list(speed_60e = c(3.029, 3.158, 2.881, 2.305, 2.45, 
2.358, 2.325, 2.723, 2.567, 1.972, 2.044, 1.745, 2.1, 2.08, 1.914, 
2.44, 2.356, 1.564, 1.942, 1.413, 1.756, 1.513, 1.263, 1.301, 
1.403, 1.496, 1.828, 1.8, 1.841, 2.014), speed_60w = c(2.981, 
3.089, 2.848, 2.265, 2.406, 2.304, 2.286, 2.686, 2.511, 1.946, 
2.004, 1.724, 2.079, 2.058, 1.877, 2.434, 2.375, 1.562, 1.963, 
1.436, 1.743, 1.541, 1.256, 1.312, 1.402, 1.522, 1.867, 1.837, 
1.873, 2.055), speed_40 = c(2.726, 2.724, 2.429, 2.028, 1.799, 
1.863, 1.987, 2.445, 2.282, 1.938, 1.721, 1.466, 1.841, 1.919, 
1.63, 2.373, 2.22, 1.576, 1.693, 1.185, 1.274, 1.421, 1.071, 
1.163, 1.166, 1.504, 1.77, 1.778, 1.632, 1.545)), .Names = c("speed_60e", 
"speed_60w", "speed_40"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30")) 

R> head(wind) 
    speed_60e speed_60w speed_40 
1  3.029  2.981 2.726 
2  3.158  3.089 2.724 
3  2.881  2.848 2.429 
4  2.305  2.265 2.028 
5  2.450  2.406 1.799 
6  2.358  2.304 1.863 

Tôi muốn vẽ đồ thị ba vuông. Một cá nhân có thể được vẽ bằng cách gọi số

ggplot() + geom_point(data=wind, aes(wind[,1],wind[,3]), alpha=I(1/30), 
         shape=I(20), size=I(1)) 

Bất kỳ ý tưởng nào về cách tôi có thể thực hiện việc này?

+0

+1 Đối với câu hỏi rất rõ ràng và sử dụng kết quả của dput() để chia sẻ dữ liệu của bạn – Andrie

Trả lời

25

Sẽ có điều gì đó như thế này?

plotmatrix(data = wind) + geom_smooth(method="lm") 

Mà cho:

pairs plotting in ggplot

Hadley này gọi là "ma trận thô nghiệm phân tán", nhưng nó có thể là đủ cho nhu cầu của bạn?

Chỉnh sửa: Hiện tại, plotmatrix() không đủ linh hoạt để xử lý tất cả các yêu cầu của @Chris 'về đặc điểm kỹ thuật của lớp geom_point(). Tuy nhiên, chúng ta có thể cắt các đường ruột ra khỏi plotmatrix() như sử dụng mã tốt đẹp của Hadley để tạo cấu trúc dữ liệu cần thiết cho âm mưu, nhưng cốt truyện nó tuy nhiên chúng tôi thích sử dụng các cuộc gọi tiêu chuẩn ggplot(). Chức năng này cũng giảm mật độ nhưng bạn có thể nhìn vào mã cho plotmatrix() để xem cách nhận chúng.

Đầu tiên, một hàm mở rộng dữ liệu từ định dạng rộng sang định dạng lặp lại được yêu cầu cho một ô mà chúng tôi vẽ từng biến với nhau, nhưng không phải chính nó.

Expand <- function(data) { 
    grid <- expand.grid(x = 1:ncol(data), y = 1:ncol(data)) 
    grid <- subset(grid, x != y) 
    all <- do.call("rbind", lapply(1:nrow(grid), function(i) { 
     xcol <- grid[i, "x"] 
     ycol <- grid[i, "y"] 
     data.frame(xvar = names(data)[ycol], yvar = names(data)[xcol], 
        x = data[, xcol], y = data[, ycol], data) 
    })) 
    all$xvar <- factor(all$xvar, levels = names(data)) 
    all$yvar <- factor(all$yvar, levels = names(data)) 
    all 
} 

Lưu ý:tất cả này không có gì ăn cắp mã Hadley từ plotmatrix() - Tôi đã làm gì ưa thích ở đây.

Mở rộng các dữ liệu:

wind2 <- Expand(wind) 

Bây giờ chúng ta có thể vẽ này như bất kỳ đối tượng dữ liệu dài định dạng khác theo yêu cầu của ggplot():

ggplot(wind2, aes(x = x, y = y)) + 
    geom_point(alpha = I(1/10), shape = I(20), size = I(1)) + 
    facet_grid(xvar ~ yvar, scales = "free") 

Nếu bạn muốn mật độ, sau đó chúng ta có thể rút khỏi bit của mã hai thành một hàm trợ giúp:

makeDensities <- function(data) { 
    densities <- do.call("rbind", lapply(1:ncol(data), function(i) { 
     data.frame(xvar = names(data)[i], yvar = names(data)[i], 
        x = data[, i]) 
    })) 
    densities 
} 

Sau đó tính toán d ensities cho dữ liệu gốc:

dens <- makeDensities(wind) 

và sau đó thêm sau đó sử dụng các bit cùng một đoạn mã từ plotmatrix():

ggplot(wind2, aes(x = x, y = y)) + 
     geom_point(alpha = I(1/10), shape = I(20), size = I(1)) + 
     facet_grid(xvar ~ yvar, scales = "free")+ 
     stat_density(aes(x = x, y = ..scaled.. * diff(range(x)) + min(x)), 
        data = dens, position = "identity", colour = "grey20", 
        geom = "line") 

Một phiên bản hoàn chỉnh của con số ban đầu tôi đã giới thiệu ở trên nhưng sử dụng mã khai thác sẽ là:

ggplot(wind2, aes(x = x, y = y)) + 
     geom_point(alpha = I(1/10), shape = I(20), size = I(1)) + 
     facet_grid(xvar ~ yvar, scales = "free")+ 
     stat_density(aes(x = x, y = ..scaled.. * diff(range(x)) + min(x)), 
        data = dens, position = "identity", colour = "grey20", 
        geom = "line") + 
     geom_smooth(method="lm") 

cho:

custom version of the pairs plot

+0

+1 Để cho tôi biết về plotmatrix() – Andrie

+0

Nếu tôi có thể bỏ phiếu thêm, tôi sẽ có. Số lượng công việc này xứng đáng với một số điểm bổ sung. Điều tốt nhất tiếp theo: Tôi sẽ liên lạc riêng với bạn và mua cho bạn một ly bia vào lần tới khi tôi ở Luân Đôn. – Andrie

+0

Tôi ước tôi có thể upvote điều này mãi mãi. –

4

Làm mới dữ liệu trước (chuyển đổi dữ liệu thành dạng dài).

mwind <- melt(wind) 
ggplot(mwind, aes(value)) + geom_histogram() + facet_wrap(~ variable) 

Nếu bạn muốn vẽ điểm, bạn cần thêm biến chỉ mục cho trục x.

+0

Điều này cũng hữu ích cho tôi- Tôi đã cố gắng làm tan dữ liệu nhưng không chắc chắn nên sử dụng làm id, vì vậy cảm ơn. – Chris

+0

@Chris một phần của vấn đề là đây là một tiêu chuẩn không tan chảy. Bạn đang có hiệu lực cần phải sao chép/nhân rộng dữ liệu ở định dạng dài để cho phép vẽ âm mưu của một biến so với các biến khác. Một sự tan chảy đơn giản sẽ không hoạt động - do đó những nỗ lực Hadley đã đi vào trong mã trong 'plotmatrix()'. Nếu một tan chảy đã có tác dụng, anh ta đã sử dụng nó thay thế. –

2

ggpairs từ gói GGally là khá đẹp để so sánh nhanh chóng của mỗi biến trong một dataframe:

ggpairs(wind) 

GGally default plot with wind data

Nó cũng sẽ xử lý so sánh các dữ liệu số và yếu tố.

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