Alternative Grafiken zu Handle Bar-Plots


15

In meinem Forschungsgebiet besteht eine beliebte Art der Anzeige von Daten darin, ein Balkendiagramm mit "Lenkern" zu kombinieren. Beispielsweise,

Bildbeschreibung hier eingeben

Die "Lenker" wechseln je nach Autor zwischen Standardfehlern und Standardabweichungen. Typischerweise sind die Stichprobengrößen für jeden "Balken" ziemlich klein - ungefähr sechs.

Diese Handlungen scheinen in den Biowissenschaften besonders beliebt zu sein - Beispiele finden Sie in den ersten Veröffentlichungen von BMC Biology, Bd. 3 .

Wie würden Sie diese Daten präsentieren?

Warum ich diese Grundstücke nicht mag

Persönlich mag ich diese Handlungen nicht.

  1. Wenn die Stichprobengröße klein ist, können Sie die einzelnen Datenpunkte anzeigen.
  2. Ist es die SD oder die SE, die angezeigt wird? Niemand ist damit einverstanden, welche zu verwenden.
  3. Warum überhaupt Bars benutzen? Die Daten gehen (normalerweise) nicht von 0 aus, aber ein erster Durchgang in der Grafik legt nahe, dass dies der Fall ist.
  4. Die Grafiken geben keine Auskunft über den Bereich oder die Stichprobengröße der Daten.

R-Skript

Dies ist der R-Code, mit dem ich den Plot erstellt habe. Auf diese Weise können Sie (wenn Sie möchten) dieselben Daten verwenden.

                                        #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
Es wäre ein enormer Fortschritt, wenn Sie Ihrem Fachgebiet dabei helfen könnten, einen Konsens über die Frage zu erzielen. Sie bedeuten ganz andere Dinge.
John

Ich bin damit einverstanden - se wird normalerweise gewählt, weil es eine kleinere Region gibt!
csgillespie

Vielleicht ein informativerer Titel?

3
Nur als Referenz habe ich diese Balkendiagramme mit Fehlerbalken namens "Dynamite Plots" gesehen. Hier sind einige Referenzen, die genau die gleichen Empfehlungen geben wie alle anderen (Punktdiagramme). Tatsuki Koyama, Vorsicht vor Dynamite Poster und Drummond & Vowler, 2011 .
Andy W

1
Bitte fügen Sie das Bild erneut hinzu, wenn Sie können. Verwenden Sie diesmal den Bild-Uploader, damit er nicht zu einem toten Link wird.
Endolith

Antworten:


16

Vielen Dank für alle Antworten. Der Vollständigkeit halber dachte ich, ich sollte einschließen, was ich normalerweise tue. Ich tendiere dazu, eine Kombination der gegebenen Vorschläge zu machen: Punkte, Boxplots (wenn n groß ist) und se (oder sd) Bereiche.

( Vom Moderator entfernt, da die Website, auf der das Bild gehostet wird, anscheinend nicht mehr ordnungsgemäß funktioniert. )

Aus dem Punktdiagramm geht hervor, dass die Daten in den "Griffleisten" -Diagrammen weitaus weiter verteilt sind. In der Tat gibt es einen negativen Wert in A3!


Ich habe diese Antwort zu einer CW gemacht, damit ich keine Wiederholung bekomme


3
Das ist eine gute Antwort. Außerdem würde ich empfehlen, die Punkte horizontal zu verwackeln, damit sie sich nicht überlappen, insbesondere wenn Sie mehr Punkte pro Gruppe haben. In ggplot2 erledigt das geom_jitter ().
Harlan,

@ Harlan: Ich stimme zu. Obwohl, wenn ich viel mehr Punkte hätte, würde ich wahrscheinlich einen Boxplot verwenden.
csgillespie 20.10.10

1
Ich mag auch Streudiagramme für kleine Datensätze (nb, ich verwende den Begriff "Punktdiagramm", um mich auf ein etwas anderes Diagramm zu beziehen). Der obige Barplot ist jedoch sauberer und leichter zu lesen als dieser. Ich bin mir nicht sicher, ob das besser ist, aber es lohnt sich darauf hinzuweisen.
gung - Wiedereinsetzung von Monica

@ Harlan: Alternativ können Sie die Punkte transparent machen, sodass sich mehrere Punkte stapeln und einen dunkleren Punkt erzeugen.
Endolith

Haben Sie das Originalbild, um diesen toten Link zu ersetzen?
Endolith

10

Frank Harrells (hervorragendste) Keynote mit dem Titel "Information Allergy" bei useR! Der letzte Monat zeigte Alternativen zu diesen: Anstatt die Rohdaten über die Aggregation der Balken auszublenden, werden die Rohdaten auch als Punkte (oder Punkte) angezeigt. "Warum die Daten verstecken?" war Franks Kommentar.

