2014-04-08 15 views
11

Tôi đang vẽ một ma trận phân tán bằng cách sử dụng ggpairs. Tôi đang sử dụng đoạn mã sau:Cách thêm chú giải bên ngoài vào ggpairs()?

# Load required packages 
require(GGally) 

# Load datasets 
data(state) 
df <- data.frame(state.x77, 
       State = state.name, 
       Abbrev = state.abb, 
       Region = state.region, 
       Division = state.division 
) 
# Create scatterplot matrix 
p <- ggpairs(df, 
      # Columns to include in the matrix 
      columns = c(3,5,6,7), 

      # What to include above diagonal 
      # list(continuous = "points") to mirror 
      # "blank" to turn off 
      upper = "blank", 
      legends=T, 

      # What to include below diagonal 
      lower = list(continuous = "points"), 

      # What to include in the diagonal 
      diag = list(continuous = "density"), 

      # How to label inner plots 
      # internal, none, show 
      axisLabels = "none", 

      # Other aes() parameters 
      colour = "Region", 
      title = "State Scatterplot Matrix" 
) 

# Show the plot 
print(p) 

và tôi nhận được cốt truyện sau:

enter image description here

Bây giờ, người ta có thể dễ dàng nhận thấy rằng tôi nhận được huyền thoại cho tất cả các âm mưu trong ma trận. Tôi muốn có một huyền thoại phổ quát cho toàn bộ cốt truyện. Làm thế nào để làm điều đó? Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

+0

Tại sao điều này được dán nhãn 'shiny' ??? – jlhoward

+0

Đã xóa thẻ, cảm ơn bạn đã chỉ thẻ. – Patthebug

Trả lời

11

tôi đang làm việc trên một cái gì đó tương tự, đây là cách tiếp cận tôi sẽ mất,

  1. Đảm bảo truyền thuyết được đặt là 'TRUE' trong ggpairs chức năng gọi
  2. Bây giờ lặp qua các ô phụ trong cốt truyện ma trận và loại bỏ các truyền thuyết cho mỗi người trong số họ và chỉ giữ lại một trong số họ kể từ khi mật độ tất cả được vẽ trên cùng một cột.

    colIdx <- c(3,5,6,7) 
    
    for (i in 1:length(colIdx)) { 
    
        # Address only the diagonal elements 
        # Get plot out of matrix 
        inner <- getPlot(p, i, i); 
    
        # Add any ggplot2 settings you want (blank grid here) 
        inner <- inner + theme(panel.grid = element_blank()) + 
        theme(axis.text.x = element_blank()) 
    
        # Put it back into the matrix 
        p <- putPlot(p, inner, i, i) 
    
        for (j in 1:length(colIdx)){ 
        if((i==1 & j==1)){ 
    
         # Move legend right 
         inner <- getPlot(p, i, j) 
         inner <- inner + theme(legend.position=c(length(colIdx)-0.25,0.50)) 
         p <- putPlot(p, inner, i, j) 
        } 
        else{ 
    
         # Delete legend 
         inner <- getPlot(p, i, j) 
         inner <- inner + theme(legend.position="none") 
         p <- putPlot(p, inner, i, j) 
        } 
        } 
    } 
    
+0

Cảm ơn, điều này hoạt động hoàn hảo, đạt được chính xác những gì tôi đã hy vọng. – Patthebug

7

Hy vọng rằng, ai đó sẽ cho biết cách thực hiện điều này với ggpairs(...). Tôi muốn thấy bản thân mình. Cho đến lúc đó, đây là một giải pháp không sử dụng ggpairs(...), nhưng thay vào đó là vani đơn giản ggplot với các khía cạnh.

library(ggplot2) 
library(reshape2) # for melt(...) 
library(plyr)  # for .(...) 
library(data.table) 

xx <- with(df, data.table(id=1:nrow(df), group=Region, df[,c(3,5,6,7)])) 
yy <- melt(xx,id=1:2, variable.name="H", value.name="xval") 
setkey(yy,id,group) 
ww <- yy[,list(V=H,yval=xval),key="id,group"] 
zz <- yy[ww,allow.cartesian=T] 
setkey(zz,H,V,group) 
zz <- zz[,list(id, group, xval, yval, min.x=min(xval),min.y=min(yval), 
       range.x=diff(range(xval)),range.y=diff(range(yval))),by="H,V"] 
d <- zz[H==V,list(x=density(xval)$x, 
        y=min.y+range.y*density(xval)$y/max(density(xval)$y)), 
     by="H,V,group"] 
ggplot(zz)+ 
    geom_point(subset= .(xtfrm(H)<xtfrm(V)), 
      aes(x=xval, y=yval, color=factor(group)), 
      size=3, alpha=0.5)+ 
    geom_line(subset= .(H==V), data=d, aes(x=x, y=y, color=factor(group)))+ 
    facet_grid(V~H, scales="free")+ 
    scale_color_discrete(name="Region")+ 
    labs(x="", y="") 

Ý tưởng cơ bản là để melt(...)df của bạn sang định dạng thích hợp cho ggplot (xx), làm cho hai bản sao (yyww) và chạy một Descartes tham gia dựa trên idgroup (ở đây , id chỉ là một số hàng và group là biến số Region), để tạo zz. Chúng ta cần tính toán và quy mô mật độ bên ngoài (trong bảng dữ liệu d). Mặc dù vậy, nó vẫn chạy nhanh hơn ggpairs(...).

+0

cảm ơn câu trả lời của bạn. Chúng ta có thể loại bỏ ma trận tam giác trên mà không đóng góp nhiều? Lý do sử dụng ggpairs ban đầu cho tôi là chỉ hiển thị thông tin liên quan. – Patthebug

+1

Không. Không thể thiết lập các chủ đề khía cạnh một cách độc lập. – jlhoward

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