Đồ họa thay thế để xử lý các lô cốt truyện


15

Trong lĩnh vực nghiên cứu của tôi, một cách hiển thị dữ liệu phổ biến là sử dụng kết hợp biểu đồ thanh với "thanh tay cầm". Ví dụ,

nhập mô tả hình ảnh ở đây

"Thanh tay cầm" xen kẽ giữa các lỗi tiêu chuẩn và độ lệch chuẩn tùy thuộc vào tác giả. Thông thường, kích thước mẫu cho mỗi "thanh" khá nhỏ - khoảng sáu.

Những mảnh đất này dường như đặc biệt phổ biến trong khoa học sinh học - xem một vài bài báo đầu tiên của BMC Biology, tập 3 để biết ví dụ.

Vì vậy, làm thế nào bạn sẽ trình bày dữ liệu này?

Tại sao tôi không thích những mảnh đất này

Cá nhân tôi không thích những mảnh đất này.

  1. Khi kích thước mẫu nhỏ, tại sao không chỉ hiển thị các điểm dữ liệu riêng lẻ.
  2. Đó là sd hoặc se đang được hiển thị? Không ai đồng ý sử dụng.
  3. Tại sao lại sử dụng thanh nào cả. Dữ liệu không (thường) đi từ 0 nhưng lần đầu tiên tại biểu đồ cho thấy điều đó.
  4. Các biểu đồ không đưa ra ý tưởng về phạm vi hoặc kích thước mẫu của dữ liệu.

Kịch bản R

Đây là mã R tôi đã sử dụng để tạo cốt truyện. Bằng cách đó bạn có thể (nếu bạn muốn) sử dụng cùng một dữ liệu.

                                        #Generate the data
set.seed(1)
names = c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
prevs = c(38, 37, 31, 31, 29, 26, 40, 32, 39)

n=6; se = numeric(length(prevs))
for(i in 1:length(prevs))
  se[i] = sd(rnorm(n, prevs, 15))/n

                                        #Basic plot
par(fin=c(6,6), pin=c(6,6), mai=c(0.8,1.0,0.0,0.125), cex.axis=0.8)
barplot(prevs,space=c(0,0,0,3,0,0, 3,0,0), names.arg=NULL, horiz=FALSE,
        axes=FALSE, ylab="Percent", col=c(2,3,4), width=5, ylim=range(0,50))

                                        #Add in the CIs
xx = c(2.5, 7.5, 12.5, 32.5, 37.5, 42.5,  62.5, 67.5, 72.5)
for (i in 1:length(prevs)) {
  lines(rep(xx[i], 2), c(prevs[i], prevs[i]+se[i]))
  lines(c(xx[i]+1/2, xx[i]-1/2), rep(prevs[i]+se[i], 2))
}

                                        #Add the axis
axis(2, tick=TRUE, xaxp=c(0, 50, 5))
axis(1, at=xx+0.1, labels=names, font=1,
     tck=0, tcl=0, las=1, padj=0, col=0, cex=0.1)

6
Giúp lĩnh vực của bạn đi đến thống nhất về câu hỏi se v. Sd sẽ là một tiến bộ lớn. Chúng có nghĩa là những thứ hoàn toàn khác nhau.
Giăng

Tôi đồng ý - se thường được chọn vì nó cho một khu vực nhỏ hơn!
csgillespie

Có thể một số tiêu đề thông tin hơn?

3
Chỉ để tham khảo, tôi đã thấy các biểu đồ thanh này với các thanh lỗi gọi là "Lô động lực" trước đây. Dưới đây là một vài tài liệu tham khảo đưa ra các khuyến nghị chính xác giống như mọi người khác có khá nhiều (biểu đồ dấu chấm). Tatsuki Koyama, Coi chừng Poster Động lực Động lực Drumond & Vowler, 2011 .
Andy W

1
Vui lòng thêm hình ảnh một lần nữa nếu bạn có thể. Sử dụng trình tải lên hình ảnh lần này để nó không trở thành một liên kết chết.
endolith

Câu trả lời:


16

Cảm ơn tất cả các bạn câu trả lời. Để hoàn thiện tôi nghĩ tôi nên bao gồm những gì tôi thường làm. Tôi có xu hướng thực hiện kết hợp các đề xuất được đưa ra: dấu chấm, ô vuông (khi n lớn) và phạm vi se (hoặc sd).