Angesichts der Alpa-Mischung ist dies ein sehr vernünftiger Vorschlag (und das ganze Gespräch ist voller guter und wichtiger Nuggets).


1
Ist es als Video verfügbar? Es hört sich toll an.
Henrik

1
Ich denke das Wort ist "wird irgendwann" - Keynotes wurden aufgenommen.
Dirk Eddelbuettel

1
Das ist einfach in ggplot, denke ich, dh had.co.nz/ggplot2/geom_jitter.html
Mike Dewar

1
jitterist auch in der Ebene R.

2
Nur für das Protokoll ist Franks Vortrag (im Video) jetzt online: r-bloggers.com/RUG/2010/08/user-2010-conference-videos
Tal Galili

7

Aus psychologischer Sicht empfehle ich, die Daten zuzüglich Ihrer Unsicherheit über die Daten zu zeichnen. Daher würde ich in einem Diagramm wie dem von Ihnen nie die Mühe machen, die Balken bis auf Null zu verlängern, was nur dazu dient, die Fähigkeit des Auges zur Unterscheidung von Unterschieden im Datenbereich zu minimieren.

Darüber hinaus bin ich ehrlich gesagt Anti-Bargraph; Balkendiagramme ordnen zwei Variablen demselben ästhetischen Attribut zu (Position auf der x-Achse), was zu Verwirrung führen kann. Ein besserer Ansatz besteht darin, redundante ästhetische Abbildungen zu vermeiden, indem eine Variable auf die x-Achse und eine andere Variable auf ein anderes ästhetisches Attribut (z. B. Punktform oder -farbe oder beides) abgebildet werden.

Schließlich fügen Sie in Ihrem Diagramm oben nur Fehlerbalken oberhalb des Werts ein, was die Möglichkeit erschwert, die Unsicherheitsintervalle mit Balken oberhalb und unterhalb des Werts zu vergleichen.

Hier ist, wie ich die Daten plotten würde (über das Paket ggplot2). Beachten Sie, dass ich Linien hinzufüge, die Punkte in derselben Reihe verbinden. Einige argumentieren, dass dies nur angebracht ist, wenn die Reihen, über die die Linien verbunden sind, numerisch sind (wie es in diesem Fall zu sein scheint), aber solange es eine vernünftige ordinale Beziehung zwischen den Ebenen der Variablen der x-Achse gibt, denke ich Verbindungslinien sind nützlich, damit das Auge Punkte auf der x-Achse zuordnen kann. Dies kann besonders nützlich sein, um Interaktionen zu erkennen, die bei Linien wirklich auffallen.

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
)

Bildbeschreibung hier eingeben


1
Ich sollte hinzufügen, dass meine Empfehlung "Nur die Daten und die Unsicherheit zeichnen" qualifiziert sein sollte: Wenn Sie Daten einem Publikum präsentieren, das Erfahrung / Fachwissen mit der zu zeichnenden Variablen hat, zeichnen Sie nur die Daten und die Unsicherheit. Wenn Daten einem naiven Publikum präsentiert werden und wenn Null ein aussagekräftiger Datenpunkt ist, zeige ich zuerst die Daten, die bis Null reichen, damit sich das Publikum an der Skala orientieren kann, und zoome dann hinein, um nur die Daten und die Unsicherheit anzuzeigen.
Mike Lawrence

Da Sie Probleme beim Schreiben von R-Code haben, können Sie ein JPEG-Bild des endgültigen Plots hinzufügen. Ich finde es ziemlich einfach, das Bild einfach auf img84.imageshack.us hochzuladen und darauf zu verlinken. Oh, danke für die Antwort :)
csgillespie

@csgillespie: fertig.
Mike Lawrence

Ich habe festgestellt, dass es einfacher ist, einen Plot wie diesen mit der geom_ribbon()Angabe des Fehlers zu lesen . Wenn Sie keine offensichtlichen Schätzungen für Bereiche zwischen 1 und 2 erstellen möchten, reduzieren Sie zumindest die Breite des Fehlerbalkens.
JoFrhwld

@JoFrwld: Ich mag auch Bänder, obwohl ich sie eher für Fälle reserviere, in denen die Variable der x-Achse wirklich numerisch ist. Meine Version der Regel "Zeichne keine Linien, es sei denn, die Variable auf der x-Achse ist numerisch", gegen die ich in meiner obigen Antwort verstoßen habe: Op
Mike Lawrence

2

Ich bin gespannt, warum Ihnen diese Grundstücke nicht gefallen. Ich benutze sie die ganze Zeit. Ohne das Erblühen als offensichtlich bezeichnen zu wollen, können Sie die Mittelwerte verschiedener Gruppen vergleichen und feststellen, ob sich ihre 95% -KI überlappen (dh der wahre Mittelwert ist wahrscheinlich unterschiedlich).

