使用ggplot2根据大小排序条形图,即数值。

7

这个问题是关于按未汇总表格的顺序排列条形图的。我有一个略微不同的情况。这是我的原始数据的一部分:

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中绘制图形很有用,今天是我第一次遇到它——如何为一个变量指定顺序?

2个回答

7

关键在于将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]而言,带有负号的order函数沿着变量mqs将数据框从大到小排序。但是,您对pvs_id变量的顺序感兴趣,因此您索引该列,即第二列。如果您分解它,您会看到它给出:

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

现在你可以将其提供给`factor`函数中的`levels`参数,这样就可以按照你想要的顺序对因子进行排序。

请不要将数据集命名为t,因为它会覆盖一个非常重要的基础安装函数,即转置函数。 - Tyler Rinker
2
实际上它并不会混淆数据集和函数。试一下:t <- 1:5; t(matrix(1:9, nrow = 3))。但如果你这样说 t <- function(x) 1:x,那就会出现问题。 - Roman Luštrik
太好了,谢谢。我对这里的术语不是很熟悉,所以我不知道“因素”是什么。而且 dat[order(-dat$mqs), 2] 返回按照 mqs 递减顺序排列的 pvs_id 值,对吗?那个具体是如何工作的呢?您能否再解释一下,以便未来的访问者可以更容易地适应这个方法? - slhck

0

通过使用更新的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" 相同)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接