( Đã bị người kiểm duyệt xóa vì trang web lưu trữ hình ảnh không còn hoạt động chính xác nữa. )

Từ biểu đồ dấu chấm, rõ ràng dữ liệu được trải rộng hơn nhiều so với các ô "thanh xử lý" đề xuất. Trong thực tế, có một giá trị âm trong A3!


Tôi đã đưa ra câu trả lời này là CW để tôi không nhận được đại diện


3
Đó là một câu trả lời tốt. Ngoài ra, tôi khuyên bạn nên xáo trộn các điểm theo chiều ngang, vì vậy chúng không trùng nhau, đặc biệt nếu bạn có nhiều điểm trên mỗi nhóm hơn điểm này. Trong ggplot2, geom_jitter () sẽ làm điều đó.
Harlan

@Harlan: Tôi đồng ý. Mặc dù nếu tôi có nhiều điểm hơn, có lẽ tôi sẽ sử dụng boxplot.
csgillespie

1
Tôi cũng thích các biểu đồ phân tán cho các tập dữ liệu nhỏ (nb, tôi sử dụng thuật ngữ 'dotplot' để chỉ một âm mưu hơi khác). Tuy nhiên, đối với những gì nó có giá trị, barplot ở trên sạch hơn và dễ đọc hơn cái này. Tôi không chắc điều đó làm cho nó tốt hơn, nhưng nó đáng để chỉ ra.
gung - Phục hồi Monica

@Harlan: Cách khác, làm cho các chấm trong suốt để nhiều chấm xếp chồng lên nhau và tạo ra một chấm tối hơn?
endolith

Bạn có hình ảnh gốc để thay thế liên kết chết này không?
endolith

10

Bài phát biểu (xuất sắc nhất) của Frank Harrell có tên "Dị ứng thông tin" khi sử dụngR! tháng trước đã cho thấy các lựa chọn thay thế: thay vì ẩn dữ liệu thô thông qua tổng hợp các thanh cung cấp, dữ liệu thô cũng được hiển thị dưới dạng dấu chấm (hoặc điểm). "Tại sao phải ẩn dữ liệu?" là bình luận của Frank.

Với sự pha trộn alpa, đó là một gợi ý hợp lý nhất (và toàn bộ cuộc nói chuyện đầy đủ nhất, tốt và quan trọng, cố gắng).


1
Nó có sẵn như là một video? Nghe có vẻ tuyệt vời.
Henrik

1
Tôi nghĩ từ này là "cuối cùng sẽ" - các ghi chú đã được ghi lại.
Dirk Eddelbuettel

1
Điều này thật dễ dàng trong ggplot tôi nghĩ, tức là had.co.nz/ggplot2/geom_jitter.html
Mike Dewar

1
jittercũng ở đồng bằng R.

2
Chỉ dành cho giao thức, cuộc nói chuyện của Frank (trong video) hiện đang trực tuyến: r-bloggers.com/RUG/2010/08/user-2010-conference-ideo
Tal Galili

7

Từ góc độ tâm lý học, tôi ủng hộ việc vẽ đồ thị dữ liệu cộng với sự không chắc chắn của bạn về dữ liệu. Do đó, trong một âm mưu như bạn thể hiện, tôi sẽ không bao giờ bận tâm đến việc mở rộng các thanh thành 0, chỉ nhằm giảm thiểu khả năng của mắt để phân biệt sự khác biệt trong phạm vi dữ liệu.

Ngoài ra, tôi thẳng thắn chống lại; biểu đồ thanh ánh xạ hai biến đến cùng một thuộc tính thẩm mỹ (vị trí trục x), có thể gây nhầm lẫn. Một cách tiếp cận tốt hơn là tránh ánh xạ thẩm mỹ dư thừa bằng cách ánh xạ một biến vào trục x và một biến khác sang thuộc tính thẩm mỹ khác (ví dụ: hình dạng điểm hoặc màu hoặc cả hai).

Cuối cùng, trong âm mưu của bạn ở trên, bạn chỉ bao gồm các thanh lỗi phía trên giá trị, điều này cản trở khả năng của một người so sánh các khoảng không chắc chắn liên quan đến các thanh ở trên và dưới giá trị.

Đây là cách tôi sẽ vẽ dữ liệu (thông qua gói ggplot2). Lưu ý rằng tôi thêm các đường kết nối các điểm trong cùng một chuỗi; Một số ý kiến ​​cho rằng điều này chỉ phù hợp khi chuỗi mà các đường được kết nối là số (dường như trong trường hợp này), tuy nhiên miễn là có bất kỳ mối quan hệ thứ tự hợp lý nào giữa các cấp của biến trục x, tôi nghĩ các đường kết nối rất hữu ích để giúp mắt liên kết các điểm trên trục x. Điều này có thể trở nên đặc biệt hữu ích để phát hiện các tương tác, thực sự nổi bật với các dòng.

library(ggplot2)
a = data.frame(names,prevs,se)
a$let = substr(a$names,1,1)
a$num = substr(a$names,2,2)
ggplot(data = a)+
layer(
    geom = 'point'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , shape = let
    )
)+
layer(
    geom = 'line'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , linetype = let
        , group = let
    )    
)+
layer(
    geom = 'errorbar'
    , mapping = aes(
        x = num
        , ymin = prevs-se
        , ymax = prevs+se
        , colour = let
    )
    , alpha = .5
    , width = .5
)

enter image description here


1
Tôi nên thêm rằng khuyến nghị "chỉ vẽ dữ liệu và độ không chắc chắn" của tôi phải đủ điều kiện: khi trình bày dữ liệu cho đối tượng có kinh nghiệm / chuyên môn với biến được vẽ, chỉ vẽ dữ liệu và độ không chắc chắn. Khi trình bày dữ liệu cho đối tượng chưa từng thấy và khi số 0 là điểm dữ liệu có ý nghĩa, trước tiên tôi sẽ hiển thị dữ liệu mở rộng về 0 để khán giả có thể được định hướng theo tỷ lệ, sau đó phóng to để chỉ hiển thị dữ liệu và độ không chắc chắn.
Mike Lawrence

vì bạn đã gặp rắc rối khi viết mã R, bạn có thể đưa vào hình ảnh jpeg của cốt truyện cuối cùng không. Tôi thấy chỉ cần tải hình ảnh lên img84.imageshack.us và liên kết với nó khá dễ dàng. Ồ cảm ơn vì câu trả lời :)
csgillespie

@csgillespie: đã xong.
Mike Lawrence

Tôi thấy rằng việc đọc một cốt truyện như thế này dễ dàng hơn khi geom_ribbon()chỉ ra lỗi. Nếu bạn không muốn tạo ước tính rõ ràng cho các khu vực từ 1 đến 2, ít nhất hãy giảm độ rộng của thanh lỗi.
JoFrhwld

@JoFrwld: Tôi cũng thích ruy băng, mặc dù tôi có xu hướng dự trữ chúng cho các trường hợp biến trục x nó thực sự là số; phiên bản của tôi về quy tắc "không vẽ đường trừ khi biến trục x là số" mà tôi tuyên bố vi phạm trong câu trả lời của mình ở trên: Op
Mike Lawrence

2

Tôi tò mò về lý do tại sao bạn không thích những mảnh đất này. Tôi sử dụng tất cả các thời gian. Không muốn nêu rõ sự nở rộ, họ cho phép bạn so sánh các phương tiện của các nhóm khác nhau và xem liệu 95% TCTD của họ có trùng nhau không (nghĩa là có nghĩa là có khả năng khác nhau).

Điều quan trọng là có được sự cân bằng của sự đơn giản và thông tin cho các mục đích khác nhau, tôi đoán vậy. Nhưng khi tôi sử dụng những mảnh đất này, tôi đang nói- "hai nhóm này khác nhau theo một cách quan trọng nào đó" [hoặc không].

Có vẻ khá tuyệt vời đối với tôi, nhưng tôi rất thích nghe những ví dụ phản tác dụng. Tôi cho rằng ngầm định trong việc sử dụng cốt truyện là dữ liệu không có phân phối bizzare làm cho giá trị trung bình không hợp lệ hoặc sai lệch.


Tôi đã thêm một phần nhỏ về lý do tại sao tôi không thích những mảnh đất này.
csgillespie

1
@ Chris kiểm tra này về giải thích TCTD chồng chéo pubs.amstat.org/doi/abs/10.1198/000313001317097960 Cũng câu hỏi ban đầu cũng là xung quanh sự nhầm lẫn của việc sử dụng SE hoặc SD thay thế cho nhau trong khi họ là hai thứ khác nhau
tosonb1

Hoặc, để phân tích trên trang web này, hãy xem stats.stackexchange.com/questions/18215 . @ tosonb1 Liên kết của bạn đã hết thời gian. Bạn có thể cung cấp một tài liệu tham khảo cho bài báo?
whuber

