我有以下数据框架。
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")
现在我想要的是,不必将两个条形标示两次,并将它们分开分组,我已经尝试将空间值改为各种东西,但似乎没有将条形分开。谁能告诉我我做错了什么?
有几种方法可以在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")
我的做法是这样的。我创建了一个有两列的矩阵(因为你的数据在列中),其中列是 "下降 "和 "提高 "的物种计数。 然后我把这些类别作为列名。 我还把 "原因 "作为行名。 barplot() "函数可以在这个矩阵上操作,但是希望数据是行,而不是列,所以我给它提供了一个转换的矩阵版本。 最后,我删除了你的barplot()
函数调用中的一些不再需要的参数。 换句话说,问题出在你的数据没有按照barplot()
的方式设置,而不是按照你想要的输出。
我为barplot()'写了一个名为
bar()'的函数包装器,用来做你在这里想做的事情,因为我经常需要做类似的事情。该函数的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
)。