【问题标题】:Ordering bar plots with ggplot2 according to their size, i.e. numerical value根据大小(即数值)使用 ggplot2 对条形图进行排序
【发布时间】:2012-09-10 16:24:12
【问题描述】:

This question 询问有关根据未汇总表排序条形图的问题。我的情况略有不同。这是我原始数据的一部分:

experiment,pvs_id,src,hrc,mqs,mcs,dmqs,imcs
dna-wm,0,7,9,4.454545454545454,1.4545454545454546,1.4545454545454541,4.3939393939393945
dna-wm,1,7,4,2.909090909090909,1.8181818181818181,0.09090909090909083,3.9090909090909087
dna-wm,2,7,1,4.818181818181818,1.4545454545454546,1.8181818181818183,4.3939393939393945
dna-wm,3,7,8,3.4545454545454546,1.5454545454545454,0.4545454545454546,4.272727272727273
dna-wm,4,7,10,3.8181818181818183,1.9090909090909092,0.8181818181818183,3.7878787878787876
dna-wm,5,7,7,3.909090909090909,1.9090909090909092,0.9090909090909092,3.7878787878787876
dna-wm,6,7,0,4.909090909090909,1.3636363636363635,1.9090909090909092,4.515151515151516
dna-wm,7,7,3,3.909090909090909,1.7272727272727273,0.9090909090909092,4.030303030303029
dna-wm,8,7,11,3.6363636363636362,1.5454545454545454,0.6363636363636362,4.272727272727273

我只需要其中的几个变量,即mqsimcs,按它们的pvs_id分组,所以我创建了一个新表:

m = melt(t, id.var="pvs_id", measure.var=c("mqs","imcs"))

我可以将其绘制为条形图,从中可以看到 MQSIMCS 之间的相关性。

ggplot(m, aes(x=pvs_id, y=value)) 
+ geom_bar(aes(fill=variable), position="dodge", stat="identity")

但是,我希望结果条按 MQS从左到右按降序排列。当然,IMCS 值应该与这些值一起排序。

我怎样才能做到这一点?一般来说,给定任何熔融数据框——这似乎对在 ggplot2 中作图很有用,而且今天是我第一次偶然发现它——我如何指定一个变量的顺序?

【问题讨论】:

    标签: r sorting ggplot2 bar-chart


    【解决方案1】:

    一切尽在掌握

    pvs_id 一个因子并为其提供适当的水平:

    dat$pvs_id <- factor(dat$pvs_id, levels = dat[order(-dat$mqs), 2])
    
    m = melt(dat, id.var="pvs_id", measure.var=c("mqs","imcs"))
    
    ggplot(m, aes(x=pvs_id, y=value))+ 
        geom_bar(aes(fill=variable), position="dodge", stat="identity")
    

    这会产生以下情节:

    编辑: 好吧,因为pvs_id 是数字,所以它以有序的方式处理。好像你有一个因素没有假设顺序。因此,即使您有数字标签 pvs_id 实际上也是一个因素(名义上的)。就dat[order(-dat$mqs), 2] 而言,带有负号的排序函数沿变量mqs 从最大到最小对数据帧进行排序。但是您对pvs_id 变量的顺序感兴趣,因此您索引该列,即第二列。如果你把它撕开,你会看到它给了你:

    > dat[order(-dat$mqs), 2]
    [1] 6 2 0 5 7 4 8 3 1
    

    现在您将其提供给factorlevels 参数,这会根据需要对因子进行排序。

    【讨论】:

    • PS 不会将数据集命名为 t,因为它会覆盖一个非常重要的转置基础安装函数。
    • 其实不然。它可以从函数中分辨出数据集。试试看:t &lt;- 1:5; t(matrix(1:9, nrow = 3))。不过,如果你说t &lt;- function(x) 1:x,你会遇到麻烦。
    • 完美,谢谢。我不是很喜欢这里的命名法,所以我不知道“因素”是什么。并且dat[order(-dat$mqs), 2]mqs 的递减顺序返回pvs_id 值,对吗?这究竟是如何工作的?您介意再解释一下这部分,以便未来的访问者更容易适应吗?
    【解决方案2】:

    使用更新的tidyverse 函数,这变得更加简单明了(或者至少对我来说很容易阅读):

    library(tidyverse)
    
    d %>%
      mutate_at("pvs_id", as.factor) %>%
      mutate(pvs_id = fct_reorder(pvs_id, mqs)) %>%
      gather(variable, value, c(mqs, imcs)) %>% 
      ggplot(aes(x = pvs_id, y = value)) + 
        geom_col(aes(fill = variable), position = position_dodge())
    

    它的作用是:

    • 如果还没有创建一个因子
    • 按照mqs重新排序(你可以使用desc(mqs)进行反向排序)
    • 聚集成单独的行(同melt
    • 绘图为geom_col(与geom_barstat="identity" 相同)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2010-10-30
      相关资源
      最近更新 更多