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

ggplot2 条形图中的顺序条形图

André Lehto 2月前

236 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 除非注明,本帖由André Lehto在本站《sorting》版块原创发布, 转载请注明出处!
最新回复 (0)
  • Meek 2月前 0 只看Ta
    引用 2

    你可以简单地使用这个代码:

    ggplot(yourdatasetname, aes(Position, fill = Name)) + 
         geom_bar(col = "black", size = 2)
    

    enter image description here

  • M.A. 2月前 0 只看Ta
    引用 3

    如果您不想使用 ggplot2 ,也可以 ggpubr 一个非常有用的 ggbarplot 函数参数。您可以按 \'desc\' 和 \'asc\' 对条形图进行排序, sort.val 如下所示:

    library(dplyr)
    library(ggpubr)
    # desc
    df %>%
      count(Position) %>%
      ggbarplot(x = "Position", 
                y = "n",
                sort.val = "desc")
    

    # asc
    df %>%
      count(Position) %>%
      ggbarplot(x = "Position", 
                y = "n",
                sort.val = "asc")
    

    Created on 2022-08-14 by the reprex 包 (v2.0.1)

    如您所见,对条形图进行排序非常简单。如果条形图已分组,也可以这样做。查看上面的链接以获取一些有用的示例。

  • library(ggplot2)
    library(magrittr)
    
    dd <- tibble::tribble(
        ~Name,    ~Position,
      "James", "Goalkeeper",
      "Frank", "Goalkeeper",
       "Jean",    "Defense",
       "John",    "Defense",
      "Steve",    "Defense",
        "Tim",    "Striker"
      )
    
    
    dd %>% ggplot(aes(x = forcats::fct_infreq(Position))) + geom_bar()
    

    Created on 2022-08-30 with reprex v2.0.2

  • 我不确定为什么提到这个解决方案,因为您的第一个示例与 ggplot(theTable, aes(x = Position)) + geom_bar() 完全等同(即,使用当前版本的 ggplot2 3.3.2,char 变量的顺序是按字母顺序排列的,或者如果它是有序因子,则遵循因子顺序)。或者也许曾经存在差异?

  • 因为我们只关注 单个变量 (“位置”)的分布,而不是 两个变量 ,所以 直方图 可能是更合适的图形。ggplot 具有 geom_histogram() ,可以简化操作:

    ggplot(theTable, aes(x = Position)) + geom_histogram(stat="count")
    

    enter image description here

    使用 geom_histogram():

    我认为 geom_histogram( ) 有点古怪,因为它对连续数据和离散数据的处理方式不同。

    对于 连续数据 ,您只需使用 geom_histogram() 。例如,如果我们添加一个数字向量“Score”...

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

    并在“Score”变量上使用 geom_histogram()......

    ggplot(theTable, aes(x = Score)) + geom_histogram()
    

    enter image description here

    对于 离散数据 ,我们必须指定一个由美学计算的统计数据,以使用以下内容给出条形高度的 y 值 stat = "count"

     ggplot(theTable, aes(x = Position)) + geom_histogram(stat = "count")
    

    注意: 奇怪且令人困惑的是,您也可以将其 stat = "count" 用于连续数据,而且我认为它提供了更美观的图表。

    ggplot(theTable, aes(x = Score)) + geom_histogram(stat = "count")
    

    enter image description here

    编辑 :针对 DebanjanB 的有益建议的扩展答案。

  • Ekow 2月前 0 只看Ta
    引用 7

    我发现 ggplot2 没有提供“自动”解决方案非常烦人。这就是我 bar_chart() ggcharts .

    ggcharts::bar_chart(theTable, Position)
    

    enter image description here

    默认情况下 bar_chart() 对条形图进行排序并显示水平图。要更改该设置 horizontal = FALSE 。此外, bar_chart() 消除了条形图和轴之间难看的“间隙”。

  • 我同意 zach 的观点,在 dplyr 中计数是最好的解决方案。我发现这是最短的版本:

    dplyr::count(theTable, Position) %>%
              arrange(-n) %>%
              mutate(Position = factor(Position, Position)) %>%
              ggplot(aes(x=Position, y=n)) + geom_bar(stat="identity")
    

    这也将比预先重新排序因子水平要快得多,因为计数是在 dplyr 中完成的,而不是在 ggplot 中或使用 table .

  • 如果图表列来自数字变量(如下面的数据框中所示),则可以使用更简单的解决方案:

    ggplot(df, aes(x = reorder(Colors, -Qty, sum), y = Qty)) 
    + geom_bar(stat = "identity")  
    

    排序变量 (-Qty) 前的减号控制排序方向(升序/降序)

    以下是一些用于测试的数据:

    df <- data.frame(Colors = c("Green","Yellow","Blue","Red","Yellow","Blue"),  
                     Qty = c(7,4,5,1,3,6)
                    )
    
    **Sample data:**
      Colors Qty
    1  Green   7
    2 Yellow   4
    3   Blue   5
    4    Red   1
    5 Yellow   3
    6   Blue   6
    

    当我找到这个帖子时,这就是我所寻找的答案。希望它对其他人有用。

  • @Gavin - 也许我误解了 Prasad 的原始代码(我这台机器上没有 R 可以测试……)但看起来他正在根据频率重新排序类别,重新排序很擅长做这件事。我同意这个问题需要更复杂的东西。抱歉造成混淆。

  • 好的,with(theTable, reorder(Position, as.character(Position), function(x) sum(duplicated(x)))) 是一种方法,另一种方法 with(theTable, reorder(Position, as.character(Position), function(x) as.numeric(table(x)))) 但这些同样复杂......

  • @Chase 在这种情况下,您建议如何使用 reorder()?需要重新排序的因素需要通过其自身的某个函数进行重新排序,而我很难找到一个好的方法来实现这一点。

  • 我没有完全解析你的代码,但我很确定统计库中的 reorder() 可以完成相同的任务。

  • 您只需要将 Position 列指定为 有序因子, 其中级别按其计数排序:

    theTable <- transform( theTable,
           Position = ordered(Position, levels = names( sort(-table(Position)))))
    

    (请注意,会 table(Position) 产生该列的频率计数 Position 。)

    然后,您的 ggplot 函数将按计数的递减顺序显示条形图。我不知道是否有一个选项可以 geom_bar 执行此操作,而不必明确创建有序因子。

  • m_x 2月前 0 只看Ta
    引用 15

    \'fct_infreq(Position)\' 这个小东西却能发挥如此大的作用,谢谢!!

  • 除了 forcats::fct_infreq @HolgerBrandl 提到的之外,还有 forcats::fct_rev ,它会反转因子顺序。

    theTable <- data.frame(
        Position= 
            c("Zoalkeeper", "Zoalkeeper", "Defense",
              "Defense", "Defense", "Striker"),
        Name=c("James", "Frank","Jean",
               "Steve","John", "Tim"))
    
    p1 <- ggplot(theTable, aes(x = Position)) + geom_bar()
    p2 <- ggplot(theTable, aes(x = fct_infreq(Position))) + geom_bar()
    p3 <- ggplot(theTable, aes(x = fct_rev(fct_infreq(Position)))) + geom_bar()
    
    gridExtra::grid.arrange(p1, p2, p3, nrow=3)             
    

    enter image description here

  • 一个简单的基于 dplyr 的因素重新排序可以解决这个问题:

    library(dplyr)
    
    #reorder the table and reset the factor to that ordering
    theTable %>%
      group_by(Position) %>%                              # calculate the counts
      summarize(counts = n()) %>%
      arrange(-counts) %>%                                # sort by counts
      mutate(Position = factor(Position, Position)) %>%   # reset factor
      ggplot(aes(x=Position, y=counts)) +                 # plot 
        geom_bar(stat="identity")                         # plot histogram
    
  • 另一种方法是使用 reorder 对因子的级别进行排序。根据计数按升序 (n) 或降序 (-n) 排序。与使用 fct_reorder 中的 forcats

    降序

    df %>%
      count(Position) %>%
      ggplot(aes(x = reorder(Position, -n), y = n)) +
      geom_bar(stat = 'identity') +
      xlab("Position")
    

    enter image description here

    升序

    df %>%
      count(Position) %>%
      ggplot(aes(x = reorder(Position, n), y = n)) +
      geom_bar(stat = 'identity') +
      xlab("Position")
    

    enter image description here

    数据框:

    df <- structure(list(Position = structure(c(3L, 3L, 1L, 1L, 1L, 2L), .Label = c("Defense", 
    "Striker", "Zoalkeeper"), class = "factor"), Name = structure(c(2L, 
    1L, 3L, 5L, 4L, 6L), .Label = c("Frank", "James", "Jean", "John", 
    "Steve", "Tim"), class = "factor")), class = "data.frame", row.names = c(NA, 
    -6L))
    
  • 引用 19

    我认为最好的解决方案是 forcats 和 dplyr 以及 tidyverse 包。

  • 就像 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

返回
作者最近主题: