Visualizzazione dei dati più sottoutilizzata [chiuso]


178

Istogrammi e grafici a dispersione sono ottimi metodi per visualizzare i dati e la relazione tra le variabili, ma recentemente mi sono chiesto quali tecniche di visualizzazione mi mancano. Quale pensi sia il tipo di trama più sottoutilizzato?

Le risposte dovrebbero:

  1. Non essere molto comunemente usato in pratica.
  2. Sii comprensibile senza molte discussioni di background.
  3. Essere applicabile in molte situazioni comuni.
  4. Includi codice riproducibile per creare un esempio (preferibilmente in R). Un'immagine collegata sarebbe bella.

13
Penso che questa sia una discussione molto utile, e sono triste che sia chiusa.
Alex Brown,

2
@AlexBrown: allora perché non votare per riaprire? Posso capire perché la formulazione di questa domanda può sembrare "non costruttiva", ma questa domanda ha portato ad alcune delle risposte più ponderate e approfondite su questo argomento ovunque sul web. Mi piacerebbe vedere queste risposte aggiornate ed estese.
max

2
Questo dovrebbe probabilmente essere spostato su stats.stackoverflow.com. È molto più adatto a quel sito.
niente101

4
Peccato che nessuno abbia menzionato qui i grafici QQ prima che questo fosse chiuso. Sono così dannatamente utili!
naught101

Questo dovrebbe essere riaperto.
Peter Flom,

Risposte:


89

Sono davvero d'accordo con gli altri poster: i libri di Tufte sono fantastici e vale la pena leggerli.

In primo luogo, vorrei indicarti un bellissimo tutorial su ggplot2 e ggobi da "Looking at Data" all'inizio di quest'anno. Oltre a ciò vorrei solo evidenziare una visualizzazione da R e due pacchetti grafici (che non sono così ampiamente utilizzati come grafica di base, reticolo o ggplot):

Mappe di calore

Mi piacciono molto le visualizzazioni in grado di gestire dati multivariati, in particolare i dati di serie temporali. Le mappe di calore possono essere utili per questo. Uno davvero pulito è stato descritto da David Smith sul blog Revolutions . Ecco il codice ggplot per gentile concessione di Hadley:

stock <- "MSFT"
start.date <- "2006-01-12"
end.date <- Sys.Date()
quote <- paste("http://ichart.finance.yahoo.com/table.csv?s=",
                stock, "&a=", substr(start.date,6,7),
                "&b=", substr(start.date, 9, 10),
                "&c=", substr(start.date, 1,4), 
                "&d=", substr(end.date,6,7),
                "&e=", substr(end.date, 9, 10),
                "&f=", substr(end.date, 1,4),
                "&g=d&ignore=.csv", sep="")    
stock.data <- read.csv(quote, as.is=TRUE)
stock.data <- transform(stock.data,
  week = as.POSIXlt(Date)$yday %/% 7 + 1,
  wday = as.POSIXlt(Date)$wday,
  year = as.POSIXlt(Date)$year + 1900)

library(ggplot2)
ggplot(stock.data, aes(week, wday, fill = Adj.Close)) + 
  geom_tile(colour = "white") + 
  scale_fill_gradientn(colours = c("#D61818","#FFAE63","#FFFFBD","#B5E384")) + 
  facet_wrap(~ year, ncol = 1)

Che finisce per apparire un po 'così:

testo alternativo

RGL: grafica 3D interattiva

Un altro pacchetto che vale la pena imparare è RGL , che offre facilmente la possibilità di creare grafica 3D interattiva. Ci sono molti esempi online per questo (incluso nella documentazione di rgl).

R-Wiki ha un bell'esempio di come tracciare grafici a dispersione 3D usando rgl.

GGobi

Un altro pacchetto che vale la pena conoscere è rggobi . C'è un libro Springer sull'argomento e molta documentazione / esempi online, incluso il corso "Looking at Data" .


simpatico. Grazie per aver incluso il codice / immagine.
Ian Fellows,

cosa è indicato dalla posizione verticale della "Z" o curva in ogni linea verticale nera solida?
Doug

Questi sono i limiti del mese (i mesi non finiscono nello stesso giorno).
Shane,

3
Questo è bello. Come hai ottenuto i confini del mese?
Alex Brown,


58

Mi piacciono molto i dotplot e, quando li consiglio ad altri per problemi di dati appropriati, sono sempre sorpresi e felici. Non sembrano essere molto utili e non riesco a capire perché.

