"핸들 바"플롯에 대한 대체 그래픽


15

연구 분야에서 데이터를 표시하는 일반적인 방법은 막 대형 차트와 "핸들 막대"를 조합하여 사용하는 것입니다. 예를 들어

여기에 이미지 설명을 입력하십시오

"핸들 바"는 작성자에 따라 표준 오류와 표준 편차를 번갈아 표시합니다. 일반적으로 각 "bar"의 샘플 크기는 약 6입니다.

이 음모는 생물 과학에서 특히 인기가있는 것으로 보입니다 . 예를 들어 BMC Biology 의 처음 몇 권을 참조하십시오 .

그렇다면이 데이터를 어떻게 제시 하시겠습니까?

내가이 음모를 싫어하는 이유

개인적으로 나는이 음모를 좋아하지 않습니다.

  1. 표본 크기가 작은 경우 개별 데이터 점만 표시하지 않는 것이 좋습니다.
  2. 표시되는 SD 또는 SE입니까? 어느 쪽을 사용해야하는지 아무도 동의하지 않습니다.
  3. 왜 바를 사용 하는가? 데이터는 (보통) 0에서 나오지 않지만 그래프에서 첫 번째 패스는 데이터를 나타냅니다.
  4. 그래프는 데이터의 범위 또는 샘플 크기에 대한 아이디어를 제공하지 않습니다.

R 스크립트

이것은 플롯을 생성하는 데 사용한 R 코드입니다. 그렇게하면 원하는 경우 동일한 데이터를 사용할 수 있습니다.

                                        #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
sd 질문에 대한 귀하의 분야가 합의에 이르도록 돕는 것은 큰 발전 일 것입니다. 그것들은 완전히 다른 것을 의미합니다.
John

동의합니다-se는 일반적으로 더 작은 지역을 제공하기 때문에 선택됩니다!
csgillespie

좀 더 유익한 제목일까요?

3
참고로, 이전에는 "Dynamite Plots"라는 오류 막대가있는 막대 차트를 보았습니다. 다음은 다른 모든 사람들과 거의 동일한 권장 사항을 제공하는 몇 가지 참고 자료입니다 (도트 차트). 다이너마이트 포스터Drummond & Vowler를 조심하십시오 , 코야마 타츠키 , 2011 .
Andy W

1
가능하면 이미지를 다시 추가하십시오. 이번에는 이미지 업 로더를 사용하여 연결이 끊어지지 않도록하십시오.
endolith

답변:


16

답변 해 주셔서 감사합니다. 완벽을 기하기 위해 평소에하는 일을 포함시켜야한다고 생각했습니다. 나는 주어진 제안, 점, 상자 그림 (n이 큰 경우) 및 se (또는 sd) 범위의 조합을 수행하는 경향이 있습니다.

( 이미지를 호스팅하는 사이트가 더 이상 올바르게 작동하지 않기 때문에 중재자가 제거했습니다. )

도트 플롯에서 데이터가 "핸들 막대"플롯이 제안한 것보다 훨씬 더 널리 퍼져 있음이 분명합니다. 실제로 A3에는 음수 값이 있습니다!


이 답변을 CW로 만들었으므로 담당자를 얻지 못합니다.


3
좋은 대답입니다. 또한 포인트를 수평으로 지 터링하는 것이 좋습니다. 따라서 특히 그룹당 포인트가 이보다 많은 경우 포인트가 겹치지 않습니다. ggplot2에서 geom_jitter ()가 그렇게합니다.
Harlan

@Harlan : 동의합니다. 더 많은 포인트가 있다면 아마도 상자 그림을 사용할 것입니다.
csgillespie

1
나는 작은 데이터 세트에 대한 산점도를 좋아합니다 (nb, 'dotplot'이라는 용어를 사용하여 약간 다른 그림을 나타냅니다). 그러나 가치가있는 것은 위의 막대 그림이 이것보다 깨끗하고 읽기 쉽습니다. 나는 그것이 더 나아질 지 확신하지 못하지만 지적 할 가치가 있습니다.
gung-모니 티 복원

@Harlan : 또는 여러 점을 쌓아서 더 어두운 점을 만들도록 점을 투명하게 만드시겠습니까?
endolith December

이 죽은 링크를 대체 할 원본 이미지가 있습니까?
endolith

10

FrankRrell (가장 훌륭한) 기조 연설에서 "정보 알레르기"라는 제목의 R! 지난 달에는 이러한 대안이 제시되었습니다. 막대가 제공하는 집계를 통해 원시 데이터를 숨기지 않고 원시 데이터도 점 (또는 점)으로 표시됩니다. "데이터를 숨기는 이유는 무엇입니까?" 프랭크의 의견이었습니다.

