2012-03-12 38 views
13

fewposts liên quan đến việc sử dụng các vùng tô bóng trong ggplot2, nhưng tôi không nghĩ chính xác câu trả lời cho câu hỏi của mình. Tôi có hai sườn cho các dòng trên một số điều kiện, và tôi muốn che khu vực giữa chúng. Dưới đây là ví dụ dữ liệu:r - ggplot2 - tạo vùng mờ giữa hai lớp geom_abline

dat <- data.frame(cond1=c("a","a","b","b"), 
       cond2=c("c","d","c","d"), 
       x=c(1,5), 
       y=c(1,5), 
       sl=c(1,1.2,0.9,1.1), 
       int=c(0,0.1,0.1,0), 
       slopeU=c(1.1,1.3,1.2,1.2), 
       slopeL=c(.9,1,0.7,1)) 

đây, sl là tham số độ dốc trung bình từ một thủ tục phù hợp riêng biệt, và slopeUslopeL đại diện cho các khu vực tự tin trên và dưới trên ước tính độ dốc trong từng trường hợp. Các chặn được ràng buộc là giống nhau. Các mã sau âm mưu các đường phù hợp nhất với từng điều kiện sử dụng một số faceting:

p <- ggplot(dat,aes(x=x,y=y,colour=cond1)) 
p <- p + facet_grid(. ~ cond2) 
p <- p + geom_blank() 
p <- p + geom_abline(aes(intercept=int,slope=sl,colour=cond1),data=dat) 
p 

Tôi muốn thêm những dòng xác định bởi intercept=int, slope=slopeUintercept=int, slope=slopeL đến cốt truyện và bóng khu vực giữa chúng (ví dụ như tại alpha=.5 trong tương ứng màu cond1). Tôi nhận ra rằng với một thao tác nhỏ, tôi có thể tạo một khung dữ liệu xác định giá trị của những dòng này cho ít nhất hai giá trị x, sau đó vẽ geom_ribbon tương ứng hoặc geom_polygon để tạo vùng tô bóng, tuy nhiên tôi muốn tìm thêm giải pháp thanh lịch. Hoặc là tự xác định một số tọa độ từ các sườn dốc và chặn đường duy nhất? Làm cách nào tốt nhất tôi nên tạo khung dữ liệu bắt buộc (cần phải có nhiều hàng hơn khung gốc để tính tất cả các kết hợp điều kiện và cặp x, y).

Trả lời

10

Cá nhân, tôi nghĩ rằng việc tạo khung dữ liệu và sử dụng geom_ribbon giải pháp thanh lịch, nhưng rõ ràng ý kiến ​​sẽ khác nhau về điểm số đó.

Nhưng nếu bạn tận dụng tối đa plyrggplot điều có thể nhận được khá trơn. Kể từ sườn và chặn của bạn đều độc đáo được lưu trữ trong một dataframe dù sao, chúng ta có thể sử dụng plyr và một chức năng tùy chỉnh để làm tất cả những công việc:

dat <- data.frame(cond1=c("a","a","b","b"), 
      cond2=c("c","d","c","d"), 
      x=c(1,5), 
      y=c(1,5), 
      sl=c(1,1.2,0.9,1.1), 
      int=c(0,0.1,0.1,0), 
      slopeU=c(1.1,1.3,1.2,1.2), 
      slopeL=c(.9,1,0.7,1)) 

genRibbon <- function(param,xrng){ 
    #xrng is a vector of min/max x vals in original data 
    r <- abs(diff(xrng)) 
    #adj for plot region expansion 
    x <- seq(xrng[1] - 0.05*r,xrng[2] + 0.05*r,length.out = 3) 
    #create data frame 
    res <- data.frame(cond1 = param$cond1, 
         cond2 = param$cond2, 
         x = x, 
         y = param$int + param$sl * x, 
         ymin = param$int + param$slopeL * x, 
         ymax = param$int + param$slopeU * x) 
    #Toss the min/max x vals just to be safe; needed them 
    # only to get the corresponding y vals 
    res$x[which.min(res$x)] <- -Inf 
    res$x[which.max(res$x)] <- Inf 
    #Return the correspondinng geom_ribbon 
    geom_ribbon(data = res,aes(x = x,y=y, ymin = ymin,ymax = ymax, 
           fill = cond1,colour = NULL), 
       alpha = 0.5) 
} 

ribs <- dlply(dat,.(cond1,cond2),genRibbon,xrng = c(1,5)) 

Điều trơn thêm ở đây là tôi loại bỏ được tạo ra khung dữ liệu hoàn toàn và chỉ trả về một danh sách các đối tượng geom_ribbon. Sau đó, họ chỉ có thể được thêm vào cốt truyện của chúng tôi:

p + ribs + 
    guides(fill = guide_legend(override.aes = list(alpha = 0.1))) 

Tôi overrode các alpha thẩm mỹ trong truyền thuyết bởi vì lần đầu tiên xung quanh bạn không thể nhìn thấy các đường chéo trong truyền thuyết.

enter image description here

tôi sẽ cảnh báo bạn rằng dòng cuối cùng đó mà tạo ra các âm mưu cũng ném rất nhiều cảnh báo về mức độ yếu tố không hợp lệ, và tôi thật sự không chắc chắn lý do tại sao. Nhưng cốt truyện có vẻ ok.

+0

Điều đó thật tuyệt vời; cảm ơn Joran. – tsawallis

+0

Vì vậy, về cơ bản các công trình với vấn đề áp dụng của tôi, nhưng tôi không thể có được các màu sắc trên các khu vực bóng mờ để cond1, thậm chí bằng cách chạy giải pháp của bạn chính xác. Các vùng ruy băng đầy màu xám (ở alpha = .5) nhưng cũng có đường viền đường nét liền mảnh. Tôi làm sai ở đâu? Đây có phải là sự khác biệt phiên bản ggplot2 không? Tôi đang ở 0.9.0. Lệnh ggplot mà tôi đang sử dụng cũng giống như trong bài gốc, với các hướng dẫn 'p + ribs + (fill = guide_legend (ghi đè lên .aes = list (alpha = 0.1)))' được dán dưới đây. – tsawallis

+0

@waldog Xin lỗi, tôi đã bỏ lỡ một chút khi sao chép + dán mã của tôi.Bạn chỉ cần thêm 'fill = cond1' vào' aes() 'hoặc trong cuộc gọi' ggplot() 'ở mức cao nhất, hoặc trong cuộc gọi' geom_ribbon' bên trong hàm. Tôi sẽ chỉnh sửa trong giây lát ... – joran

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