2012-07-18 22 views
26
# data 
set.seed (123) 
xvar <- c(rnorm (1000, 50, 30), rnorm (1000, 40, 10), rnorm (1000, 70, 10)) 
yvar <- xvar + rnorm (length (xvar), 0, 20) 
myd <- data.frame (xvar, yvar) 


# density plot for xvar 
      upperp = 80 # upper cutoff 
      lowerp = 30 # lower cutoff 
      x <- myd$xvar 
      plot(density(x)) 
      dens <- density(x) 
      x11 <- min(which(dens$x <= lowerp)) 
      x12 <- max(which(dens$x <= lowerp)) 
      x21 <- min(which(dens$x > upperp)) 
      x22 <- max(which(dens$x > upperp)) 
      with(dens, polygon(x = c(x[c(x11, x11:x12, x12)]), 
       y = c(0, y[x11:x12], 0), col = "green")) 
      with(dens, polygon(x = c(x[c(x21, x21:x22, x22)]), 
       y = c(0, y[x21:x22], 0), col = "red")) 
      abline(v = c(mean(x)), lwd = 2, lty = 2, col = "red") 
# density plot with yvar 
    upperp = 70 # upper cutoff 
    lowerp = 30 # lower cutoff 
    x <- myd$yvar 
    plot(density(x)) 
    dens <- density(x) 
    x11 <- min(which(dens$x <= lowerp)) 
    x12 <- max(which(dens$x <= lowerp)) 
    x21 <- min(which(dens$x > upperp)) 
    x22 <- max(which(dens$x > upperp)) 
    with(dens, polygon(x = c(x[c(x11, x11:x12, x12)]), 
     y = c(0, y[x11:x12], 0), col = "green")) 
    with(dens, polygon(x = c(x[c(x21, x21:x22, x22)]), 
     y = c(0, y[x21:x22], 0), col = "red")) 
    abline(v = c(mean(x)), lwd = 2, lty = 2, col = "red") 

tôi cần phải mưu âm mưu mật độ hai chiều, tôi không chắc chắn có cách tốt hơn so với những điều sau đây:hai chiều âm mưu mật độ kết hợp với cốt truyện mật độ một cách với các vùng chọn trong r

ggplot(myd,aes(x=xvar,y=yvar))+ 
    stat_density2d(aes(fill=..level..), geom="polygon") + 
    scale_fill_gradient(low="blue", high="green") + theme_bw() 

Tôi muốn kết hợp tất cả ba loại trong một (tôi không biết nếu tôi có thể tạo ra âm mưu hai chiều trong ggplot), không có prefrence về việc liệu các giải pháp được lô là trong ggplot hoặc cơ sở hoặc hỗn hợp. Tôi hy vọng đây là dự án khả thi, xem xét tính bền vững của R. Cá nhân tôi thích ggplot2.

enter image description here

Lưu ý: các bóng thấp hơn trong âm mưu này là không đúng, màu đỏ nên luôn luôn thấp hơn và màu xanh lá cây trên trong xVar và yvar đồ thị, tương ứng với khu vực bóng mờ trong âm mưu mật độ xy.

Edit: Cuối cùng mong đợi trên đồ thị (nhờ Seth và jon cho câu trả lời rất gần) (1) loại bỏ không gian và trục đánh dấu nhãn vv để làm cho nó nhỏ gọn
(2) sắp xếp lưới để âm mưu giữa ve và lưới nên phù hợp với bọ ve và nhãn bên và kích thước của lô trông giống nhau. enter image description here

+4

Một câu trả lời ở đây có thể giúp đỡ với việc mật độ với ggplot http://stackoverflow.com/questions/ 8545035/scatterplot-with-marginal-histograms-in-ggplot2 – Seth

+0

Câu hỏi của bạn là rất cảm hứng và tôi tự hỏi nếu bạn có thể chia sẻ các mã cuối cùng có thể âm mưu con số trong bài viết của bạn? Cảm ơn rất nhiều. –

Trả lời

22

Dưới đây là ví dụ cho cách kết hợp nhiều lô với sự liên kết:

library(ggplot2) 
library(grid) 

set.seed (123) 
xvar <- c(rnorm (100, 50, 30), rnorm (100, 40, 10), rnorm (100, 70, 10)) 
yvar <- xvar + rnorm (length (xvar), 0, 20) 
myd <- data.frame (xvar, yvar) 

p1 <- ggplot(myd,aes(x=xvar,y=yvar))+ 
    stat_density2d(aes(fill=..level..), geom="polygon") + 
    coord_cartesian(c(0, 150), c(0, 150)) + 
    opts(legend.position = "none") 

p2 <- ggplot(myd, aes(x = xvar)) + stat_density() + 
    coord_cartesian(c(0, 150)) 
p3 <- ggplot(myd, aes(x = yvar)) + stat_density() + 
    coord_flip(c(0, 150)) 

gt <- ggplot_gtable(ggplot_build(p1)) 
gt2 <- ggplot_gtable(ggplot_build(p2)) 
gt3 <- ggplot_gtable(ggplot_build(p3)) 

gt1 <- ggplot2:::gtable_add_cols(gt, unit(0.3, "null"), pos = -1) 
gt1 <- ggplot2:::gtable_add_rows(gt1, unit(0.3, "null"), pos = 0) 

gt1 <- ggplot2:::gtable_add_grob(gt1, gt2$grobs[[which(gt2$layout$name == "panel")]], 
            1, 4, 1, 4) 
gt1 <- ggplot2:::gtable_add_grob(gt1, gt2$grobs[[which(gt2$layout$name == "axis-l")]], 
           1, 3, 1, 3, clip = "off") 

gt1 <- ggplot2:::gtable_add_grob(gt1, gt3$grobs[[which(gt3$layout$name == "panel")]], 
           4, 6, 4, 6) 
gt1 <- ggplot2:::gtable_add_grob(gt1, gt3$grobs[[which(gt3$layout$name == "axis-b")]], 
           5, 6, 5, 6, clip = "off") 
grid.newpage() 
grid.draw(gt1) 

enter image description here

lưu ý rằng điều này làm việc với gglot2 0.9.1, và trong bản phát hành trong tương lai bạn có thể làm điều đó dễ dàng hơn .

Và cuối cùng

bạn có thể làm điều đó bằng:

library(ggplot2) 
library(grid) 

set.seed (123) 
xvar <- c(rnorm (100, 50, 30), rnorm (100, 40, 10), rnorm (100, 70, 10)) 
yvar <- xvar + rnorm (length (xvar), 0, 20) 
myd <- data.frame (xvar, yvar) 

p1 <- ggplot(myd,aes(x=xvar,y=yvar))+ 
    stat_density2d(aes(fill=..level..), geom="polygon") + 
    geom_polygon(aes(x, y), 
       data.frame(x = c(-Inf, -Inf, 30, 30), y = c(-Inf, 30, 30, -Inf)), 
       alpha = 0.5, colour = NA, fill = "red") + 
    geom_polygon(aes(x, y), 
       data.frame(x = c(Inf, Inf, 80, 80), y = c(Inf, 80, 80, Inf)), 
       alpha = 0.5, colour = NA, fill = "green") + 
    coord_cartesian(c(0, 120), c(0, 120)) + 
    opts(legend.position = "none") 

xd <- data.frame(density(myd$xvar)[c("x", "y")]) 
p2 <- ggplot(xd, aes(x, y)) + 
    geom_area(data = subset(xd, x < 30), fill = "red") + 
    geom_area(data = subset(xd, x > 80), fill = "green") + 
    geom_line() + 
    coord_cartesian(c(0, 120)) 

yd <- data.frame(density(myd$yvar)[c("x", "y")]) 
p3 <- ggplot(yd, aes(x, y)) + 
    geom_area(data = subset(yd, x < 30), fill = "red") + 
    geom_area(data = subset(yd, x > 80), fill = "green") + 
    geom_line() + 
    coord_flip(c(0, 120)) 

gt <- ggplot_gtable(ggplot_build(p1)) 
gt2 <- ggplot_gtable(ggplot_build(p2)) 
gt3 <- ggplot_gtable(ggplot_build(p3)) 