알파 블렌딩을 감안할 때, 그것은 가장 현명한 제안입니다 (그리고 모든 대화는 가장 좋고 중요하며 너겟으로 가득합니다).


1
비디오로 사용할 수 있습니까? 잘 들린다.
Henrik

1
나는 그 단어가 "결국있을 것이다"라고 생각합니다. 기조 연설이 녹음되었습니다.
Dirk Eddelbuettel

1
이것은 내가 생각하는 ggplot에서 쉽다. 즉 had.co.nz/ggplot2/geom_jitter.html
Mike Dewar

1
jitter또한 일반 R에 있습니다.

2
프로토콜의 경우, Frank의 대화 (비디오)는 현재 온라인 상태입니다. r-bloggers.com/RUG/2010/08/user-2010-conference-videos
Tal Galili

7

심리적 관점에서, 나는 데이터와 데이터에 대한 불확실성을 도표화하는 것을지지합니다. 따라서, 당신이 보여주는 플롯에서, 막대를 0으로 확장하는 데 결코 신경 쓰지 않을 것입니다. 이는 데이터 범위의 차이를 구별하는 눈의 능력을 최소화하는 역할을합니다.

또한 저는 솔직히 반 막대 그래프입니다. 막대 그래프는 두 가지 변수를 동일한 미적 속성 (x 축 위치)에 매핑하므로 혼동 될 수 있습니다. 더 나은 방법은 하나의 변수를 x 축에 매핑하고 다른 변수를 다른 미학적 속성 (예 : 점 모양 또는 색상 또는 둘 다)에 매핑하여 중복 미학 매핑을 피하는 것입니다.

마지막으로 위의 그림에서 값 위에 오차 막대 만 포함하면 값 위와 아래의 막대에 대한 불확실성 간격을 비교할 수 없습니다.

다음은 ggplot2 패키지를 통해 데이터를 플로팅하는 방법입니다. 동일한 시리즈에서 점을 연결하는 선을 추가합니다. 일부는 라인이 연결된 시리즈가 숫자 인 경우에만 적합하다고 주장하지만 (이 경우와 같이) x 축 변수의 수준 사이에 합리적인 서수 관계가있는 한 연결선은 눈이 x 축에서 점을 연결하는 데 도움이됩니다. 이것은 특히 선과 눈에 띄는 상호 작용을 감지하는 데 특히 유용 할 수 있습니다.

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
)

여기에 이미지 설명을 입력하십시오


1
필자는 "데이터와 불확실성 만 플롯"권장 사항을 검증해야한다고 덧붙여 야합니다. 플롯 할 변수에 대한 경험 / 전문가에게 데이터를 제시 할 때는 데이터와 불확실성 만 플롯하십시오. 나이가 많은 청중에게 데이터를 제시 할 때 0이 의미있는 데이터 포인트 인 경우 먼저 청중이 스케일에 맞춰 지도록 데이터를 0으로 확장 한 다음 확대하여 데이터와 불확실성을 보여줍니다.
Mike Lawrence

R 코드를 작성하는 데 어려움을 겪었으므로 최종 플롯의 jpeg 이미지를 포함시킬 수 있습니까? 이미지를 img84.imageshack.us에 업로드 하고 링크하는 것이 매우 쉽습니다. 답변에 감사드립니다 :)
csgillespie

@csgillespie : 끝났습니다.
Mike Lawrence

geom_ribbon()오류 를 표시하면서 이와 같은 그림을 읽는 것이 더 쉽다는 것을 알았습니다 . 1에서 2 사이의 영역에 대한 추정치를 생성하지 않으려면 최소한 오차 막대의 너비를 줄이십시오.
JoFrhwld

@JoFrwld : x- 축 변수가 실제로 숫자 인 경우를 위해 리본을 예약하는 경향이 있지만 리본도 좋아합니다. 위의 답변에서 위반한다고 공언하는 "x 축 변수가 숫자가 아닌 한 선을 그리지 마십시오"규칙의 내 버전 : Op
Mike Lawrence

2

왜 당신이이 음모를 좋아하지 않는지 궁금합니다. 나는 항상 그들을 사용합니다. 명백한 개화를 밝히지 않고 다른 그룹의 평균을 비교하고 95 % CI가 겹치는 지 (즉, 실제 평균이 다를 수 있음) 확인할 수 있습니다.

