Tenho o seguinte quadro de dados:
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
I'estou a tentar fazer um gráfico de barras agrupado, espécies como altura e depois 2 cores para catergory.
Eu publicaria uma imagem do que eu'tenho, mas eu não'não tenho pontos de reputação suficientes... mas aqui está o meu 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")
Agora o que eu quero, é não ter de rotular as duas barras duas vezes e agrupá-las separadamente, I'tentei mudar o valor do espaço para todo o tipo de coisas e parece que não'não parece mover as barras separadamente. Alguém me pode dizer o que eu'estou a fazer mal?
Há várias formas de fazer parcelas em R; lattice
é uma delas, e sempre uma solução razoável, +1 para @agstudy. Se quiser fazer isto nos gráficos de base, pode tentar o seguinte:
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")
Aqui's o que eu fiz: Criei uma matriz com duas colunas (porque os seus dados estavam em colunas) em que as colunas eram as espécies que contavam para "Declinar" e para "Melhorado". Depois fiz essas categorias com os nomes das colunas. Também fiz as "Razões" para os nomes das linhas. A função barplot()
pode operar sobre esta matriz, mas quer os dados em linhas em vez de colunas, por isso alimentei-os com uma versão transposta da matriz. Finalmente, apaguei alguns dos seus argumentos para a sua barplot()
chamada de função que já não eram necessários. Por outras palavras, o problema era que os seus dados não eram't configurou a forma barplot()
quere para a sua saída pretendida.
Escrevi um invólucro de função chamado bar()
para barplot()
para fazer o que está a tentar fazer aqui, uma vez que preciso de fazer coisas semelhantes frequentemente. A ligação de Github para a função é aqui. Depois de a copiar e colar em R, faz
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.
A única conveniência é colocar uma lenda na parcela usando os nomes dos níveis na sua variável categórica (por exemplo, "Decline" e "Improved"). Se cada um dos seus níveis tiver múltiplas observações, pode também traçar as barras de erro (o que não se aplica aqui, daí errbar=FALSE
.