11

我正在尝试使用这种方法在堆积条形图上放置标签(尽管如果现在有更好的方法,我愿意接受任何方法):

在 ggplot2 中的堆积条形图上显示数据值

这是我的原始情节:

dat <- data.frame(with(mtcars, table(cyl, gear)))

ggplot(dat, aes(x = gear, fill = cyl)) +
    geom_bar(aes(weight=Freq), position="stack") +
    geom_text(position = "stack", aes(x = gear, y = Freq, 
        ymax = 15, label = cyl), size=4)

在此处输入图像描述

这是我在每个填充部分中将标签居中的尝试:

dat2 <- ddply(dat, .(cyl), transform, pos = cumsum(Freq) - 0.5*Freq)

library(plyr)
ggplot(dat2, aes(x = gear, fill = cyl)) +
    geom_bar(aes(weight=Freq), position="stack") +
    geom_text(position = "stack", aes(x = gear, y = pos, 
        ymax = 15, label = cyl), size=4)

在此处输入图像描述

如何将每个填充部分的标签居中?

4

2 回答 2

10

因为我知道我想要的解决方案,但是在保持频率与位置对齐时遇到了麻烦,所以这个有一些无关紧要的ddply动作,但我认为找到组中点的算法值得发布:

group_midpoints = function(g) {
  cumsums = c(0, cumsum(g$Freq))
  diffs = diff(cumsums)
  pos = head(cumsums, -1) + (0.5 * diffs)
  return(data.frame(cyl=g$cyl, pos=pos, Freq=g$Freq))
}

dat3 = ddply(dat, .(gear), group_midpoints)

ggplot(dat3, aes(x = gear, fill = cyl)) +
  geom_bar(aes(weight=Freq), position="stack") +
  geom_text(position = "identity", aes(x = gear, y = pos, ymax = 15, label = cyl), size=4)

在此处输入图像描述

于 2013-09-25T01:41:28.323 回答
-1

我试图做同样的事情。所以我用相同的数据尝试了你的代码,但没有,也许有一个更新改变了一些东西。

有人可以检查代码是否仍然有效吗?

我尝试使用此代码,但enter code here似乎不起作用。

dd <- ggplot_build(p)[[1]][[1]]
## Get the y-values in the middle of bars
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)))
))

## Get the labels
labels <- with(df[df$y!=0,], unlist(split(MaskID, x)))

## Add the text using the new xy-values and labels
p + geom_text(data=dat, aes(x, y), label=labels, angle=90)
于 2020-10-08T14:13:01.823 回答