다른 목적을 위해 단순성과 정보의 균형을 얻는 것이 중요합니다. 그러나이 줄거리를 사용할 때 "이 두 그룹은 중요한 방식으로 서로 다릅니다"라고 말합니다.

나에게는 꽤 좋은 것 같지만 반례를 듣는 데 관심이 있습니다. 나는 플롯의 사용에 암시 적으로 데이터에 평균이 유효하지 않거나 오해의 소지가있는 희귀 분포를 가지고 있지 않다고 가정합니다.


왜이 음모를 싫어하는 지에 대한 작은 섹션을 추가했습니다.
csgillespie

1
중복의 CI는 해석에 대해이 체크 아웃 @ 크리스 pubs.amstat.org/doi/abs/10.1198/000313001317097960 또한 원래의 질문들이 다른 두 가지 동안 상호 교환 SE 또는 SD를 사용하는 혼란 주위도
tosonb1

또는이 사이트에서 분석하려면 stats.stackexchange.com/questions/18215를 참조하십시오 . @ tosonb1 링크 시간이 초과되었습니다. 종이에 대한 참조를 제공 할 수 있습니까?
whuber

2

데이터가 비율 인 경우 즉 , 성공 횟수를 시행 횟수로 나눈 경우, 매우 우아한 방법은 퍼널 도표입니다. 예를 들어, http://qshc.bmj.com/content/11/4/390.2.full을 참조하십시오 (링크에 가입이 필요한 경우에는 사과 하십시오. 저에게 알려 주시면 다른 것을 찾을 수 있습니다).

다른 유형의 데이터에 적용 할 수는 있지만 예를 보지 못했습니다.

최신 정보:

다음은 구독이 필요하지 않은 (예 : 구독 방법에 대한 설명이있는) 예제 링크입니다. http://understandinguncertainty.org/fertility

표준 오류에 대한 평균을 간단히 표시하여 속도가 아닌 데이터에 사용할 수 있지만 일부 단순성을 잃을 수 있습니다.

Wikipedia 기사는 메타 분석에서의 사용법에 대해서만 설명하기 때문에 좋지 않습니다. 나는 그들이 다른 많은 상황에서 유용 할 수 있다고 주장했다.


데이터 요금이 필요하지 않습니다. 무엇이든 될 수 있습니다.
csgillespie

불행히도 구독 링크.
매트 파커

...하지만 깔때기 그림에 대한 Wikipedia 링크는 다음과 같습니다. en.wikipedia.org/wiki/Funnel_plot
Matt Parker

2

여기에서 상자 그림을 사용할 것입니다. 깨끗하고 의미 있고 비모수 적이 거나 분포가 더 흥미로운 경우 vioplot .


2
박스 플롯이나 비오 플롯이 작은 샘플 크기 (n = 6)에 적합한 지 확신하지 못합니다
csgillespie

그렇다. 나는 그 질문을 충분히주의 깊게 읽지 않았다는 것을 인정한다. 그래서 그것은 일반적인 생각이었다. 그럼에도 불구하고 6 점은 최소한이지만 상자 그림에는 충분하다고 생각합니다. 나는 몇 가지 실험을했고 의미가있었습니다. 반면에 boxplot은 관측치의 수를 나타내지 않으므로 (여기서는 중요한 정보 임), 그 점과 점을 조합하여 사용하는 것이 좋습니다.

6 점으로-산점도가 가장 좋을 것입니다 (평균에 빨간색 점을 추가했을 수도 있음)
Tal Galili

2
나는 일반적으로 중첩 된 점이있는 상자 그림을 사용합니다. 매우 "시각적"입니다. 대신 바이올린 음모는 제 생각에 이해하기가 약간 어렵습니다.
nico

1
@csgillespie : 바와 수염 그림이 더 낫다는 것은 무엇입니까? 그들은 기본적으로 상자 그림과 동일한 정보를 표시하고 있습니다 (소위 수염은 다양한 것을 나타낼 수 있음). 단지 한 방향으로 만 오류를 제공합니다. . 그러나 빈 플로트 / 바이올로 플로트는 비교적 작은 샘플 크기에서도 여전히 작동해야 합니다 . 여기서 설명했듯이 가우스 밀도 추정에 불과하기 때문 입니다.
naught101

1

위의 @csgillespie의 훌륭한 코드 단순화 :

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

나는 geom_pointrange를 errorbar보다 선호하고 선이 도움이되지 않고 산만하다고 생각합니다. 다음은 @James 또는 @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)
 )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.