gt1 <- ggplot2:::gtable_add_cols(gt, unit(0.3, "null"), pos = -1) 
gt1 <- ggplot2:::gtable_add_rows(gt1, unit(0.3, "null"), pos = 0) 

gt1 <- ggplot2:::gtable_add_grob(gt1, gt2$grobs[[which(gt2$layout$name == "panel")]], 
            1, 4, 1, 4) 
gt1 <- ggplot2:::gtable_add_grob(gt1, gt2$grobs[[which(gt2$layout$name == "axis-l")]], 
           1, 3, 1, 3, clip = "off") 

gt1 <- ggplot2:::gtable_add_grob(gt1, gt3$grobs[[which(gt3$layout$name == "panel")]], 
           4, 6, 4, 6) 
gt1 <- ggplot2:::gtable_add_grob(gt1, gt3$grobs[[which(gt3$layout$name == "axis-b")]], 
           5, 6, 5, 6, clip = "off") 
grid.newpage() 
grid.draw(gt1) 

enter image description here

10

Như trong ví dụ tôi đã liên kết ở trên, bạn cần gói gridExtra. Đây là g bạn đã cung cấp.

g=ggplot(myd,aes(x=xvar,y=yvar))+ 
    stat_density2d(aes(fill=..level..), geom="polygon") + 
    scale_fill_gradient(low="blue", high="green") + theme_bw() 

sử dụng geom_rect để vẽ hai khu vực

gbig=g+geom_rect(data=myd, 
     aes( NULL, 
      NULL, 
      xmin=0, 
      xmax=lowerp, 
      ymin=-10, 
      ymax=20), 
     fill='red', 
     alpha=.0051, 
     inherit.aes=F)+ 
    geom_rect(aes( NULL, 
      NULL, 
      xmin=upperp, 
      xmax=100, 
      ymin=upperp, 
      ymax=130), 
      fill='green', 
      alpha=.0051, 
      inherit.aes=F)+ 
    opts(legend.position = "none") 

Đây là một biểu đồ ggplot đơn giản; nó thiếu vùng màu của bạn, nhưng họ khá dễ dàng

dens_top <- ggplot()+geom_density(aes(x)) 
    dens_right <- ggplot()+geom_density(aes(x))+coord_flip() 

Thực hiện một biểu đồ trống để điền vào góc

empty <- ggplot()+geom_point(aes(1,1), colour="white")+ 
       opts(axis.ticks=theme_blank(), 
        panel.background=theme_blank(), 
        axis.text.x=theme_blank(), 
        axis.text.y=theme_blank(),   
        axis.title.x=theme_blank(), 
        axis.title.y=theme_blank()) 

Sau đó sử dụng chức năng grid.arrange:

library(gridExtra) 

grid.arrange(dens_top,  empty  , 
      gbig,   dens_right, 
       ncol=2, 
       nrow=2, 
       widths=c(4, 1), 
       heights=c(1, 4)) 

enter image description here

Không đẹp lắm nhưng ý tưởng ở đó. Bạn sẽ phải đảm bảo cân xứng hợp với nhau!

+0

Cảm ơn câu trả lời Seth, nó thực sự là bước tiến ... Tôi vẫn có thể cần phải làm việc trên các khu vực trong các ô mật độ maringal (màu đỏ và màu xanh lá cây) và hiển thị các dòng trung bình. Cũng loại bỏ x trục lebel trong các ô mật độ và làm cho các ô nhỏ gọn. – SHRram

+0

Quan trọng nhất là thang xvar và yvar trong tất cả các ô cần phải khớp nhau ... – SHRram

+0

câu hỏi này là về việc đặt giới hạn. http://stackoverflow.com/questions/3606697/how-to-set-x-axis-limits-in-ggplot2-r-plots – Seth

9

Xây dựng dựa trên câu trả lời của Seth (cảm ơn Seth và bạn xứng đáng nhận được tất cả tín dụng), tôi đã cải thiện một số vấn đề mà người hỏi đặt ra. Vì nhận xét quá ngắn để trả lời tất cả các vấn đề tôi chọn sử dụng làm câu trả lời.Một vài vấn đề vẫn còn đó, cần sự giúp đỡ của bạn:

