Pergunta
Um colega meu precisa traçar 101 gráficos olho de boi. Esta não é a sua idéia. Ao invés de ter seu escravo longe no Excel ou Deus sabe o que fazer essas coisas, eu me ofereci para fazê-los em R; mapeamento de uma trama bar para coordenadas polares para fazer um olho de boi é uma brisa em ggplot2
.
Eu estou correndo em um problema, porém: os dados já estão agregados, por isso o exemplo de Hadley aqui não está funcionando para mim. Eu poderia expandir as contagens fora em um fator de fazer isso, mas eu sinto que há uma maneira melhor -. Alguma maneira de dizer ao geom_bar como ler os dados
Os olhares de dados como este:
Zoo Animals Bears Polar Bears
1 Omaha 50 10 3
Eu vou estar fazendo um complô para cada jardim zoológico -. Mas essa parte eu possa gerenciar
e aqui está sua 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 que Animais> = Bears> = ursos polares. Além disso, ela está fora da cidade, por isso não posso só pegar os dados brutos dela (se alguma vez houve um grande arquivo, de qualquer maneira).
Solução
A maneira de fazer isso sem desagregar é usar stat="identity"
em geom_bar
.
Ela ajuda a ter a estrutura de dados contendo valores numéricos, em vez de cadeias de caracteres para começar:
dat <- data.frame(Zoo = "Omaha",
Animals = 50, Bears = 10, `Polar Bears` = 3)
Nós fazemos necessidade reshape2::melt
de se organizar os dados corretamente:
library(reshape2)
d3 <- melt(dat,id.var=1)
Agora crie o enredo (idêntica à outra resposta):
library(ggplot2)
ggplot(d3, aes(x = variable, y = value)) +
geom_bar(width = 1, colour = "black",stat="identity") +
coord_polar()
Outras dicas
Enquanto estamos à espera de uma resposta melhor, eu percebi que eu deveria postar a solução (suboptimal) que você mencionou. dat
é a estrutura incluída na sua pergunta.
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()
Você pode usar inverse.rle
para recriar os dados,
dd = list(lengths = unlist(dat[-1]), values = names(dat)[-1])
class(dd) = "rle"
inverse.rle(dd)
Se você tem vários jardins zoológicos (linhas), você pode tentar
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))