Ecco un esempio di Quick-R: dotplot sui dati dell'auto

Credo che Cleveland sia il principale responsabile dello sviluppo e della divulgazione di questi, e l'esempio nel suo libro (in cui i dati errati sono stati facilmente rilevati con un dotplot) è un argomento forte per il loro uso. Nota che l'esempio sopra mette solo un punto per linea, mentre il loro vero potere viene fornito con più punti su ogni linea, con una legenda che spiega quale è quale. Ad esempio, è possibile utilizzare simboli o colori diversi per tre diversi punti temporali e quindi ottenere facilmente un senso dei modelli temporali in diverse categorie.

Nel seguente esempio (fatto in Excel di tutte le cose!), Puoi vedere chiaramente quale categoria potrebbe aver subito uno scambio di etichette.

Dotplot con 2 gruppi


1
In che modo un dotplot è diverso da un scatterplot con asse commutato uno dei quali è categorico?
DrSAR,

4
@DrSAR In che modo un istogramma è diverso da un diagramma a barre o un diagramma di densità è diverso da un diagramma a linee? Puoi descrivere molti tipi di grafici standard in termini di geometrie più fondamentali (vedi Semiologie Graphique di Bertin ), ma ciò non rende l'intuizione di tracciare qualcosa in un modo particolare meno unico. In questo caso, stai stampando due parti di informazioni categoriche (una in verticale, una in base alla forma del carattere di stampa) contro una parte di dati continui. Mentre nella maggior parte dei pacchetti software dovresti hackerare un diagramma a dispersione per crearlo, non è assolutamente un diagramma a dispersione.
Ari B. Friedman,

2
@ gsk3 Non intendevo sembrare snarky. In effetti, ora (dopo aver letto di più sulla grammatica della grafica e lavori simili) mi rendo conto che questa distinzione di livello superiore può essere abbastanza importante per la presentazione. Grazie per averlo mostrato.
DrSAR,

@DrSAR E non intendevo sembrare difensivo. Natura dei commenti SO suppongo ;-)
Ari B. Friedman,

56

I grafici che utilizzano coordinate polari sono sicuramente sottoutilizzati - alcuni potrebbero dire con una buona ragione. Penso che le situazioni che giustificano il loro uso non siano comuni; Penso anche che quando si presentano tali situazioni, i grafici polari possono rivelare modelli nei dati che i grafici lineari non possono.

Penso che sia perché a volte i tuoi dati sono intrinsecamente polari piuttosto che lineari - ad esempio, sono ciclici (coordinate x che rappresentano i tempi durante il giorno di 24 ore su più giorni), oppure i dati erano precedentemente mappati su uno spazio polare.

Ecco un esempio Questo diagramma mostra il volume medio di traffico di un sito Web per ora. Notare i due picchi alle 22:00 e all'01: 00. Per gli ingegneri di rete del sito, quelli sono significativi; è anche significativo che si verifichino l'uno vicino all'altro (a sole due ore di distanza). Ma se si tracciano gli stessi dati su un sistema di coordinate tradizionale, questo modello sarebbe completamente nascosto - tracciato linearmente, questi due picchi sarebbero distanti 20 ore l'una dall'altra, ma sono anche solo due ore l'una dall'altra in giorni consecutivi. La tabella polare sopra mostra questo in modo parsimonioso e intuitivo (non è necessaria una legenda).

Grafico polare che mostra il traffico del sito, con picchi alle ore 1 e 22

Esistono due modi (di cui sono a conoscenza) per creare grafici come questo usando R (ho creato il diagramma sopra w / R). Uno è codificare la propria funzione nei sistemi grafici di base o della griglia. L'altro modo, che è più semplice, è usare il pacchetto circolare . La funzione che useresti è ' rose.diag ':

data = c(35, 78, 34, 25, 21, 17, 22, 19, 25, 18, 25, 21, 16, 20, 26, 
                 19, 24, 18, 23, 25, 24, 25, 71, 27)
three_palettes = c(brewer.pal(12, "Set3"), brewer.pal(8, "Accent"), 
                   brewer.pal(9, "Set1"))
rose.diag(data, bins=24, main="Daily Site Traffic by Hour", col=three_palettes)