2

Nếu dữ liệu là tỷ lệ : đó là số lần thành công chia cho số lần thử, thì một phương pháp rất thanh lịch là biểu đồ hình phễu. Ví dụ: xem http://qshc.bmj.com/content/11/4/390.2.full (xin lỗi nếu liên kết yêu cầu đăng ký - hãy cho tôi biết và tôi sẽ tìm cái khác).

Có thể điều chỉnh nó với các loại dữ liệu khác, nhưng tôi chưa thấy ví dụ nào.

CẬP NHẬT:

Đây là một liên kết đến một ví dụ không yêu cầu đăng ký (và có một lời giải thích tốt về cách chúng có thể được sử dụng): http : //under Hiểuuncerturdy.org/fertility

Chúng có thể được sử dụng cho dữ liệu phi tỷ lệ, bằng cách đơn giản là âm mưu trung bình chống lại lỗi tiêu chuẩn, tuy nhiên chúng có thể mất một số tính đơn giản.

Bài viết trên wikipedia không tuyệt vời, vì nó chỉ thảo luận về việc sử dụng chúng trong các phân tích tổng hợp. Tôi cho rằng chúng có thể hữu ích trong nhiều bối cảnh khác.


Dữ liệu không cần thiết. Nó có thể là bất cứ điều gì.
csgillespie

Liên kết đăng ký, không may.
Matt Parker

... nhưng đây là liên kết Wikipedia trên các sơ đồ kênh: en.wikipedia.org/wiki/Funnel_plot
Matt Parker

2

Tôi sẽ sử dụng boxplots ở đây; sạch sẽ, có ý nghĩa, không đối xứng ... Hoặc vioplot nếu phân phối thú vị hơn.


2
Tôi không chắc chắn các ô vuông hoặc vioplots sẽ phù hợp với cỡ mẫu nhỏ như vậy (n = 6)
csgillespie

Phải, tôi thừa nhận tôi đã không đọc câu hỏi đủ cẩn thận, vì vậy đó là một ý tưởng chung; tuy nhiên tôi nghĩ rằng 6 điểm là tối thiểu nhưng đủ cho một boxplot. Tôi đã thực hiện một số thí nghiệm và chúng có ý nghĩa. Mặt khác, rõ ràng boxplot không chỉ ra số lượng quan sát (là một thông tin quan trọng ở đây), vì vậy tôi muốn sử dụng kết hợp giữa nó và các điểm.

Với 6 điểm - cốt truyện phân tán có lẽ là tốt nhất (có thể thêm một dấu chấm màu đỏ cho trung bình)
Tal Galili

2
Tôi thường sử dụng boxplots với các điểm được đặt chồng lên nhau, tôi thấy nó rất "trực quan". Âm mưu của violin, thay vào đó, là một chút khó hiểu theo ý kiến ​​của tôi.
nico

1
@csgillespie: Điều gì sẽ chỉ ra rằng các lô bar và râu ria tốt hơn? Về cơ bản, chúng đang hiển thị thông tin giống như một boxplot (như bạn chỉ ra, râu ria có thể đại diện cho nhiều thứ khác nhau), chúng chỉ đưa ra lỗi chỉ theo một hướng, có thể khá khó hiểu, nếu không nói rõ ... Không tranh cãi về các ô vuông . Nhưng beanplots / violinplots vẫn hoạt động, ngay cả đối với kích thước mẫu tương đối thấp, bởi vì đó chỉ là ước tính mật độ gaussian, như tôi đã giải thích ở đây .
ness101

1

Đơn giản hóa mã tuyệt vời của @ csgillespie từ phía trên:

qplot(
    data=a,
    x=num,
    y=prevs,
    colour=let,
    shape=let,
    group=let,
    ymin=prevs-se,
    ymax=prevs+se,
    position=position_dodge(width=0.25),
    geom=c("point", "line", "errorbar")
    )

0

Tôi thích geom_pointrange hơn cho thanh lỗi và nghĩ rằng các dòng gây mất tập trung hơn là hữu ích. Đây là phiên bản mà tôi thấy sạch hơn nhiều so với phiên bản @James hoặc @csgillespie:

qplot(
 data=a,
 x=num,
 y=prevs,
 colour=let,
 ymin=prevs-se,
 ymax=prevs+se,
 position=position_dodge(width=0.25),
 geom=c("pointrange"), size=I(2)
 )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.