R - ggplot:选择条形堆栈中出现的标签及其位置

时间:2015-10-02 21:44:27

标签: r ggplot2

目前,我们在发布此问题之前的许多小时内一直在努力解决以下问题。

我们拥有大量与以下类似的数据集:

Income                 Inhabitants              Percent
Below  15000            Below 5000              4.664723
15000 - 3.000           Below 5000              15.743440
30000 - 40000           Below 5000              13.994169
40000 - 50000           Below 5000              12.609329
50000 - 60000           Below 5000              11.333819
60000 - 70000           Below 5000              11.370262
70000 - 100000          Below 5000              14.795918
Above  100000           Below 5000              5.211370
Do not know             Below 5000              10.276968
Below  15000            5000-20000              4.225146
15000 - 3.000           5000-20000              13.157895
30000 - 40000           5000-20000              12.733918
40000 - 50000           5000-20000              11.739766
60000 - 70000           5000-20000              11.315789
70000 - 100000          5000-20000              18.728070
Above  100000           5000-20000              7.880117
Do not know             5000-20000              9.356725
Below  15000            20000-110000            4.013588
15000 - 3.000           20000-110000            11.147458
30000 - 40000           20000-110000            11.927529
40000 - 50000           20000-110000            11.751384
50000 - 60000           20000-110000            9.738299
60000 - 70000           20000-110000            10.367388
70000 - 100000          20000-110000            17.929039
Above  100000           Above 110000            13.198289
Do not know             Above 110000            9.927026
Below  15000            Above 110000            4.662941
15000 - 3.000           Above 110000            10.286413
30000 - 40000           Above 110000            11.054838
40000 - 50000           Above 110000            10.513447
50000 - 60000           Above 110000            9.081383
60000 - 70000           Above 110000            8.539993
70000 - 100000          Above 110000            18.389801
Above  100000           Above 110000            18.040517
Do not know             Above 110000            9.430667`

我们希望制作数据的堆叠条形图,显示区域之间的分布。

这样做了:

dg=ggplot(data=frame, aes(x=Inhabitants, ymax=100, y=Percent,fill=eval(parse(text=special))))       
g=g+geom_bar(stat="identity")
g=g+theme_minimal()
g=g+xlab("") + ylab("")
g=g+theme(axis.text.y=element_blank(),axis.ticks.y=element_blank(),axis.ticks.x=element_blank()) 
g=g+scale_fill_discrete("",guide = guide_legend(reverse=TRUE)) 
g

很好,我们正在得到我们想要的东西。我们只想添加一些信息:每个部分代表多少百分比?

使用以下代码我们很接近:

g=g+geom_text(aes(label = paste(round(Percent,digits=1),"%"),y=Percent),size = 2,hjust = 0.4, vjust = 1.4, position ="stack") 

获取此信息:http://s28.postimg.org/lv3zg2cnh/bars2.png

我们只想将数字放在各个部分的中间。然而,事实证明这对我们来说非常困难!

我们尝试了以下代码,没有运气。

data=transform(frame,pos=round(ave(Percent,Inhabitants,FUN=cumsum)-Percent/2))
g=ggplot(data, aes(x=Inhabitants, ymax=100, y=Percent, fill=eval(parse(text=special)))) 
g=g+geom_bar(stat="identity")
g=g+theme_minimal()
g=g+xlab("") + ylab("")
g=g+theme(axis.text.y=element_blank(),axis.ticks.y=element_blank(),axis.ticks.x=element_blank()) 
g=g+scale_fill_discrete("",guide = guide_legend(reverse=TRUE))
g=g+geom_text(aes(label = paste(round(Percent,digits=1),"%"),y=pos),size = 3,hjust = 0.4, vjust = 0, position ="stack") 
g

我们已经检查了SO的解决方案。没有运气,由于我们对R的经验不足。经过很多个小时我们现在放弃了,并且对我们的第一个解决方案感到满意,是不是因为当我们处理数据集时有更多的部分它经常变成一个一塌糊涂:http://s13.postimg.org/5jxavvohz/bars3.png

我们的主要问题是:

1)我们如何防止出现价值低于2%的标签。

(我们的第二个问题是:我们如何才能将价值定位在中间?)

1 个答案:

答案 0 :(得分:2)

为避免在Percent小于某个值时标记堆栈,您可以为这些情况将定位变量分配给NA

例如,您可以通过问ifelse创建transform变量后通过poscumsum执行此操作。我在此示例中使用5作为截止值,因为示例数据中的Percent小于2。

data = transform(data, pos2 = ifelse(Percent < 5, NA, pos))

现在只需在pos2中使用geom_text作为您的审美,当Percent小于5时,您就不会有文字标签。从{{1}移除position = "stack"使标签居中。

以下是您的示例数据集的内容(使用geom_text,因为我不确定fill = Income正在做什么)。

fill = eval(parse(text = special))

enter image description here

正如@ epi10指出的那样,另一种选择是每当ggplot(data, aes(x = Inhabitants, y = Percent, fill = Income)) + geom_bar(stat="identity") + theme_minimal() + xlab("") + ylab("") + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.ticks.x = element_blank()) + scale_fill_discrete("",guide = guide_legend(reverse = TRUE)) + geom_text(aes(label = paste(round(Percent, digits = 1),"%"), y = pos2), size = 3) 小于你的截止时使用空白标签。您可以使用原始位置变量并使用Percent内的ifelse来完成此操作。那条线看起来像是:

geom_text