2011-08-25 11 views
30

Voglio creare un grafico a barre in cui uno dei valori è molto più grande di tutti gli altri valori. C'è un modo per avere un asse y discontinuo? I miei dati è la seguente:Usando ggplot2, posso inserire un'interruzione nell'asse?

df <- data.frame(a = c(1,2,3,500), b = c('a1', 'a2','a3', 'a4')) 

p <- ggplot(data = df, aes(x = b, y = a)) + geom_bar() 
p <- p + opts(axis.text.x=theme_text(angle= 90, hjust=1)) + coord_flip() 
p 

enter image description here

C'è un modo che io possa fare la mia corsa asse da 1- 10, quindi 490-500? Non riesco a pensare a nessun altro modo di tracciare i dati (oltre a trasformarlo, cosa che non voglio fare)

+3

io non credo che si possa introdurre agevolazioni in ggplot2. un'alternativa sarebbe usare la scala 'log' che renderebbe il grafico più facile da leggere. – Ramnath

+0

Mi rendo conto che renderebbe più semplice la lettura su una scala di registro, ma non voglio mostrare le informazioni in questo modo, poiché esiste una variazione significativa tra i piccoli valori che verrebbero nascosti quando vengono trasformati. – djq

+3

cosa dire di una combinazione di 'facet_wrap()' con 'scale =" free_x "' – Chase

risposta

30

Come notato altrove, questo non è qualcosa che lo ggplot2 gestirà bene, poiché gli assi rotti sono generalmente considerati discutibili.

Altre strategie sono spesso considerate migliori soluzioni a questo problema. Brian ne ha menzionati alcuni (sfaccettature, due grafici concentrandosi su diversi gruppi di valori). Un altra opzione che la gente troppo spesso si affacciano, in particolare per barcharts, è quello di fare un tavolo :

enter image description here

Guardando i valori reali, la 500 non oscura le differenze negli altri valori! Per qualche ragione le tabelle non hanno abbastanza rispetto come dati una tecnica di visualizzazione. Potresti obiettare che i tuoi dati hanno molte, molte categorie che diventano ingombranti in una tabella. Se è così, è probabile che il grafico a barre abbia troppe barre per essere ragionevole.

E non sto discutendo per le tabelle tutte l'ora. Ma sono sicuramente qualcosa da considerare se stai facendo barcharts con relativamente poche battute. E se stai facendo barcharts con tonnellate di barre, potrebbe essere necessario ripensarlo comunque.

Infine, vi è anche la funzione axis.break nel pacchetto plotrix che implementa gli assi danneggiati. Tuttavia, da quello che raccolgo dovrai specificare le etichette degli assi e le posizioni da te, a mano.

+0

Joran, ho sentimenti contrastanti sull'utilizzo di questo tipo di trama. Hai ragione - un tavolo è probabilmente il modo migliore per dimostrarlo. – djq

+0

@celenius - Non volevo sembrare un predicatore o come se ti stessi sgridando. Mi sento come se i tavoli non prendessero molto amore, ea volte mi eccitavo. ;) – joran

+0

Non mi sono sentito sgridato! Non mi è mai venuto in mente di usarne uno .... – djq

1

Dubito che ci sia qualcosa nello scaffale in R, ma è possibile mostrare i dati come una serie di cubi parziali 3D. 500 è solo 5 * 10 * 10, quindi dovrebbe scalare bene. Il valore esatto potrebbe essere un'etichetta.

Questo probabilmente dovrebbe essere usato solo se si avere una rappresentazione grafica per qualche motivo.

19

Non con ggplot, ma con plotrix si può facilmente farlo:

library(plotrix) 
gap.barplot(df$a, gap=c(5,495),horiz=T) 
5

No, purtroppo non

Il timore è che permettono assi discontinui porteranno l'inganno del pubblico. Tuttavia, ci sono casi in cui non ha un asse discontinuo porta alla distorsione.

Ad esempio, se l'asse viene troncato, ma in genere si trova all'interno di un intervallo (ad esempio [0,1]), il pubblico potrebbe non notare il troncamento e trarre conclusioni distorte sui dati. In questo caso, un asse discontinuo esplicito sarebbe più appropriato e trasparente.

Confronta:

Example of good use of continuous vs discontinuous axis

Problemi correlati