2013-09-26 48 views
8

Tôi đã trở nên khá thích boxplots trong đó jittered điểm được overlain qua boxplots để đại diện cho dữ liệu thực tế, như sau:Có thể kết hợp position_jitter với position_dodge không?

set.seed(7) 
l1 <- gl(3, 1, length=102, labels=letters[1:3]) 
l2 <- gl(2, 51, length=102, labels=LETTERS[1:2]) # Will use this later 
y <- runif(102) 
d <- data.frame(l1, l2, y) 

ggplot(d, aes(x=l1, y=y)) + 
    geom_point(position=position_jitter(width=0.2), alpha=0.5) + 
    geom_boxplot(fill=NA) 

enter image description here

(Đây là đặc biệt hữu ích khi có rất khác nhau số lượng các điểm dữ liệu trong mỗi ô.)

Tôi muốn sử dụng kỹ thuật này khi tôi cũng (ngầm) sử dụng position_dodge để chia ô vuông bằng biến thứ hai, ví dụ:

ggplot(d, aes(x=l1, y=y, colour=l2)) + 
    geom_point(position=position_jitter(width=0.2), alpha=0.5) + 
    geom_boxplot(fill=NA) 

enter image description here

Tuy nhiên, tôi không thể tìm ra cách để né tránh các điểm bằng các colour biến (ở đây, l2) và cũng jitter họ.

+1

Bạn đã nhận được một số câu trả lời hay, vì vậy nhận xét này nhỏ hơn lý lịch. Khi tôi vật lộn với một vấn đề tương tự như bản thân mình một thời gian trước, tôi tình cờ gặp [bài thuyết trình này] (http://dl.dropbox.com/u/42707925/ggplot2/ggplot2slides.pdf). Kiểm tra ví dụ trên p. 19-20. Sự kết hợp của 'geom_jitter' và' dodge' dường như đã làm việc trong phiên bản trước của 'ggplot'. Không còn nữa ... – Henrik

+1

Tôi cũng thực sự thích hiển thị các điểm thực tế cùng với ô của tôi, nhưng tôi có xu hướng sử dụng các ô chấm. Chúng tránh được vấn đề hốt hoảng và có thể mang lại cảm giác tốt về hình dạng của dữ liệu trong mỗi nhóm. Tuy nhiên, bạn vẫn phải tìm ra 'dodge' trong' geom_dotplot' thích hợp trong một trường hợp như thế này. – aosmith

Trả lời

6

Dưới đây là một cách tiếp cận thực hiện thủ công các hoạt động jitter và dodging.

# a plot with no dodging or jittering of the points 
dp <- ggplot(d, aes(x=l1, y=y, colour=l2)) + 
    geom_point(alpha=0.5) + 
    geom_boxplot(fill=NA) 

# build the plot for rendering 
foo <- ggplot_build(dp) 
# now replace the 'x' values in the data for layer 1 (unjittered and un-dodged points) 
# with the appropriately dodged and jittered points 
foo$data[[1]][['x']] <- jitter(foo$data[[2]][['x']][foo$data[[1]][['group']]],amount = 0.2) 
# now draw the plot (need to explicitly load grid package) 
library(grid) 
grid.draw(ggplot_gtable(foo)) 
# note the following works without explicitly loading grid 
plot(ggplot_gtable(foo)) 

enter image description here

+1

Tôi thực sự thích dữ liệu 'foo $ data [[2]] [['x']] [foo $ data [[1]] [['nhóm']]]'. Tôi đã gần bắt đầu một hoạt động 'hợp nhất' theo nhóm lớn. +1! – Henrik

4

Tôi không nghĩ bạn sẽ thích nó, nhưng tôi chưa bao giờ tìm được cách nào khác ngoài việc tạo ra giá trị x của riêng bạn cho các điểm. Trong trường hợp này:

d$l1.num <- as.numeric(d$l1) 
d$l2.num <- (as.numeric(d$l2)/3)-(1/3 + 1/6) 
d$x <- d$l1.num + d$l2.num 

ggplot(d, aes(l1, y, colour = l2)) + geom_boxplot(fill = NA) + 
    geom_point(aes(x = x), position = position_jitter(width = 0.15), alpha = 0.5) + theme_bw() 

enter image description here

Đó chắc chắn là một chặng đường dài từ lý tưởng, nhưng sẽ trở thành thói quen khá nhanh chóng. Nếu bất cứ ai có một giải pháp thay thế, tôi sẽ rất hạnh phúc!

0

Một lựa chọn khác là sử dụng khía cạnh:

set.seed(7) 
    l1 <- gl(3, 1, length=102, labels=letters[1:3]) 
    l2 <- gl(2, 51, length=102, labels=LETTERS[1:2]) # Will use this later 
    y <- runif(102) 
    d <- data.frame(l1, l2, y) 

    ggplot(d, aes(x=l1, y=y, colour=l2)) + 
    geom_point(position=position_jitter(width=0.2), alpha=0.5) + 
    geom_boxplot(fill=NA) + 
    facet_grid(.~l2) + 
    theme_bw() 

Xin lỗi, đừng có đủ điểm để gửi đồ thị kết quả.

3

Position_jitterdodge() mới hoạt động cho việc này. Tuy nhiên, nó yêu cầu điền thẩm mỹ để cho biết cách nhóm điểm, vì vậy bạn phải chỉ định điền thủ công để nhận các hộp không bị đổi màu:

ggplot(d, aes(x=l1, y=y, colour=l2, fill=l2)) + 
    geom_point(position=position_jitterdodge(width=0.2), alpha=0.5) + 
    geom_boxplot() + scale_fill_manual(values=rep('white', length(unique(l2))))