【问题标题】:Simplest way to do grouped barplot进行分组条形图的最简单方法
【发布时间】:2013-07-17 06:22:30
【问题描述】:

我有以下数据框:

 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 bar-chart


    【解决方案1】:

    在 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 的物种计数。然后我将这些类别设为列名。我还将Reasons 设为行名。 barplot() 函数可以对这个矩阵进行操作,但需要 rows 中的数据而不是列中的数据,所以我给它提供了一个 transposed 版本的矩阵。最后,我删除了您对 barplot() 函数调用的一些不再需要的参数。 换句话说,问题在于你的数据没有按照你的方式设置 barplot() 想要你想要的输出。

    【讨论】:

    • 谢谢。使用基本图形的一个优点是您可以使用 par() 或 layout() 组合多个基本绘图。
    【解决方案2】:

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

    【讨论】:

    • 非常有用,谢谢!
    • @Jack Ryan 应该是 ggplot(Animals, aes(factor(Reason), Species 还是 ggplot(Animals, aes(factor(Reason), as.factor(Species) ?因为在我的情况下,我拥有相同格式的数据,但它创建了一个堆栈栏而不是组栏。
    • 正如 RKR 指出的那样,ggplot 在绘制分组条形图时需要因子。我也有类似的数据,但由于其他要求,我没有将列作为因素读取,并且在确定此要求之前我无法绘制分组条形图。
    【解决方案3】:

    我为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. 
    

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

    【讨论】:

    • 在使用包装器时,我在哪里定义用于错误栏的列?谢谢
    • 我想知道,有没有办法堆叠这个直方图?我想创建一个三面板图,前两个带有常规分组条形图,因为此功能允许,然后第三个带有每个条分成两部分。 1/2
    • 2/2 -- 如果我有 bar(dv = numoutspc1, factor = c(Sex, Population), dataframe = WALL, errbar = FALSE, col=c("red","purple" ,"blue"), ylab=c("Number of outliers associated with each PCaxis"), ylim=c(0, 240)) ###但我也希望每个条形图中都有 numoutsPC2。
    【解决方案4】:

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

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

    【讨论】:

    • 这里的颜色图例怎么样?
    • @maciek 您可以在barchart 函数中使用auto.key = T 来获得图例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多