Domanda
Un mio collega deve tracciare 101 grafici a occhio di bue. Questa non è la sua idea. Piuttosto che avere il suo schiavo via in Excel o Dio sa cosa sta facendo queste cose, mi sono offerto di farle in R; mappare un grafico a barre su coordinate polari per creare un occhio di bue è un gioco da ragazzi in ggplot2
.
Sto riscontrando un problema, tuttavia: i dati sono già aggregati, quindi l'esempio di Hadley qui non funziona per me. Potrei espandere i conteggi in un fattore per farlo, ma ho la sensazione che ci sia un modo migliore - un modo per dire alla geom_bar come leggere i dati.
I dati si presentano così:
Zoo Animals Bears Polar Bears
1 Omaha 50 10 3
Farò una trama per ogni zoo - ma quella parte che posso gestire.
ed ecco il suo dput
:
structure(list(Zoo = "Omaha", Animals = "50", Bears = "10", `Polar Bears` = "3"), .Names = c("Zoo",
"Animals", "Bears", "Polar Bears"), row.names = c(NA, -1L), class = "data.frame")
Nota: è significativo che Animals > = Bears > = Polar Bears. Inoltre, è fuori città, quindi non posso semplicemente ottenere i dati grezzi da lei (se ci fosse mai un file di grandi dimensioni, comunque).
Soluzione
Il modo per farlo senza disaggregare è usare stat = " identità "
in geom_bar
.
Aiuta l'avvio del frame di dati contenente valori numerici anziché stringhe di caratteri:
dat <- data.frame(Zoo = "Omaha",
Animals = 50, Bears = 10, `Polar Bears` = 3)
Abbiamo bisogno di reshape2 :: melt
per organizzare correttamente i dati:
library(reshape2)
d3 <- melt(dat,id.var=1)
Ora crea la trama (identica all'altra risposta):
library(ggplot2)
ggplot(d3, aes(x = variable, y = value)) +
geom_bar(width = 1, colour = "black",stat="identity") +
coord_polar()
Altri suggerimenti
Mentre stiamo aspettando una risposta migliore, ho pensato che avrei dovuto pubblicare la soluzione (non ottimale) che hai citato. dat
è la struttura inclusa nella tua domanda.
d <- data.frame(animal=factor(sapply(list(dat[2:length(dat)]),
function(x) rep(names(x),x))))
cxc <- ggplot(d, aes(x = animal)) + geom_bar(width = 1, colour = "black")
cxc + coord_polar()
Puoi usare inverse.rle
per ricreare i dati,
dd = list(lengths = unlist(dat[-1]), values = names(dat)[-1])
class(dd) = "rle"
inverse.rle(dd)
Se hai più zoo (righe), puoi provare
l = plyr::dlply(dat, "Zoo", function(z)
structure(list(lengths = unlist(z[-1]), values = names(z)[-1]), class = "rle"))
reshape2::melt(llply(l, inverse.rle))