gpt4 book ai didi

R-ggplot : Selection of which labels to appear in bar stack and their position

转载 作者:行者123 更新时间:2023-12-04 02:17:53 26 4
gpt4 key购买 nike

目前,在发布此问题之前,我们已经为以下问题苦苦挣扎了很多很多小时。

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

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% 的标签。

(我们的第二个问题是:我们怎样才能得到位于中间的值?)

最佳答案

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

例如,您可以通过 ifelse 执行此操作和 transform创建 pos 之后通过 cumsum 变量正如您在问题中所做的那样。我在这个例子中使用 5 作为截止值,因为没有 Percent在您的示例数据中小于 2。

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

现在只需使用 pos2作为你的美学 geom_textPercent 时,您将没有文本标签小于 5。删除 position = "stack"来自 geom_text使您的标签居中。

这是您的示例数据集的样子(使用 fill = Income 因为我不确定 fill = eval(parse(text = special)) 在做什么)。

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)

enter image description here

正如@epi10 所指出的,另一种选择是每次都使用空白标签 Percent小于你的切断。您可以通过使用原始位置变量并使用 ifelse 来完成此操作geom_text 内部.那一行看起来像:

geom_text(aes(label = ifelse(Percent < 5, "", paste(round(Percent, digits = 1),"%")), y = pos), size = 3) 

关于R-ggplot : Selection of which labels to appear in bar stack and their position,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32916298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com