8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

ggplot2 条形图中的顺序条形图

Abdul Qadeer 1月前

40 0

我正在尝试制作一个条形图,其中最大的条形最靠近 y 轴,最短的条形最远。所以这有点像表格,我有姓名位置 1 James

我正在尝试制作一个条形图,其中最大的条形最靠近 y 轴,最短的条形最远。所以这有点像我的表格

    Name   Position
1   James  Goalkeeper
2   Frank  Goalkeeper
3   Jean   Defense
4   Steve  Defense
5   John   Defense
6   Tim    Striker

因此,我尝试构建一个条形图,以显示按位置划分的球员人数

p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)

但图表首先显示守门员栏,然后是防守栏,最后是前锋栏。我希望图表按顺序排列,以便防守栏最靠近 y 轴,然后是守门员栏,最后是前锋栏。谢谢

帖子版权声明 1、本帖标题:ggplot2 条形图中的顺序条形图
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Abdul Qadeer在本站《sorting》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @MattO'Brien 我觉得难以置信这不是通过一个简单的命令就能完成的。

  • @Euler_Salter 谢谢你的澄清,我为这样对你表示诚挚的歉意。我已经删除了我原来的评论。

  • 排序的关键是按照您想要的顺序设置因子的级别。有序因子不是必需的;有序因子中的额外信息不是必需的,如果这些数据用于任何统计模型,可能会导致错误的参数化——多项式对比不适用于此类名义数据。

    ## set the levels in order we want
    theTable <- within(theTable, 
                       Position <- factor(Position, 
                                          levels=names(sort(table(Position), 
                                                            decreasing=TRUE))))
    ## plot
    ggplot(theTable,aes(x=Position))+geom_bar(binwidth=1)
    

    barplot figure

    从最一般意义上讲,我们只需将因子级别设置为所需的顺序即可。如果未指定,则因子的级别将按字母顺序排序。您还可以在对因子的调用中指定级别顺序,如上所示,其他方式也是可行的。

    theTable$Position <- factor(theTable$Position, levels = c(...))
    
  • @Gavin: 2 个简化:由于您已经在使用,因此无需使用 theTable$Position,您只需执行 sort(-table(...)) 即可按降序排列。

  • @Prasad 前者是测试遗留下来的,所以谢谢你指出这一点。至于后者,我更喜欢明确要求反向排序,而不是你使用的 - ,因为从 reducing = TRUE 中获取意图比在其余所有代码中注意到 - 要容易得多。

  • @GavinSimpson;我认为 levels(theTable$Position) <- c(...) 的部分会导致不良行为,即数据框的实际条目被重新排序,而不仅仅是因子的级别。请参阅此问题。也许您应该修改或删除这些行?

  • 非常同意 Anton 的观点。我刚刚看到这个问题,然后开始研究他们从哪里得到了使用级别的错误建议<-。我将至少暂时删除该部分。

  • @Anton 感谢您的建议(也感谢 Gregor 的编辑);我今天绝不会通过 levels<-() 来做这件事。这是 8 年前的事情了,我不记得当时情况是否不同,或者我是否完全错了,但无论如何,它都是错误的,应该被删除!谢谢!

  • 引用 10

    @GavinSimpson: reorder 是一个强大而有效的解决方案:

    ggplot(theTable,
           aes(x=reorder(Position,Position,
                         function(x)-length(x)))) +
           geom_bar()
    
  • 确实 +1,尤其是在这种情况下,我们可以利用数字来利用逻辑顺序。如果我们考虑类别的任意排序,并且我们不想按字母顺序排列,那么直接指定级别就同样容易(更容易?),如图所示。

  • 太好了,刚刚注意到你可以做得更简洁一些,如果你想要的只是按长度函数排序,升序就可以了,这是我经常想做的事情:ggplot(theTable,aes(x=reorder(Position,Position,length))+geom_bar()

  • 用于 scale_x_discrete (limits = ...) 指定条形的顺序。

    positions <- c("Goalkeeper", "Defense", "Striker")
    p <- ggplot(theTable, aes(x = Position)) + scale_x_discrete(limits = positions)
    
  • Rose 1月前 0 只看Ta
    引用 14

    您的解决方案最适合我的情况,因为我想编程绘制 x 为 data.frame 中变量表示的任意列。其他建议更难通过涉及变量的表达式来表达 x 顺序的排列。谢谢!如果有兴趣,我可以使用您的建议分享我的解决方案。还有一个问题,添加 scale_x_discrete(limits = ...),我发现图表右侧有与条形图一样宽的空白区域。我该如何摆脱空白区域?因为它没有任何用处。

  • QIBIN:哇...这里的其他答案都有效,但您的答案似乎不仅是最简洁、最优雅的,而且从 gg​​plot 框架内部思考时也是最明显的。谢谢。

  • 引用 16

    当我尝试此解决方案时,它没有在我的数据上绘制 NA 图表。有没有办法使用此解决方案并让其绘制 NA 图表?

  • 引用 17

    我认为已经提供的解决方案过于冗长。使用 ggplot 绘制频率排序条形图的更简洁方法是

    ggplot(theTable, aes(x=reorder(Position, -table(Position)[Position]))) + geom_bar()
    

    它与 Alex Brown 建议的类似,但更简短一些,并且不需要匿名函数定义。

    更新

    我认为我以前的解决方案当时很好,但现在我宁愿使用 forcats::fct_infreq 按频率对因子水平进行排序的解决方案:

    require(forcats)
    
    ggplot(theTable, aes(fct_infreq(Position))) + geom_bar()
    
  • 引用 18

    我不明白 reorder 函数的第二个参数以及它的作用。您能解释一下发生了什么吗?

  • @user3282777 您是否尝试过文档 stat.ethz.ch/R-manual/R-devel/library/stats/html/… ?

  • 就像 reorder() Alex Brown 的回答一样,我们也可以使用 forcats::fct_reorder() 。它基本上会根据应用指定函数后的第二个参数中的值对第一个参数中指定的因子进行排序(默认值 = 中位数,我们在这里使用它,因为每个因子级别只有一个值)。

    遗憾的是,在 OP 的问题中,所需的顺序也是按字母顺序排列的,因为这是创建因素时的默认排序顺序,因此会隐藏此函数的实际作用。为了更清楚起见,我将用“Zoalkeeper”替换“Goalkeeper”。

    library(tidyverse)
    library(forcats)
    
    theTable <- data.frame(
                    Name = c('James', 'Frank', 'Jean', 'Steve', 'John', 'Tim'),
                    Position = c('Zoalkeeper', 'Zoalkeeper', 'Defense',
                                 'Defense', 'Defense', 'Striker'))
    
    theTable %>%
        count(Position) %>%
        mutate(Position = fct_reorder(Position, n, .desc = TRUE)) %>%
        ggplot(aes(x = Position, y = n)) + geom_bar(stat = 'identity')
    

    enter image description here

返回
作者最近主题: