(ggplot2 update?)带有百分比标签的堆积条形图

时间:2017-08-02 19:10:54

标签: r ggplot2 bar-chart

我正在复制一些所有剧本(一年前编码)并发现我不再获得相同的剧情。我使用相同的数据集和相同的代码;唯一的区别是我的R安装版本和ggplot2 ---所以我假设这是问题所在。

让我告诉你一些愚蠢的阴谋的问题。当生成带有百分比标签的堆积条形图时,我会做类似的事情:

ess2 <- ddply(ess, .(essround2), function(.){
res <- cumsum(prop.table(table(factor(.$contplt2))))
  res2 <- prop.table(table(factor(.$contplt2)))
  data.frame(lab=names(res), y=c(res), res2=res2, pos=cumsum(res2)-0.5*res2)
})

ggplot(ess[ess$contplt2!="NA",], aes(x=essround2))+
  geom_bar(aes(fill=contplt2), position="fill")+
  geom_text(data=ess2[ess2$lab!="NA",],
            aes(label=round(res2.Freq, 2), x=essround2, y=pos.Freq))+
  labs(x="ESS Round", y="Percent")+
  scale_x_discrete(breaks=c("R1", "R2", "R3", "R4", "R5", "R6"),
                   labels=c("2002", "2004", "2006", "2008", "2010", "2012"))+
  ggtitle("Contacted politicians")+
  scale_fill_manual(name="Contacted politician", values=c("#31a354", "#a1d99b"))

结果如下:

Stacked barplot#1

就像今天一样,如果我使用完全相同的数据集尝试完全相同的代码,我会得到以下图:

Stacked barplot#2

正如您所看到的那样,标签没有正确放置在条形图上,并且颜色反转使得图表的读取变得笨拙(好像堆积的条形图已经不够笨拙)。

很抱歉没有给你可重复的代码,但我相信我的问题只是我没有更新我的代码,因为ggplot2开发了(或者可能是问题?)如果你能在我的代码中发现可能正在生成的“旧”的东西第二个,不稳定的阴谋,我将非常感激并乐意从那里进行调查。

感谢!!!

编辑:由于评论中的建议,图中的百分比是不同的,因为我使用了不同的国家(但相同的代码和相同的数据集)。我使用不同版本的R和ggplot2生成完全相同的绘图,您可以看到问题仍然存在:Stacked barplot#3

1 个答案:

答案 0 :(得分:0)

在生成contplt2之前和之后,尝试将ess2的标签切换两次 希望它可以帮到你。

# Here I try to reproduce your dataset
ess <- data.frame(
essround2 = c(
c(rep(2002,76),rep(2002,100-76)),
c(rep(2004,78),rep(2004,100-78)),
c(rep(2006,81),rep(2006,100-81)),
c(rep(2008,79),rep(2008,100-79)),
c(rep(2010,79),rep(2010,100-79)),
c(rep(2012,82),rep(2012,100-82))
),
contplt2 = c(
c(rep("No",76),rep("Yes",100-76)),
c(rep("No",78),rep("Yes",100-78)),
c(rep("No",81),rep("Yes",100-81)),
c(rep("No",79),rep("Yes",100-79)),
c(rep("No",79),rep("Yes",100-79)),
c(rep("No",82),rep("Yes",100-82))
)
)

# First switch of contplt2 levels
ess$contplt2 <- factor(ess$contplt2, levels=levels(ess$contplt2)[c(2,1)])

library(plyr)
library(ggplot2)
ess2 <- ddply(ess, .(essround2), function(.){
res <- cumsum(prop.table(table(factor(.$contplt2))))
  res2 <- prop.table(table(factor(.$contplt2)))
  data.frame(lab=names(res), y=c(res), res2=res2, pos=cumsum(res2)-0.5*res2)
})

# Second switch of contplt2 levels
ess$contplt2 <- factor(ess$contplt2, levels=levels(ess$contplt2)[c(2,1)])


ggplot(ess[ess$contplt2!="NA",], aes(x=essround2))+
  geom_bar(aes(fill=contplt2), position="fill")+
  geom_text(data=ess2[ess2$lab!="NA",],
            aes(label=round(res2.Freq, 2), x=essround2, y=pos.Freq))+
  labs(x="ESS Round", y="Percent")+
  scale_x_discrete(breaks=c("R1", "R2", "R3", "R4", "R5", "R6"),
                   labels=c("2002", "2004", "2006", "2008", "2010", "2012"))+
  ggtitle("Contacted politicians")+
  scale_fill_manual(name="Contacted politician", values=c("#a1d99b", "#31a354"))

enter image description here