У меня есть следующий фрейм данных:
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
Я пытаюсь сделать сгруппированную гистограмму, вид как высота, а затем 2 цвета для категории.
Я бы разместил изображение того, что у меня получилось, но у меня недостаточно очков репутации... но вот мой код:
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")
Теперь я хочу, чтобы не нужно было дважды помечать два бара и группировать их друг от друга. Я пробовал менять значение space на всевозможные значения, но это, похоже, не раздвигает бары. Может ли кто-нибудь сказать мне, что я делаю не так?
Не решение barplot
, а использование lattice
и barchart
:
library(lattice)
barchart(Species~Reason,data=Reasonstats,groups=Catergory,
scales=list(x=list(rot=90,cex=0.8)))
В R есть несколько способов построения графиков; lattice
- один из них, и всегда разумное решение, +1 к @agstudy. Если вы хотите сделать это в базовой графике, вы можете попробовать следующее:
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")
Вот что я сделал: Я создал матрицу с двумя столбцами (потому что ваши данные были в столбцах), где столбцы - это количество видов для Decline
и для Improved
. Затем я сделал эти категории именами столбцов. Я также сделал причины
именами строк. Функция barplot()
может работать с этой матрицей, но ей нужны данные в строках, а не в столбцах, поэтому я скормил ей транспонированную версию матрицы. Наконец, я удалил некоторые аргументы в вызове функции barplot()
, которые больше не были нужны. Другими словами, проблема заключалась в том, что ваши данные не были настроены так, как нужно, чтобы barplot()
желал получить желаемый результат.
Я написал функцию-обертку под названием bar()
для barplot()
, чтобы сделать то, что вы пытаетесь сделать здесь, поскольку мне часто приходится делать подобные вещи. Ссылка на функцию на Github находится здесь. Скопировав и вставив ее в R, вы делаете следующее
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.
Единственное удобство заключается в том, что она помещает легенду на график, используя названия уровней вашей категориальной переменной (например, "Упадок" и "Улучшение"). Если каждый из уровней имеет несколько наблюдений, он также может построить столбики ошибок (что здесь не применимо, поэтому errbar=FALSE
).