La forma más simple de hacer barras de barras agrupadas

Tengo el siguiente dataframe:

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 

Intento hacer un gráfico de barras agrupado, especie como altura y luego 2 colores para catergory.

Publicaría una imagen de lo que tengo, pero no tengo suficientes puntos de reputación … pero aquí está mi código:

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

Ahora lo que quiero es no tener que etiquetar las dos barras dos veces y agruparlas, he intentado cambiar el valor del espacio para todo tipo de cosas y no parece separar las barras. ¿Alguien puede decirme lo que estoy haciendo mal?

con 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") 

Gráfico de barras

No es una solución de barplot sino que usa lattice y barchart :

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

enter image description here

Hay varias formas de hacer plots en R; lattice es uno de ellos, y siempre una solución razonable, +1 a @agstudy. Si desea hacer esto en gráficos base, podría intentar lo siguiente:

 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=T, 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

Esto es lo que hice: Creé una matriz con dos columnas (porque sus datos estaban en columnas) donde las columnas eran las especies que cuentan para Decline y Improved . Luego hice esas categorías los nombres de columna. También hice los nombres de la Reason . La función barplot() puede operar sobre esta matriz, pero quiere los datos en filas en lugar de columnas, así que le di una versión transpuesta de la matriz. Por último, barplot() algunos de sus argumentos en su llamada a la función barplot() que ya no eran necesarios. En otras palabras, el problema era que sus datos no estaban configurados de la manera que barplot() quiere para su salida prevista.

Escribí un contenedor de funciones llamado bar() para que barplot() hiciera lo que está intentando hacer aquí, ya que necesito hacer cosas similares con frecuencia. El enlace de Github a la función está aquí . Después de copiar y pegar en R, lo haces

 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. 

La única ventaja es que pondrá una leyenda en el diagtwig usando los nombres de los niveles en su variable categórica (por ejemplo, “Declinación” y “Mejorado”). Si cada uno de sus niveles tiene múltiples observaciones, también puede trazar las barras de error (que no se aplica aquí, por errbar=FALSE tanto, errbar=FALSE

enter image description here