Ich denke, es ist wichtig, ein Gleichgewicht zwischen Einfachheit und Information für verschiedene Zwecke zu finden. Aber wenn ich diese Handlungen verwende, sage ich: "Diese beiden Gruppen unterscheiden sich in irgendeiner wichtigen Weise voneinander" [oder auch nicht].

Scheint mir ziemlich gut zu sein, aber ich würde gerne Gegenbeispiele hören. Ich nehme an, dass die Verwendung des Diagramms impliziert, dass die Daten keine bizzare Verteilung aufweisen, die den Mittelwert ungültig oder irreführend macht.


Ich habe einen kleinen Abschnitt hinzugefügt, warum ich diese Grundstücke nicht mag.
csgillespie

1
@ Chris check this out über die Interpretation überlappender CIs pubs.amstat.org/doi/abs/10.1198/000313001317097960 Auch die ursprüngliche Frage betrifft die Verwirrung, SE oder SD austauschbar zu verwenden, während sie zwei verschiedene Dinge sind
tosonb1

Eine Analyse auf dieser Website finden Sie unter stats.stackexchange.com/questions/18215 . @ tosonb1 Ihr Link ist abgelaufen. Könnten Sie einen Verweis auf das Papier liefern?
whuber

2

Wenn es sich bei den Daten um Raten handelt, dh die Anzahl der Erfolge geteilt durch die Anzahl der Versuche, ist eine sehr elegante Methode eine Trichterdarstellung. Beispiel: http://qshc.bmj.com/content/11/4/390.2.full (Entschuldigung, wenn für den Link ein Abonnement erforderlich ist - lassen Sie es mich wissen und ich werde ein anderes finden).

Es mag möglich sein, es an andere Datentypen anzupassen, aber ich habe keine Beispiele gesehen.

AKTUALISIEREN:

Hier ist ein Link zu einem Beispiel, für das kein Abonnement erforderlich ist (und das eine gute Erklärung für die Verwendung enthält): http://understandinguncertainty.org/fertility

Sie können für Nichtraten-Daten verwendet werden, indem einfach der Mittelwert gegen den Standardfehler aufgetragen wird, sie können jedoch einen Teil ihrer Einfachheit verlieren.

Der Wikipedia-Artikel ist nicht großartig, da er nur die Verwendung in Meta-Analysen beschreibt. Ich würde argumentieren, dass sie in vielen anderen Zusammenhängen nützlich sein könnten.


Die Daten sind keine notwendigen Raten. Es könnte alles sein.
csgillespie

Abo-Link leider.
Matt Parker

... aber hier ist der Wikipedia-Link zu Trichterplots: en.wikipedia.org/wiki/Funnel_plot
Matt Parker

2

Ich würde hier Boxplots verwenden; sauber, aussagekräftig, nicht parametrisch ... oder vioplot, wenn die Verteilung interessanter ist.


2
Ich bin nicht sicher, ob Boxplots oder Vioplots mit einer so kleinen Stichprobengröße (n = 6) geeignet wären
csgillespie

Richtig, ich gebe zu, dass ich die Frage nicht sorgfältig genug gelesen habe, es war also eher eine allgemeine Idee. Trotzdem denke ich, dass 6 Punkte minimal sind, aber genug für einen Boxplot. Ich habe einige Experimente gemacht und sie waren sinnvoll. Andererseits gibt Boxplot offensichtlich nicht die Anzahl der Beobachtungen an (was hier eine wichtige Information ist), daher würde ich eher eine Kombination aus diesen und Punkten verwenden.

Mit 6 Punkten - Streudiagramm ist wahrscheinlich am besten (möglicherweise mit einem roten Punkt für den Mittelwert)
Tal Galili

2
Ich benutze in der Regel Boxplots mit überlagerten Punkten, ich finde es sehr "visuell". Geigenpläne sind meiner Meinung nach eher schwer zu verstehen.
nico

1
@csgillespie: Was würde darauf hinweisen, dass Balken- und Whisker-Diagramme besser sind? Sie zeigen im Grunde die gleichen Informationen wie ein Boxplot (Sie weisen darauf hin, dass die Whisker verschiedene Dinge darstellen können), sie geben den Fehler nur in eine Richtung, was ziemlich verwirrend, wenn nicht unaufrichtig sein könnte ... Nicht für Boxplots streiten . Aber Beanplots / Violinplots sollten immer noch funktionieren, auch bei relativ geringen Stichprobengrößen, da es sich nur um eine Schätzung der Gaußschen Dichte handelt, wie ich hier erklärt habe .
naught101

1

Vereinfachung von @ csgillespies großartigem Code von oben:

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

Ich bevorzuge geom_pointrange gegenüber errorbar und denke, dass die Linien eher ablenken als hilfreich sind. Hier ist die Version, die ich viel sauberer finde als die @ James- oder @ CSGILLESPIE-Version:

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)
 )
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.