2015-11-04 24 views
7

Sto provando a creare grafici ad anello.Come posso creare grafici ad anello con facet_grid in ggplot2?

L'unico problema è che escono simile a questo ...

enter image description here

Ecco il mio codice

ggplot(
    diamonds, 
    aes(
    x = cut, 
    fill = color 
) 
) + 
    geom_bar(
    position = 'fill', 
    stat = 'bin' 
) + 
    scale_y_continuous(
    labels = percent_format() 
) + 
    facet_grid(clarity ~ cut) + 
    coord_polar(theta = 'y') 

Come faccio a mio grafici dalle torte strane in cerchi con la stessa larghezza ?

+3

Sicuramente è possibile fare un esempio riproducibile, un esempio riproducibile ** minimo **, che è composto da meno di 85 righe di codice e non richiede di andare in qualche sito Web per scaricare un file SPSS? Utilizza i dati incorporati con struttura simile o simula rapidamente i dati o condividi i dati trasformati, ovvero i dati nel grafico, utilizzando 'dput()'. [Vedi qui] (http: // StackOverflow.it/q/5963269/903061) per ulteriori suggerimenti su come dare il buon esempio. – Gregor

+1

Si potrebbe voler esaminare la funzione 'cut' che è molto più bella di istruzioni' ifelse' nidificate per binning di dati numerici. Anche 'x% in% c (" a "," b "," c ")' di solito è migliore di 'x ==" a "| x == "b" | x == "c" '. – Gregor

+0

@Gregor Grazie, ho dimenticato i set di dati di magazzino. Aggiornato il mio PNG e codice – Username

risposta

8

Ecco un modo bello e ordinato di farlo:

library(ggplot2) 
library(data.table) 

# get data, calculate quantities of interest 
diam <- diamonds; setDT(diam) 
tabulated <- diam[, .N, by = .(cut, color, clarity)] 

# plot 
ggplot(tabulated, aes(x=2, y=N, fill=color)) + 
    geom_bar(position = 'fill', stat = 'identity') + 
    facet_grid(clarity ~ cut) + 
    xlim(0.5, 2.5) + 
    coord_polar(theta = 'y') + 
    labs(x=NULL, y=NULL) 

enter image description here

Ok, come fa questo lavoro? Diamo un'occhiata al tuo codice: ottieni delle trame che sembrano ciambelle, ma con diverse dimensioni dei fori. Perché? È utile "decomprimere" i dati e osservare l'output come barre. (Ho intenzione di sottoinsieme di appena due righe di tue sfaccettature per semplicità.)

ggplot(subset(diamonds, as.numeric(clarity) <=2), 
     aes(x = cut, fill = color)) + 
    geom_bar(position = 'fill', stat = 'bin') + 
    facet_grid(clarity ~ cut) 

enter image description here

Hai un valore mappato a X che non sta facendo qualcosa di utile - è la compensazione barre, ma dal momento che stai sfacciando su quella variabile ogni trama ha solo una pila di barre al suo interno.

Eppure, quando si aggiunge coord_polar, le trame con valori di offset X mostrano come ciambelle, mentre la trama con x = 1 si presenta come una torta Questo perché con coord_polar, la serie di barre in pila sono annidati uno dentro l'altro, e X = 1 significa la "bobina" più interna.

Quindi, la soluzione inizia con NON mappando un valore reale su X. È possibile creare X = 1 per tutti i grafici, ma poi si otterranno tutte le torte, non le ciambelle. Quello che vuoi è una barra in pila, con un po 'di spazio prima sull'asse x (che sarà il foro della ciambella). Puoi farlo duplicando i dati, in modo da avere due serie di barre impilate, quindi eliminare la prima pila. Questa è la risposta che ho avuto prima, e funziona (vedi la cronologia delle modifiche per i dettagli).

Hadley ha suggerito una soluzione più semplice tramite twitter, che mi sento obbligato a pubblicare per i posteri: regolare i limiti x per forzare alcuni spazi vuoti iniziali sull'asse x.

Per cominciare, calcolare i valori desiderati (sto usando data.table per questo):

library(data.table) 
diam <- diamonds; setDT(diam) 
tabulated <- diam[, .N, by = .(cut, color, clarity)] 

Ora trama, con qualche spazio prima che la pila di barre

enter image description here

C'è il grafico a barre in pila che vuoi e tutto ciò che devi fare è aggiungere coord_polar (come fatto nella parte superiore del post). Puoi giocare con i limiti x per accordare il rapporto ciambella/foro a tuo piacimento.

+0

Questo era esattamente quello che volevo! Ho solo un paio di domande come R noob. 1) Cosa sta succedendo in 'diam [, .N, di =. (Taglio, colore, chiarezza)]'? Cosa significa la virgola, 'by =' e '.' prima della paranesi? 2) In 'plot_data [donutslice == 1, N: = 0]', cosa significa '' 'in' N: = 0'? – Username

+0

Questo è il gergo 'data.table'. – Axeman

+1

Giusto, gergo data.table. La prima cosa conta solo i casi, raggruppati in base alle tre variabili. Puoi ottenere qualcosa di simile nella base R con 'aggregato (carat ~ cut + color + clarity, data = diamonds, FUN = length)' (ma ora la colonna count è chiamata 'carat' invece di N). Scopri data.table, però, è fantastico – arvi1000

Problemi correlati