使用ggplot2对每个因素中的条形图进行排序

9
我正在使用ggplot创建这个“条形图”,但我希望能够重新排列每个类别中的条形,使最高的条形在顶部。简而言之,希望每个类别内的条形按从高到低的顺序排列。
以下是我的代码 - 欢迎任何提示 - 谢谢
library("ggplot2")
d <- read.csv('http://db.tt/EOtR3uh', header = F)

d$V4 <- factor(d$V2, levels=d$V2)
base_size <- 11
ggplot(d, aes(d$V4, -log10(d$V3), fill=d$V1)) +
geom_bar(stat="identity") +
coord_flip() +
labs(y = "-log10(Pvalues)",x = "",fill="") +
theme_grey(base_size = base_size) +
scale_x_discrete(expand = c(0, 0))

enter image description here

3个回答

4
只需要按照您的级别进行排序即可。
d <- read.csv('http://db.tt/EOtR3uh', header = F, stringsAsFactors=FALSE)
lvls <- d$V2[order(d$V1,-d$V3)]
d$V4 <- factor(d$V2, levels=lvls)

ggplot2


好的回答,但是按照我的理解,提问者要求在类别内部进行排序,并且将高值排在前面,所以应该使用 order(d$v1,-d$v3) - James
确实 - 我希望订单在每个类别内部! - Benoit B.
我感觉似曾相识?这不是之前已经问过并且推荐使用ordered(),而factor()也完全可以吗?重要的不是ordered()的有序性,而是正确排序因子的级别。在这里,reorder()很有用。按组然后按响应排序级别就足以使因子起作用。 - Gavin Simpson
1
使用 plyr::desc- 稍微更通用,因为它也适用于因子。 - hadley

2

实现相同目标的另一种方法

require(ggplot2)
d = arrange(d, V1, -V3)                             # arrange d by V1 and -V3
d = transform(d, V2 = factor(V2, as.character(V2))) # order V2 as in d

qplot(V2, -log10(V3), fill = V1, geom = 'bar', data = d) + 
  coord_flip() 

0

我在这里回答我的问题:

需要更改的行是:

d$V4 <- ordered(d$V2, levels=d$V2[order(d$V1,-d$V3)])

完整代码:

library("ggplot2")
d <- read.csv('http://db.tt/EOtR3uh', header = F)

d$V4 <- ordered(d$V2, levels=d$V2[order(d$V1,-d$V3)])
base_size <- 11
ggplot(d, aes(d$V4, -log10(d$V3), fill=d$V1)) +
geom_bar(stat="identity") +
coord_flip() +
labs(y = "-log10(Pvalues)",x = "",fill="") +
theme_grey(base_size = base_size) +
scale_x_discrete(expand = c(0, 0))

enter image description here


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