如何双重填充具有两个特征的 geom_bar
Posted
技术标签:
【中文标题】如何双重填充具有两个特征的 geom_bar【英文标题】:How to double fill a geom_bar with two characteristics 【发布时间】:2021-08-26 16:32:14 【问题描述】:我正在处理房价指数,我有一个关于如何将另一个几何图形添加到 ggplot 的问题。这是我为这个问题制作的示例数据。 我有来自人口普查和在线帖子的住房数据。 rooms 住房特征(许多或几个房间)的变量,value 是具有该特征的每个来源的住房百分比。然后,房屋和公寓显示该城市拥有的用于该数据源的房屋和公寓的百分比。例如,城市 1 在人口普查数据中有 40% 的房屋和 60% 的公寓,在 zillow 数据中有 45% 的房屋和 55% 的公寓。 我按房间制作了 geom_bar 分面并按来源填充,所以我有两个地块,一个用于房间 = 1,另一个用于房间 = 2,每个城市每个城市都有两个酒吧(每个来源一个)。 现在,我想用每个城市和来源的房屋和公寓百分比填充这些相同的条形图。
如果有人能帮我解决这个问题,我将不胜感激。
我目前用于绘图的代码如下:
df <- tibble::tribble(
~city, ~source, ~rooms, ~value, ~houses, ~apts,
"city1", "census", "1", 0.8, 0.4, 0.6,
"city1", "census", "2", 0.2, 0.4, 0.6,
"city1", "zillow", "1", 0.7, 0.45, 0.55,
"city1", "zillow", "2", 0.3, 0.45, 0.55,
"city2", "census", "1", 0.74, 0.66, 0.34,
"city2", "census", "2", 0.26, 0.66, 0.34,
"city2", "zillow", "1", 0.37, 0.66, 0.34,
"city2", "zillow", "2", 0.63, 0.66, 0.34,
"city3", "census", "1", 0.81, 0.71, 0.29,
"city3", "census", "2", 0.19, 0.71, 0.29,
"city3", "zillow", "1", 0.49, 0.71, 0.29,
"city3", "zillow", "2", 0.51, 0.71, 0.29)
ggplot(df, aes(fill=source, y=city, x=value)) +
geom_bar(position = "dodge", stat = "identity") +
facet_wrap(facets="rooms", nrow=2)
【问题讨论】:
Magdalena,ggplot
与“层”一起工作。因此,您可以通过将该层添加到您拥有的调用中来添加一个新的几何图形,即在 facet_wrap 之前插入一个带有您想要的几何图形的新行。希望这能让你到达那里。
【参考方案1】:
如果我理解正确,您正在寻找一种分离出来并在一个图中显示以下差异:
城市 房间 值(此处为条的长度) % house 或 % apts(一个是另一个相反的,所以基本上只是显示相同的东西)如果我的判断是正确的,也许最简单的方法是使用facet_grid()
对两个变量而不是一个变量进行分面:
ggplot(df, aes(fill=houses, y=city, x=value)) +
geom_col(position='dodge') +
facet_grid(source ~ rooms)
另一种方法可能是使用另一种美学来分离您的 source
列(而不是使其成为一个方面),并且仍然保持 fill
美学被映射到 % 的房屋:
ggplot(df, aes(fill=houses, y=city, x=value)) +
geom_col(
position=position_dodge(width=0.8), width=0.7, size=1, color='black',
aes(linetype=source)
) +
facet_wrap(~rooms, nrow=2)
这种方式可行,但看起来并不好。如果你这样做,我会修改一些主题元素并在条形图中添加一些 alpha 值,以使事情更容易查看。 alpha 不会转换为图例,因此您实际上也需要对其进行修改......好吧......这是最终产品和代码。
ggplot(df, aes(fill=houses, y=city, x=value)) +
geom_col(
position=position_dodge(width=0.8), width=0.7, size=1,
color='black', alpha=0.4,
aes(linetype=source, alpha=source)
) +
scale_fill_distiller(palette='RdYlBu') +
guides(
linetype=guide_legend(override.aes = list(fill=NA))
) +
facet_wrap(~rooms, nrow=2) +
theme_classic() +
theme(
panel.spacing = unit(0.08, 'npc')
)
你可能明白了。不过请注意以下几点:
我在这里使用geom_col()
,建议不要使用geom_bar(stat='identity')
。注意documentation,它暗示了这种用法。
建议使用position=position_dodge()
代替position="dodge"
。这使您可以调整希望被闪避的列相距多远,如果您还想调整条形的宽度,这一点尤其重要。我想这样做是为了更容易看到条形的线条。
其中还隐藏了一些其他技巧,但希望这对您有所帮助,您可以从中选择类似的方法来解决您的问题。
【讨论】:
亲爱的@chemdork123,非常感谢您的回答!!我认为你提出的最后一个情节看起来比我想象的还要好,它显示了我的需要。谢谢!!!以上是关于如何双重填充具有两个特征的 geom_bar的主要内容,如果未能解决你的问题,请参考以下文章