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?
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")
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)))
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")
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 Reason
s 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.
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