在ggplot2中的堆积条形图上的文本标签(不按字母顺序排列)

时间:2015-07-29 16:38:19

标签: r ggplot2 format bar-chart text-formatting

我在前一篇文章中向此提出了类似的问题,当所有x轴刻度按字母顺序排序时,此代码有效。条形图的颜色基于' MaskID'。但是,当我改变x轴刻度的顺序时,' MaskID'我想要在堆积条形图上的文本标签不会根据它们相应的颜色而改变。

easy_install -f http://biopython.org/DIST/ biopython

以下是我的数据格式化的基本示例:

p <- ggplot(df, aes(x, y))
p <- p + xlab("xlabel")
p <- p + ylab("ylabel")
p <- p + ggtitle("ylabel vs xlabel")
p <- p + geom_bar(stat="identity", aes(fill=MaskID))
p <- p + theme(axis.text.x = element_text(angle=90, vjust=-0.005, hjust=1))
df$x <- as.character(df$x)
dd <- ggplot_build(p)[[1]][[1]]
xy <- unique(dd[dd$y != 0, c("x", "y")])
dat <- with(xy, data.frame(
    x=x,
    y=unlist(sapply(split(y, x), function(z) diff(c(0, z))/2 + head(c(0, z), -1)))
))
labels <- with(df[df$y!=0,], unlist(split(MaskID, x)))
p <- p + geom_text(data=dat, aes(x, y), label=labels, angle=90)

这是一个示例图表(由我之前提问的 @nongkrong 发布): enter image description here

让我们说从Name1到Name5的字母顺序不是我的刻度,我希望我的刻度可以是任意顺序。 示例:Name2,Name1,Name4,Name3,Name5

更改刻度顺序(对于更大的数据集),如果订单不是按字母顺序排列,您将如何使文本标签居中?

1 个答案:

答案 0 :(得分:1)

这应该只是在获取标签之前重新排序数据。试试这个,

## Reorder bars as in the example
df$x <- factor(df$x, levels=paste0("Name", c(2:1,4:3,5)))

## This is all the same
p <- ggplot(df, aes(x, y))
p <- p + xlab("xlabel")
p <- p + ylab("ylabel")
p <- p + ggtitle("ylabel vs xlabel")
p <- p + geom_bar(stat="identity", aes(fill=MaskID))
p <- p + theme(axis.text.x = element_text(angle=90, vjust=-0.005, hjust=1))
dd <- ggplot_build(p)[[1]][[1]]

## *** Remove the part about converting to character ***

## The same
xy <- unique(dd[dd$y != 0, c("x", "y")])
dat <- with(xy, data.frame(
    x=x,
    y=unlist(sapply(split(y, x), function(z) diff(c(0, z))/2 + head(c(0, z), -1)))
))

## Order by factor
df <- df[order(df$x), ]
labels <- with(df[df$y!=0,], unlist(split(as.character(MaskID), x)))

p <- p + geom_text(data=dat, aes(x, y), label=labels, angle=90)
p

enter image description here