Grafica alternativa ai grafici "handle bar"


15

Nella mia area di ricerca, un modo popolare di visualizzare i dati consiste nell'utilizzare una combinazione di un grafico a barre con "manubri". Per esempio,

inserisci qui la descrizione dell'immagine

I "manubri" si alternano tra errori standard e deviazioni standard a seconda dell'autore. In genere, le dimensioni del campione per ogni "barra" sono piuttosto piccole - circa sei.

Queste trame sembrano essere particolarmente popolari nelle scienze biologiche - vedi i primi articoli di BMC Biology, vol 3 per esempi.

Come presenteresti questi dati?

Perché non mi piacciono queste trame

Personalmente non mi piacciono queste trame.

  1. Quando le dimensioni del campione sono ridotte, perché non visualizzare solo i singoli punti dati.
  2. È il sd o il se che viene visualizzato? Nessuno concorda quale utilizzare.
  3. Perché usare le barre. I dati non vanno (generalmente) da 0 ma un primo passaggio nel grafico suggerisce che lo fa.
  4. I grafici non danno un'idea dell'intervallo o della dimensione del campione dei dati.

Sceneggiatura R.

Questo è il codice R che ho usato per generare la trama. In questo modo puoi (se vuoi) usare gli stessi dati.

                                        #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
Aiutare il tuo campo a raggiungere un consenso solo sulla domanda se v. Sd sarebbe un enorme progresso. Significano cose completamente diverse.
Giovanni

Sono d'accordo - di solito è scelto perché dà una regione più piccola!
csgillespie,

Forse qualche titolo più informativo?

3
Solo per riferimento, ho visto prima questi grafici a barre con barre di errore chiamate "Grafici dinamite". Ecco alcuni riferimenti che danno esattamente gli stessi consigli di tutti gli altri (grafici a punti). Tatsuki Koyama, Beware of Dynamite Poster e Drummond & Vowler, 2011 .
Andy W,

1
Aggiungi di nuovo l'immagine se puoi. Usa questa volta l'uploader di immagini in modo che non diventi un link non attivo.
endolith

Risposte:


16

Grazie per tutte le risposte. Per completezza, ho pensato di includere ciò che faccio di solito. Tendo a fare una combinazione dei suggerimenti forniti: punti, grafici a scatole (quando n è grande) e intervalli se (o sd).

