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)
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)
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
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.
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
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
@Gregor Grazie, ho dimenticato i set di dati di magazzino. Aggiornato il mio PNG e codice – Username