如何双重填充具有两个特征的 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的主要内容,如果未能解决你的问题,请参考以下文章

在一个图中根据不同的列制作两个geom_bar()图。

如何绘制具有数据框的分组 geom_bar 图?

ggplot geom_bar() 在绘图上填充不着色条

如何在两个类中双重引用子类和父类

ggplot2:使用填充geom_bar指定颜色时缺少图例

如何填充两个 UIBezierPaths 之间的空间