我有以下数据帧:
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
Run Code Online (Sandbox Code Playgroud)
我正在尝试制作一个分组的条形图,物种作为高度,然后是2种颜色的catergory.
我会发布一张我所拥有的图像,但我没有足够的声望点...但这是我的代码:
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")
Run Code Online (Sandbox Code Playgroud)
现在我想要的是,不必将两个条形标记两次并将它们分开,我已经尝试将空间值更改为各种各样的东西,它似乎没有将条形移开.谁能告诉我我做错了什么?
Jac*_*yan 40
与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")
Run Code Online (Sandbox Code Playgroud)
ags*_*udy 28
不是barplot
解决方案,而是使用lattice
和barchart
:
library(lattice)
barchart(Species~Reason,data=Reasonstats,groups=Catergory,
scales=list(x=list(rot=90,cex=0.8)))
Run Code Online (Sandbox Code Playgroud)
gun*_*ica 24
有几种方法可以在R中进行绘图; lattice
是其中之一,并且始终是一个合理的解决方案,@ agstudy +1.如果要在基本图形中执行此操作,可以尝试以下操作:
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")
Run Code Online (Sandbox Code Playgroud)
这就是我所做的:我创建了一个包含两列的矩阵(因为您的数据在列中),其中列是物种计数Decline
和for Improved
.然后我将这些类别作为列名.我也Reason
把行名称改为了.该barplot()
函数可以在这个矩阵上运行,但是希望数据是行而不是列,所以我给它提供了一个转置版本的矩阵.最后,我删除了一些barplot()
不再需要的函数调用参数. 换句话说,问题是您的数据没有按照 预期输出的方式设置barplot()
.
Ale*_*lex 17
我编写了一个函数包装函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.
Run Code Online (Sandbox Code Playgroud)
一个便利是它将使用分类变量中的级别名称(例如,"拒绝"和"改进")在图上放置图例.如果您的每个级别都有多个观察值,它也可以绘制误差线(这里不适用,因此errbar=FALSE