web-dev-qa-db-fra.com

Manière la plus simple de faire un barplot groupé

J'ai le dataframe suivant:

 Catergory        Reason Species
1   Decline       Genuine      24
2  Improved       Genuine      16
3  Improved Misclassified      85
4   Decline Misclassified      41
5   Decline     Taxonomic       2
6  Improved     Taxonomic       7
7   Decline       Unclear      41
8  Improved       Unclear     117

J'essaie de faire un diagramme à barres groupées, les espèces en hauteur et ensuite 2 couleurs pour la catégorie.

Je publierais une image de ce que j'ai, mais je n'ai pas assez de points de réputation ... mais voici mon code:

Reasonstats<-read.csv("bothstats.csv")
Reasonstats2<-as.matrix(Reasonstats[,3])


barplot((Reasonstats2),beside=T,col=c("darkblue","red"),ylab="number of 
species",names.arg=Reasonstats$Reason, cex.names=0.8,las=2,space=c(0,100)
,ylim=c(0,120))
box(bty="l")

Maintenant, ce que je veux, c'est de ne pas avoir à étiqueter les deux barres deux fois et à les regrouper, j'ai essayé de modifier la valeur d'espace pour toutes sortes de choses et cela ne semble pas séparer les barres. Quelqu'un peut-il me dire ce que je fais mal?

29
Dizzy Bean

avec ggplot2:

library(ggplot2)
Animals <- read.table(
  header=TRUE, text='Category        Reason Species
1   Decline       Genuine      24
2  Improved       Genuine      16
3  Improved Misclassified      85
4   Decline Misclassified      41
5   Decline     Taxonomic       2
6  Improved     Taxonomic       7
7   Decline       Unclear      41
8  Improved       Unclear     117')

ggplot(Animals, aes(factor(Reason), Species, fill = Category)) + 
  geom_bar(stat="identity", position = "dodge") + 
  scale_fill_brewer(palette = "Set1")

Bar Chart

40
Jack Ryan

Pas une solution barplot mais en utilisant lattice et barchart:

library(lattice)
barchart(Species~Reason,data=Reasonstats,groups=Catergory, 
         scales=list(x=list(rot=90,cex=0.8)))

enter image description here

28
agstudy

Il y a plusieurs façons de faire des parcelles dans R; lattice est l'un d'entre eux et constitue toujours une solution raisonnable, +1 à @agstudy. Si vous souhaitez effectuer cela dans les graphiques de base, vous pouvez essayer les solutions suivantes:

Reasonstats <- read.table(text="Category         Reason  Species
                                 Decline        Genuine       24
                                Improved        Genuine       16
                                Improved  Misclassified       85
                                 Decline  Misclassified       41
                                 Decline      Taxonomic        2
                                Improved      Taxonomic        7
                                 Decline        Unclear       41
                                Improved        Unclear      117", header=T)

ReasonstatsDec <- Reasonstats[which(Reasonstats$Category=="Decline"),]
ReasonstatsImp <- Reasonstats[which(Reasonstats$Category=="Improved"),]
Reasonstats3   <- cbind(ReasonstatsImp[,3], ReasonstatsDec[,3])
colnames(Reasonstats3) <- c("Improved", "Decline")
rownames(Reasonstats3) <- ReasonstatsImp$Reason

windows()
  barplot(t(Reasonstats3), beside=TRUE, ylab="number of species", 
          cex.names=0.8, las=2, ylim=c(0,120), col=c("darkblue","red"))
  box(bty="l")

enter image description here

Voici ce que j'ai fait: J'ai créé une matrice à deux colonnes (car vos données étaient en colonnes), où les colonnes étaient les nombres d'espèces pour Decline et pour Improved. Ensuite, j'ai fait de ces catégories les noms de colonnes. J'ai aussi fait le Reasons les noms de ligne. La fonction barplot() peut fonctionner sur cette matrice, mais veut les données en rangées plutôt qu'en colonnes, je l'ai donc alimentée avec un version transposée de la matrice. Enfin, j'ai supprimé certains de vos arguments de votre appel à la fonction barplot() qui n'étaient plus nécessaires. En d'autres termes, le problème était que vos données n'étaient pas configurées de la manière barplot() veut pour votre sortie prévue.

23
gung

J'ai écrit un wrapper de fonction appelé bar() pour barplot() afin de faire ce que vous essayez de faire ici, car je dois souvent faire la même chose. Le lien Github vers la fonction est ici . Après avoir copié et collé dans R, vous faites

bar(dv = Species, 
    factors = c(Category, Reason), 
    dataframe = Reasonstats, 
    errbar = FALSE, 
    ylim=c(0, 140))  #I increased the upper y-limit to accommodate the legend. 

Le seul avantage est qu’il ajoutera une légende au graphique en utilisant les noms des niveaux de votre variable catégorielle (par exemple, "Déclin" et "Amélioré"). Si chacun de vos niveaux comporte plusieurs observations, il peut également tracer les barres d'erreur (ce qui ne s'applique pas ici, donc errbar=FALSE

enter image description here

17
Alex