4
Copiando il tuo codice, ottengo una trama molto diversa (che è piuttosto brutta); qualche idea del perché? Ricevo questo avviso: 1: In as.circular (xx [, 1]): un oggetto viene forzato nella classe 'circolare' usando il valore predefinito per i seguenti componenti: digitare: 'angoli' unità: 'radianti' modello: ' nessuno 'modulo:' asis 'zero: 0 rotazione:' counter 'rose.diagdata24Test del sito giornaliero di Hourthree_palettes
datayoda

Ho lo stesso problema.
Crayola,

Potresti farlo anche con un diagramma a linee. Può essere un po 'più difficile da leggere, ma può anche essere davvero fantastico per dati più granulari o dati che subiscono più di un ciclo (ad esempio tracciare dieci cicli, quindi tracciare la loro media).
naught101

1
Ho anche avuto problemi a replicare la trama. Alla fine ho deciso che era più facile usare ggplot2. Ho lasciato una breve demo su Rpubs con codice e risultati: rpubs.com/mattbagg/circular
MattBagg

1
equivalente ggplot2:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
naught101

54

Se il tuo diagramma a dispersione ha così tanti punti da diventare un disastro completo, prova un diagramma a dispersione levigato. Ecco un esempio:

library(mlbench) ## this package has a smiley function
n <- 1e5 ## number of points
p <- mlbench.smiley(n,sd1 = 0.4, sd2 = 0.4) ## make a smiley :-)
x <- p$x[,1]; y <- p$x[,2]
par(mfrow = c(1,2)) ## plot side by side
plot(x,y) ## left plot, regular scatter plot
smoothScatter(x,y) ## right plot, smoothed scatter plot

Il hexbinpacchetto (suggerito da @Dirk Eddelbuettel) viene utilizzato per lo stesso scopo, ma smoothScatter()ha il vantaggio di appartenere al graphicspacchetto e fa quindi parte dell'installazione R standard.

Faccina come trama regolare o levigata


6
Per completezza, puoi anche ottenere questo effetto in ggplot usando la trasparenza (alfa).), In combinazione con il punto geom.
Paul Hiemstra,

1
è lo stesso della stima della densità del kernel, o semplicemente simile?
endolito

30

Per quanto riguarda sparkline e altre idee di Tufte, il pacchetto YaleToolkit su CRAN fornisce funzioni sparklinee sparklines.

Un altro pacchetto utile per set di dati più grandi è hexbin in quanto " divide" in modo intelligente i dati in bucket per gestire set di dati che potrebbero essere troppo grandi per i grafici a dispersione ingenui.


4
+1 alle sparkline. Attualmente sto lavorando a un pacchetto incentrato sulla creazione di sparkline in R: fanno grandi aggiunte alle tabelle nei rapporti Sweave.
Sharpie,

1
Freddo! Non sono molto contento di ciò che Jay ha in YaleToolkit e mi piacerebbe avere delle scintille nei tavoli!
Dirk Eddelbuettel,

Ho appena documentato un modo per produrre sparkline utilizzando solo plotin un aggiornamento alla mia domanda , con l'aiuto di questo post sul forum Tufte
Ben

1
La Hmisc::latex()versione di output da Hmisc::describeinclude un mini-istogramma che viene incluso nella tabella.
IRTFM,

28

Le trame di violino (che combinano trame di scatole con densità del kernel) sono relativamente esotiche e piuttosto interessanti. Il pacchetto vioplot in R ti permette di renderli abbastanza facilmente.

Ecco un esempio (il link di Wikipedia mostra anche un esempio):

inserisci qui la descrizione dell'immagine


3
Le trame di violino sono disponibili anche tramite il pacchetto reticolare:bwplot(... panel = panel.violin)
David J.

3
La versione ggplot2 delle trame di violino arriverà a breve. github.com/wch/ggplot2/wiki/geom_violin
Roman Luštrik

Non mi piacciono le trame di violino così sottili, mi piace mostrare tutti i punti con un jitter.
Nakx,

25

Un'altra visualizzazione di serie temporali che stavo solo rivedendo è il "bump chart" (come descritto in questo post sul blog "Learning R" ). Questo è molto utile per visualizzare i cambiamenti di posizione nel tempo.

Puoi leggere come crearlo su http://learnr.wordpress.com/ , ma è così che si presenta:

testo alternativo


