R ggplot2堆叠条形图,y轴上的百分比,以条为单位

时间:2018-07-06 17:27:54

标签: r ggplot2

我在格式化ggplot2时遇到问题,无法显示堆叠的条形图,其中Y轴上的累积百分比和条形图中的计数。我可以对每种类型绘制一个图(一个绘制在Y轴上的百分比,一个绘制在条形图中的百分比),但不能同时绘制两个图。这是我所拥有的:

group <- c(1,1,1,2,2,2)
ind <- c(1,2,3,1,2,3)
count <- c(98,55,10,147,31,3)
df <- data.frame(group, ind, count)

library(ggplot2)
library(scales)

ggplot(df, aes(y=count, x=factor(group), fill=factor(ind), label=cfreq)) +
geom_bar(stat = "identity") + ylab("Percent Level 1 Classes") +
scale_fill_discrete(name="Level 1\nClasses") +
xlab("Level 2 Groups") +
geom_text(size = 3, position = position_stack(vjust = 0.5))

这将产生以下带有计数但在Y轴上没有百分比的图:

bar plot 1

该图的第二个版本在Y轴上生成百分比,但在条形图中没有计数:

ggplot(df, aes(y=count, x=factor(group), fill=factor(ind))) +
geom_bar(position = "fill", stat = "identity") + 
ylab("Percent Level 1 Classes") +
scale_fill_discrete(name="Level 1\nClasses") +
xlab("Level 2 Groups")

bar plot 2

但是我不能同时做到。我没有浪费空间,而是尝试了“ aes”语句中的“ label = cfreq”,但无济于事-似乎与“ geom_text”选项冲突。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

这似乎可以满足您的要求:

group <- c(1,1,1,2,2,2)
ind <- c(1,2,3,1,2,3)
count <- c(98,55,10,147,31,3)
df <- data.frame(group, ind, count)

library(ggplot2)
library(scales)

ggplot(df, aes(y=count, x=factor(group), fill=factor(ind))) +
  geom_bar(position = "fill", stat = "identity") +
  geom_text(aes(label = count), position = position_fill(vjust = 0.5)) +
  ylab("Percent Level 1 Classes") +
  scale_fill_discrete(name="Level 1\nClasses") +
  xlab("Level 2 Groups")

Stacked labels

我认为默认情况下,位置设置为“ identity”,而“ stack”也不能解决问题,因为标签似乎是在计数的原始比例上,而不是百分比上,因此条形缩小了下降到情节底部的一条线。使用vjust = 0.5可使标签居中,因为默认值是1,这会将它们放在条形图的顶部。