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

Était-ce utile?

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))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top