Question
Un de mes collègues doit tracer 101 cartes en gros plan. Ce n'est pas son idée. Plutôt que de la laisser esclave dans Excel ou que Dieu sache ce qui fait ces choses, je lui ai proposé de les faire en R; mapper un diagramme en barres sur des coordonnées polaires pour créer une cible est un jeu d'enfant dans ggplot2
.
Toutefois, je rencontre un problème: les données sont déjà agrégées, ainsi l'exemple de Hadley, ici ne fonctionne pas pour moi. Je pourrais développer le décompte pour en faire un facteur, mais j’ai le sentiment qu’il existe un meilleur moyen - de dire au geom_bar comment lire les données.
Les données ressemblent à ceci:
Zoo Animals Bears Polar Bears
1 Omaha 50 10 3
Je vais faire un complot pour chaque zoo - mais je peux gérer cette partie.
et voici son 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")
Remarque: il est significatif que les animaux > = ours > = ours polaires. En outre, elle est hors de la ville, je ne peux donc pas me contenter de lui fournir les données brutes (de toute façon s'il y a déjà eu un gros fichier).
La solution
Pour le faire sans désagrégation, utilisez stat = "identité"
dans geom_bar
.
Il est utile que le cadre de données contienne des valeurs numériques plutôt que des chaînes de caractères pour commencer:
dat <- data.frame(Zoo = "Omaha",
Animals = 50, Bears = 10, `Polar Bears` = 3)
Nous avons besoin de reshape2 :: melt
pour organiser les données correctement:
library(reshape2)
d3 <- melt(dat,id.var=1)
Créez maintenant le graphique (identique à l'autre réponse):
library(ggplot2)
ggplot(d3, aes(x = variable, y = value)) +
geom_bar(width = 1, colour = "black",stat="identity") +
coord_polar()
Autres conseils
En attendant une meilleure réponse, je me suis dit que je devrais publier la solution (sous-optimale) que vous avez mentionnée. dat
est la structure incluse dans votre question.
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()
Vous pouvez utiliser inverse.rle
pour recréer les données,
dd = list(lengths = unlist(dat[-1]), values = names(dat)[-1])
class(dd) = "rle"
inverse.rle(dd)
Si vous avez plusieurs zoos (rangées), vous pouvez essayer
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))