Pregunta

Un colega mío necesita trazar 101 gráficos de ojo de buey. Esta no es su idea. En lugar de tener a su esclava en Excel o si Dios sabe qué es lo que hace estas cosas, me ofrecí a hacerlo en R; mapear una gráfica de barras con coordenadas polares para hacer un ojo de buey es muy fácil en ggplot2 .

Sin embargo, me estoy topando con un problema: los datos ya están agregados, por lo que el ejemplo de Hadley Aquí no está funcionando para mí. Podría ampliar las cuentas en un factor para hacer esto, pero creo que hay una mejor manera, una forma de decirle a geom_bar cómo leer los datos.

Los datos se ven así:

    Zoo Animals Bears Polar Bears
1 Omaha      50    10           3

Estaré haciendo una parcela para cada zoológico, pero esa parte la puedo administrar.

y aquí está su 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: es significativo que los Animales > = Osos > = Osos polares. Además, ella está fuera de la ciudad, así que no puedo obtener los datos en bruto de ella (si es que alguna vez hubo un archivo grande).

¿Fue útil?

Solución

La forma de hacerlo sin desagregar es usar stat = " identidad " en geom_bar .

Es útil que el marco de datos contenga valores numéricos en lugar de cadenas de caracteres para comenzar:

dat <- data.frame(Zoo = "Omaha",
               Animals = 50, Bears = 10, `Polar Bears` = 3)

Necesitamos reshape2 :: melt para organizar los datos correctamente:

library(reshape2)
d3 <- melt(dat,id.var=1)

Ahora crea la trama (idéntica a la otra respuesta):

library(ggplot2)
ggplot(d3, aes(x = variable, y = value)) +
    geom_bar(width = 1, colour = "black",stat="identity") +
    coord_polar()

Otros consejos

Mientras esperamos una respuesta mejor, pensé que debería publicar la solución (subóptima) que mencionó. dat es la estructura incluida en su pregunta.

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

Puede usar inverse.rle para recrear los datos,

dd = list(lengths = unlist(dat[-1]), values = names(dat)[-1])
class(dd) = "rle"
inverse.rle(dd)

Si tiene varios zoológicos (filas), puede probar

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))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top