37

我有以下数据框:

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

现在我想要的是不必两次标记两个条并将它们分组,我尝试将空间值更改为各种东西,它似乎并没有将条分开。谁能告诉我我做错了什么?

4

4 回答 4

50

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

条形图

于 2013-07-18T14:46:49.493 回答
31

不是barplot解决方案,而是使用lattice and barchart

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

在此处输入图像描述

于 2013-07-18T10:54:31.030 回答
27

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

在此处输入图像描述

这是我所做的:我创建了一个包含两列的矩阵(因为您的数据在列中),其中列是Decline和 for的物种计数Improved。然后我将这些类别设为列名。我还将Reasons 设为行名。该barplot()函数可以对这个矩阵进行操作,但需要而不是列中的数据,所以我给它提供了矩阵的转置版本。最后,我删除了一些barplot()不再需要的函数调用参数。 换句话说,问题在于您的数据没有按照 barplot() 预期输出的方式设置。

于 2013-07-18T13:19:39.427 回答
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. 

一个方便的地方是它会使用分类变量中的级别名称(例如,“下降”和“改进”)在图上放置一个图例。如果您的每个级别都有多个观察值,它还可以绘制误差线(此处不适用,因此errbar=FALSE

在此处输入图像描述

于 2013-07-18T13:19:20.550 回答