Mi piace il diagramma a sbalzo per questi dati particolari, ma faccio fatica a pensare a situazioni più generali in cui sarebbe utile. Detto questo, penso che possiamo essere tutti d'accordo sul fatto che il blog Learning R scuote le calze.
Ian Fellows,

7
Un bump chart è un diagramma di coordinate parallele di dati classificati.
Hadley,

1
questo mi ricorda slopegraph che è buono per rappresentare il cambiamento nel tempo o classifica rapporti fra classifiche: charliepark.org/slopegraphs
topchef

21

Mi piacciono anche le modifiche dei grafici a scatole di Tufte che ti permettono di fare paragoni con piccoli multipli molto più facilmente perché sono molto "sottili" in orizzontale e non ingombrano la trama con inchiostro ridondante. Tuttavia, funziona meglio con un numero abbastanza elevato di categorie; se ne hai solo alcuni su una trama, i normali grafici a scatole (Tukey) sembrano migliori poiché hanno un po 'più di peso.

library(lattice)
library(taRifx)
compareplot(~weight | Diet * Time * Chick, 
  data.frame=cw , 
  main = "Chick Weights",
  box.show.mean=FALSE,
  box.show.whiskers=FALSE,
  box.show.box=FALSE
  )

compareplot

In questa domanda vengono discussi altri modi per realizzarli (incluso l'altro tipo di diagramma a scatole Tufte) .


@daroczig Grazie. Uno di questi giorni lo riscriverò per prendere diverse configurazioni di raggruppamenti. Ho imparato molto da quando ho scritto quella funzione!
Ari B. Friedman,

1
Mi piacciono le tue trame molto meglio di quelle di tufte, che sono ridicolmente difficili da leggere. Penso ancora che i grafici a scatole in stile Tukey siano migliori, anche se un buon compromesso potrebbe essere qualcosa di simile a quello che hai qui, ma con linee larghe 3px per la scatola, invece dell'offset 1px. E penso che una linea orisontale larga 1px per la mediana sia probabilmente più ordinata e più esatta.
nulla101

19

Non dovremmo dimenticare la trama di gambo e foglia carina e (storicamente) importante (che anche Tufte ama!). Ottieni una panoramica direttamente numerica della tua densità e forma dei tuoi dati (ovviamente se il tuo set di dati non è più grande di circa 200 punti). In R, la funzione stemproduce il tuo display stem-and-leaf (nell'area di lavoro). Preferisco usare la gstemfunzione dal pacchetto fmsb per disegnarlo direttamente in un dispositivo grafico. Di seguito è riportato uno scostamento della temperatura corporea del castoro (i dati devono essere nel set di dati predefinito) in un display stelo per foglia:

  require(fmsb)
  gstem(beaver1$temp)

inserisci qui la descrizione dell'immagine



15

Oltre all'eccellente lavoro di Tufte, raccomando i libri di William S. Cleveland: Visualizzazione dei dati e The Elements of Graphing Data . Non solo sono eccellenti, ma sono stati tutti eseguiti in R, e credo che il codice sia pubblicamente disponibile.


14

Grafici a scatole! Esempio dalla guida R:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")

Secondo me è il modo più utile per dare una rapida occhiata ai dati o per confrontare le distribuzioni. Per distribuzioni più complesse c'è un'estensione chiamata vioplot.


2
Beanplot potrebbe essere menzionato anche qui jstatsoft.org/v28/c01/paper and cran.r-project.org/web/packages/beanplot/index.html
radek

I boxplot non sono così poco utilizzati, vero? Voglio dire, in molti documenti i grafici a barre sono usati per i dati che dovrebbero essere tracciati in riquadri, ma sono ancora piuttosto comuni.
niente101

11

Le trame di mosaico mi sembrano soddisfare tutti e quattro i criteri citati. Ci sono esempi in r, in mosaicplot.


3
Una migliore implementazione dei grafici a mosaico è nella libreria vcd (nome della funzione 'mosaic'). Ha una firma del metodo molto più flessibile ed è implementato in griglia (piuttosto che nel sistema grafico "base").
Doug

10

Dai un'occhiata al lavoro di Edward Tufte e soprattutto a questo libro

Puoi anche provare a catturare la sua presentazione itinerante . È abbastanza buono e include un gruppo di quattro dei suoi libri. (giuro che non possiedo le azioni del suo editore!)

A proposito, mi piace la sua tecnica di visualizzazione dei dati sparkline. Sorpresa! Google l'ha già scritto e pubblicato su Google Code


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.