R:在 ggplot2 条形图中为每个方面绘制一组独特的因素

R: draw unique set of factors for each facet in ggplot2 barchart

假设我们有一组分布在不同大陆的商品(苹果、香蕉、土豆等)。我们通过 ggplot2 包中的分面条形图可视化它们在各大洲的分布,这些商品(在 "stuff" 字段后面称为)作为要在 x 轴上显示的因素。如数据所示,每个大陆都有自己的一套东西,尽管某些商品(香蕉)在两个或多个大陆上可能很常见。这是短格式的数据示例。字段 "medium" 和 "giant" 将市场进一步细分为中型和大型(以不同颜色绘制)。

    data<-read.csv(text="continent,stuff,average,giant
North America,apples,20,30
North America,bananas,25,32
Europe,bananas,15,25
Europe,potatoes,10,20
Europe,mosquitoes,13,17
Asia,snakes,26,35
Asia,snails,7,15
Asia,pandas,10,20")

首先我们将数据缩减为长格式,然后通过 geom_col() 和分面技术绘制它:

library(dplyr)
library(tidyr)
library(ggplot2)
data.tidied<-data %>%
  gather(key=size, value=val,-continent,-stuff)
ggplot(data.tidied,aes(x=stuff,y=val,fill=size))+
geom_col(position="dodge")+
facet_grid(~continent)+coord_flip()

这东西的所有因素在各大洲都是一致的,虽然大部分都不需要,所以有很多差距。但是我们在北美和欧洲不需要任何蜗牛,很自然地只有亚洲方面有这个字段等等。 (为了使事情更清楚,您可能会将 apples/bananas/potatoes 视为某些地理区域,对于一个大陆来说是独一无二的:我们在欧洲没有任何加利福尼亚州)。那么:如何使用 ggplot 的分面技术(或任何替代方法)来显示这种情况?即:如何为每个方面绘制一组独特的因素?

您可以使用 facet_wrap 代替 facet_grid 并指定 scales = "free_y"(翻转轴时必须为 free_y)。但在我看来,这让图表看起来有点奇怪。

data %>% 
  gather(size, val, -continent, -stuff) %>% 
  ggplot(aes(stuff, val)) + 
    geom_col(aes(fill = size), position = "dodge") + 
    facet_wrap(~continent, scales = "free_y") + 
    coord_flip()