# data 
set.seed (123) 
xvar <- c(rnorm (1000, 50, 30), rnorm (1000, 40, 10), rnorm (1000, 70, 10)) 
yvar <- xvar + rnorm (length (xvar), 0, 20) 
myd <- data.frame (xvar, yvar) 

require(ggplot2) 

# density plot for xvar 
upperp = 80 # upper cutoff 
lowerp = 30 

con số giữa

g=ggplot(myd,aes(x=xvar,y=yvar))+ 
    stat_density2d(aes(fill=..level..), geom="polygon") + 
    scale_fill_gradient(low="blue", high="green") + 
    scale_x_continuous(limits = c(0, 110)) + 
    scale_y_continuous(limits = c(0, 110)) + theme_bw() 

geom_rect hai khu vực

gbig=g+ geom_rect(data=myd, aes( NULL, NULL, xmin=0, 
xmax=lowerp,ymin=0, ymax=20), fill='red', alpha=.0051,inherit.aes=F)+ 
geom_rect(aes(NULL, NULL, xmin=upperp,   xmax=110, 
ymin=upperp,   ymax=110),   fill='green',    
    alpha=.0051, 
      inherit.aes=F)+ 
    opts(legend.position = "none", 
    plot.margin = unit(rep(0, 4), "lines")) 

Lên trên biểu đồ với khu vực bóng mờ

x.dens <- density(myd$xvar) 
    df.dens <- data.frame(x = x.dens$x, y = x.dens$y) 

    dens_top <- ggplot()+geom_density(aes(myd$xvar, y = ..density..)) 
+ scale_x_continuous(limits = c(0, 110)) + 
geom_area(data = subset(df.dens, x <= lowerp), aes(x=x,y=y), fill = 'red') 
+ geom_area(data = subset(df.dens, x >= upperp), aes(x=x,y=y), fill = 'green') 
+ opts (axis.text.x=theme_blank(), axis.title.x=theme_blank(), 
    plot.margin = unit(rep(0, 4), "lines")) + xlab ("") + ylab ("") + theme_bw() 

histogram đúng với khu vực bóng mờ

y.dens <- density(myd$yvar) 
    df.dens.y <- data.frame(x = y.dens$x, y = y.dens$y) 

    dens_right <- ggplot()+geom_density(aes(myd$yvar, y = ..density..)) 
    + scale_x_continuous(limits = c(0, 110)) + 
    geom_area(data = subset(df.dens.y, x <= lowerp), aes(x=x,y=y), 
    fill = 'red') 
    + geom_area(data = subset(df.dens.y, x >= upperp), aes(x=x,y=y), 
    fill = 'green') 
    +  coord_flip() + 


opts (axis.text.x=theme_blank(), axis.title.x=theme_blank(), 
    plot.margin = unit(rep(0, 4), "lines")) + xlab ("") + ylab ("") 
    + theme_bw() 

Thực hiện một biểu đồ trống để điền vào góc

 empty <- ggplot()+geom_point(aes(1,1), colour="white")+ 
     scale_x_continuous(breaks = NA) + scale_y_continuous(breaks = NA) + 
       opts(axis.ticks=theme_blank(), 
        panel.background=theme_blank(), 
        axis.text.x=theme_blank(), 
        axis.text.y=theme_blank(), 
        axis.title.x=theme_blank(), 
        axis.title.y=theme_blank()) 

Sau đó sử dụng chức năng grid.arrange:

library(gridExtra) 
grid.arrange(dens_top, empty , gbig, dens_right, ncol=2,nrow=2, 
widths=c(2, 1), heights=c(1, 2)) 

enter image description here

PS: (1) Ai đó có thể giúp sắp xếp các đồ thị một cách hoàn hảo? (2) Ai đó có thể giúp đỡ để loại bỏ các không gian bổ sung giữa các lô, tôi đã cố gắng điều chỉnh lề - nhưng có khoảng cách giữa x và mật độ y cốt truyện và cốt truyện trung tâm.

+0

cảm ơn, dường như có một khoảng cách giữa vùng được điền và mật độ dòng, nếu có bất kỳ cách nào để cải thiện nó? – SHRram

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