( Rimosso dal moderatore perché il sito che ospita l'immagine non sembra più funzionare correttamente. )

Dal diagramma a punti, è chiaro che i dati sono molto più diffusi tra quelli suggeriti dalla barra "handle bar". In effetti, c'è un valore negativo in A3!


Ho reso questa risposta un CW, quindi non ottengo un rappresentante


3
Questa è una buona risposta Inoltre, suggerirei di spostare i punti in orizzontale, in modo che non si sovrappongano, soprattutto se hai più punti per gruppo di questo. In ggplot2, geom_jitter () lo farà.
Harlan,

@Harlan: sono d'accordo. Anche se avessi molti più punti, probabilmente userei un diagramma a scatole.
csgillespie,

1
Mi piacciono anche i grafici a dispersione per piccoli set di dati (nb, uso il termine 'dotplot' per fare riferimento a un grafico leggermente diverso). Tuttavia, per quello che vale, il grafico a barre sopra è più pulito e più facile da leggere di questo. Non sono sicuro che lo renda migliore, ma vale la pena sottolineare.
gung - Ripristina Monica

@Harlan: In alternativa, rendere i punti trasparenti in modo che più punti si accumulino e producano un punto più scuro?
endolith

hai l'immagine originale per sostituire questo link morto?
endolith

10

Il keynote (più eccellente) di Frank Harrell intitolato "Allergia all'informazione" in uso R! il mese scorso ha mostrato alternative a queste: piuttosto che nascondere i dati grezzi tramite l'aggregazione fornita dalle barre, i dati grezzi vengono anche visualizzati come punti (o punti). "Perché nascondere i dati?" fu il commento di Frank.

Dato alpa blending, questo appare come un suggerimento sensato (e l'intero discorso è pieno di pepite buone e importanti).


1
È disponibile come video? Sembra fantastico.
Henrik

1
Penso che la parola sia "alla fine" - le note chiave sono state registrate.
Dirk Eddelbuettel,

1
questo è facile in ggplot penso, cioè had.co.nz/ggplot2/geom_jitter.html
Mike Dewar,

1
jitterè anche in pianura R.

2
Solo per il protocollo, il discorso di Frank (in video) è ora online: r-bloggers.com/RUG/2010/08/user-2010-conference-videos
Tal Galili

7

Da un punto di vista psicologico, propongo di tracciare i dati più la tua incertezza sui dati. Quindi, in una trama come mostrate, non mi preoccuperei mai di estendere completamente le barre a zero, il che serve solo a minimizzare la capacità dell'occhio di distinguere le differenze nella gamma dei dati.

Inoltre, sono francamente anti-bargraph; i grafici a barre associano due variabili allo stesso attributo estetico (posizione dell'asse x), che può causare confusione. Un approccio migliore consiste nell'evitare la mappatura estetica ridondante mappando una variabile sull'asse xe un'altra variabile su un altro attributo estetico (ad es. Forma o colore del punto o entrambi).

Infine, nella trama sopra, includi solo barre di errore sopra il valore, il che ostacola la capacità di confrontare gli intervalli di incertezza rispetto alle barre sopra e sotto il valore.

Ecco come vorrei tracciare i dati (tramite il pacchetto ggplot2). Nota che aggiungo linee che collegano punti della stessa serie; alcuni sostengono che ciò sia appropriato solo quando le serie attraverso le quali sono collegate le linee sono numeriche (come sembra essere in questo caso), tuttavia fino a quando esiste una ragionevole relazione ordinale tra i livelli della variabile dell'asse x, penso le linee di collegamento sono utili per aiutare l'occhio a associare i punti attraverso l'asse x. Questo può diventare particolarmente utile per rilevare le interazioni, che si distinguono davvero per le linee.

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
)

inserisci qui la descrizione dell'immagine


1
Vorrei aggiungere che la mia raccomandazione "tracciare solo i dati e l'incertezza" dovrebbe essere qualificata: quando si presentano i dati a un pubblico che ha esperienza / competenza con la variabile da tracciare, tracciare solo i dati e l'incertezza. Quando si presentano i dati a un pubblico ingenuo e quando lo zero è un punto di dati significativo, per prima cosa mostrerei i dati che si estendono a zero in modo che il pubblico possa orientarsi sulla scala, quindi ingrandire per mostrare solo i dati e l'incertezza.
Mike Lawrence,

da quando hai avuto problemi a scrivere il codice R, potresti includere un'immagine jpeg della trama finale. Trovo solo caricare l'immagine su img84.imageshack.us e collegarlo ad esso è abbastanza facile. Oh, grazie per la risposta :)
csgillespie,

@csgillespie: fatto.
Mike Lawrence,

Ho scoperto che è più facile leggere una trama come questa geom_ribbon()indicando l'errore. Se non ti piace produrre stime apparenti per le regioni comprese tra 1 e 2, almeno riduci la larghezza della barra degli errori.
JoFrhwld,

@JoFrwld: mi piacciono anche i nastri, anche se tendo a riservarli per i casi in cui la variabile dell'asse x è veramente numerica; la mia versione della regola "non tracciare linee a meno che la variabile dell'asse x non sia numerica" ​​che professerei violare nella mia risposta sopra: Op
Mike Lawrence

2

Sono curioso di sapere perché non ti piacciono queste trame. Li uso sempre. Senza voler dichiarare la fioritura ovvia, ti permettono di confrontare le medie dei diversi gruppi e vedere se i loro IC al 95% si sovrappongono (cioè, la vera media probabilmente sarà diversa).

È importante trovare un equilibrio tra semplicità e informazioni per scopi diversi, immagino. Ma quando uso queste trame sto dicendo: "questi due gruppi sono diversi l'uno dall'altro in qualche modo importante" [o no].

Mi sembra molto bello, ma sarei interessato a sentire dei contro-esempi. Suppongo implicito nell'uso della trama che i dati non abbiano una distribuzione bizzosa che renda la media non valida o fuorviante.


Ho aggiunto una piccola sezione sul perché non mi piacciono queste trame.
csgillespie,

1
@Chris controlla questo sull'interpretazione di IC sovrapposti pubs.amstat.org/doi/abs/10.1198/000313001317097960 Anche la domanda originale riguarda anche la confusione dell'utilizzo di SE o SD in modo intercambiabile mentre sono due cose diverse
tosonb1

Oppure, per un'analisi su questo sito, consultare stats.stackexchange.com/questions/18215 . @ tosonb1 Il tuo collegamento è scaduto. Potresti fornire un riferimento al documento?
whuber

2

Se i dati sono tariffe : questo è il numero di successi diviso per il numero di prove, quindi un metodo molto elegante è un diagramma a imbuto. Ad esempio, vedi http://qshc.bmj.com/content/11/4/390.2.full (mi scuso se il link richiede un abbonamento - fammi sapere e ne troverò un altro).

Potrebbe essere possibile adattarlo ad altri tipi di dati, ma non ho visto alcun esempio.

AGGIORNARE:

Ecco un link ad un esempio che non richiede un abbonamento (e ha una buona spiegazione su come potrebbero essere utilizzati): http://understandinguncertainty.org/fertility

Possono essere utilizzati per dati non tariffari, semplicemente tracciando la media rispetto all'errore standard, tuttavia potrebbero perdere parte della loro semplicità.

L'articolo di Wikipedia non è eccezionale, in quanto illustra solo il loro uso nelle meta-analisi. Direi che potrebbero essere utili in molti altri contesti.


I dati non sono tariffe necessarie. Potrebbe essere qualsiasi cosa.
csgillespie,

Link all'iscrizione, sfortunatamente.
Matt Parker,

... ma ecco il link di Wikipedia sui grafici a imbuto: en.wikipedia.org/wiki/Funnel_plot
Matt Parker,

2

Vorrei usare i grafici a scatole qui; pulito, significativo, non parametrico ... O vioplot se la distribuzione è più interessante.


2
Non sono sicuro che boxplot o vioplot sarebbero adatti con una dimensione del campione così piccola (n = 6)
csgillespie

Bene, ammetto di non aver letto abbastanza attentamente la domanda, quindi era piuttosto un'idea generale; tuttavia penso che 6 punti siano minimi ma sufficienti per un diagramma a scatole. Ho fatto alcuni esperimenti ed erano significativi. D'altra parte, ovviamente boxplot non indica il numero di osservazioni (che è un po 'di informazione importante qui), quindi preferirei usarne una combinazione e punti.

Con 6 punti - il diagramma a dispersione è probabilmente il migliore (forse con l'aggiunta di un punto rosso per la media)
Tal Galili

2
In genere utilizzo boxplot con punti sovrapposti, lo trovo molto "visivo". Le trame di violino, invece, sono un po 'difficili da capire secondo me.
nico,

1
@csgillespie: cosa indicherebbe che i grafici a barre e baffi sono migliori? Stanno mostrando sostanzialmente le stesse informazioni di un diagramma a scatole (come fai notare, i baffi possono rappresentare varie cose), danno solo l'errore in una direzione, il che potrebbe essere abbastanza confuso, se non disingenuo ... Non discutere per i grafici a scatole . Ma i beanplot / violinplot dovrebbero comunque funzionare, anche per campioni di dimensioni relativamente basse, perché è solo una stima della densità gaussiana, come ho spiegato qui .
niente101

1

Semplificazione del fantastico codice di @ csgillespie dall'alto:

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

Preferisco geom_pointrange a errorbar e penso che le linee siano fonte di distrazione piuttosto che utili. Ecco la versione che trovo molto più pulita della versione @James o @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)
 )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.