首页 文章

分组条形图最简单的方法

提问于
浏览
28

我有以下数据帧:

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种颜色的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")

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

4 回答

  • 21

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

    Bar Chart

  • 28

    不是 barplot 解决方案,而是使用 latticebarchart

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

    enter image description here

  • 16

    有几种方法可以在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=T, ylab="number of species", 
              cex.names=0.8, las=2, ylim=c(0,120), col=c("darkblue","red"))
      box(bty="l")
    

    enter image description here

    这就是我所做的:我创建了一个包含两列的矩阵(因为您的数据在列中),其中列是 DeclineImproved 的物种计数 . 然后我将这些类别作为列名 . 我也把 Reason 做成了行名 . barplot() 函数可以在这个矩阵上运行,但是希望数据是行而不是列,所以我给它提供了一个转置版本的矩阵 . 最后,我删除了一些不再需要的 barplot() 函数调用的参数 . 换句话说,问题是您的数据没有像 barplot() 想要的那样设置 .

  • 40

    我为 barplot() 写了一个名为 bar() 的函数包装器来做你想做的事情,因为我需要经常做类似的事情 . 该函数的Github链接是here . 复制并粘贴到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.
    

    一个便利是它将使用分类变量中的级别名称(例如,"Decline"和"Improved")在图表上添加图例 . 如果您的每个级别都有多个观察值,它也可以绘制误差线(这里不适用,因此 errbar=FALSE

    enter image description here

相关问题