目前,我们在发布此问题之前的许多小时内一直在努力解决以下问题。
我们拥有大量与以下类似的数据集:
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%的标签。
(我们的第二个问题是:我们如何才能将价值定位在中间?)
答案 0 :(得分:2)
为避免在Percent
小于某个值时标记堆栈,您可以为这些情况将定位变量分配给NA
。
例如,您可以通过问ifelse
创建transform
变量后通过pos
和cumsum
执行此操作。我在此示例中使用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))
正如@ 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