我正在尝试使用这种方法在堆积条形图上放置标签(但如果现在有一种更好的方法,我会对所有情况持开放态度):
Showing data values on stacked bar chart in 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)
如何将标签置于每个填充部分的中心位置?
答案 0 :(得分: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)
答案 1 :(得分:-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)