2012-05-08 40 views
19

Tôi đang cố gắng tạo lại một hình từ hội thảo GGplot2 http://dl.dropbox.com/u/42707925/ggplot2/ggplot2slides.pdf.ggplot2 - jitter và vị trí né tránh với nhau

Trong trường hợp này, tôi đang cố gắng tạo Ví dụ 5, với các điểm dữ liệu bị jitter phải chịu né. Khi tôi chạy mã, các điểm được căn giữa quanh dòng chính xác, nhưng không có jitter.

Đây là mã trực tiếp từ bản trình bày.

set.seed(12345) 
hillest<-c(rep(1.1,100*4*3)+rnorm(100*4*3,sd=0.2), 
     rep(1.9,100*4*3)+rnorm(100*4*3,sd=0.2)) 
rep<-rep(1:100,4*3*2) 
process<-rep(rep(c("Process 1","Process 2","Process 3","Process 4"),each=100),3*2) 
memorypar<-rep(rep(c("0.1","0.2","0.3"),each=4*100),2) 
tailindex<-rep(c("1.1","1.9"),each=3*4*100) 
ex5<-data.frame(hillest=hillest,rep=rep,process=process,memorypar=memorypar, tailindex=tailindex) 
stat_sum_df <- function(fun, geom="crossbar", ...) {stat_summary(fun.data=fun, geom=geom, ...) } 

dodge <- position_dodge(width=0.9) 
p<- ggplot(ex5,aes(x=tailindex ,y=hillest,color=memorypar)) 
p<- p + facet_wrap(~process,nrow=2) + geom_jitter(position=dodge) +geom_boxplot(position=dodge) 
p 
+1

Cho rằng Didzis Elferts đã cung cấp một câu trả lời tốt hơn sử dụng 'position_jitterdodge' sẵn trong phiên bản ggplot2 1.0.0, bạn nên bỏ chấp nhận câu trả lời của tôi và chấp nhận câu trả lời cung cấp bởi Didzis Elferts. –

Trả lời

27

EDIT: Có một giải pháp tốt hơn với ggplot2 phiên bản 1.0.0 sử dụng position_jitterdodge. Xem câu trả lời của @Didzis Elferts. Lưu ý rằng dodge.width kiểm soát chiều rộng của dodging và jitter.width kiểm soát chiều rộng của jittering.

Tôi không chắc chắn cách mã tạo biểu đồ trong pdf.

Nhưng có điều gì đó như thế này giúp bạn gần gũi với những gì bạn đang theo dõi?

Tôi chuyển đổi tailindexmemorypar thành số; thêm chúng lại với nhau; và kết quả là tọa độ x cho lớp geom_jitter. Có lẽ một cách hiệu quả hơn để làm điều đó. Ngoài ra, tôi muốn xem làm thế nào né tránh geom_boxplotgeom_jitter, và không có jittering, sẽ tạo ra các đồ thị trong pdf.

library(ggplot2) 
dodge <- position_dodge(width = 0.9) 
ex5$memorypar2 <- as.numeric(ex5$tailindex) + 
    3 * (as.numeric(as.character(ex5$memorypar)) - 0.2) 

p <- ggplot(ex5,aes(x=tailindex , y=hillest)) + 
    scale_x_discrete() + 
    geom_jitter(aes(colour = memorypar, x = memorypar2), 
    position = position_jitter(width = .05), alpha = 0.5) + 
    geom_boxplot(aes(colour = memorypar), outlier.colour = NA, position = dodge) + 
    facet_wrap(~ process, nrow = 2) 
p 

enter image description here

+0

Cảm ơn, tôi muốn có một cách thanh lịch trong ggplot2, nhưng cách giải quyết này được tất cả mọi thứ thực hiện. Cảm ơn một lần nữa! – user1381239

40

Trong ggplot2 phiên bản 1.0.0 có vị trí mới có tên position_jitterdodge() đó là làm cho tình hình như vậy. Vị trí này nên được sử dụng bên trong geom_point() và phải có fill= được sử dụng bên trong aes() để hiển thị theo biến nào để tránh dữ liệu của bạn. Để kiểm soát chiều rộng của đối số dodging dodge.width= nên được sử dụng.

ggplot(ex5,aes(x=tailindex ,y=hillest,color=memorypar,fill=memorypar)) + 
     facet_wrap(~process,nrow=2) + 
     geom_point(position=position_jitterdodge(dodge.width=0.9)) + 
     geom_boxplot(fill="white",outlier.colour = NA, 
         position = position_dodge(width=0.9)) 

enter image description here

+0

Cảm ơn bạn đã đăng bài này. Điều này rất hữu ích. Tôi hiện đang viết mã của riêng tôi, đang hoạt động tốt. Nhưng, bằng cách nào đó tôi nhận được màu đen cho các ngoại lệ. Bạn có thể đoán những gì có thể là nguyên nhân tiềm năng? – jazzurro

+1

Màu đen là màu mặc định cho các ngoại lệ. Trong mã này cho 'geom_boxplot()' 'outlier.colour =' được đặt thành 'NA' để không hiển thị chúng. –

+1

Xin chào, tôi vừa tìm ra giải pháp. 'outlier.colour' phải được viết màu, không phải màu. Có vẻ như chính tả của Mỹ không được ưa chuộng ở đây. Cảm ơn vì đã trả lời. :-) – jazzurro

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