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).

È stato utile?

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))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top