带有facet_grid的水平条形图,free_x不起作用

yak*_*e84 3 r ggplot2

mpg数据集为例,我想facet_grid()在每个制造商下仅列出相关模型的地方使用。

该代码似乎有效(左图)

library(ggplot2)
qplot(cty, model, data=mpg) +
  facet_grid(manufacturer ~ ., scales = "free", space = "free")
Run Code Online (Sandbox Code Playgroud)

但这不是(对)

ggplot(mpg) +
  geom_bar(aes(x = model, y = cty), stat = "identity") +
  coord_flip() +
  facet_grid(manufacturer ~ ., scales = "free", space = "free")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我看到了此线程,但无法正常工作: 带刻面的水平条形图

有什么想法吗?

eip*_*i10 5

TL; DR:space="free"scales="free"没有与工作coord_flip。相反,请使用包装中的geom_barh(水平条形几何图形)ggstance,从而避免使用coord_flip。详细信息如下。

space="free"并且scales="free"不要和coord_flip。这与绘制点无关紧要,因为使用点可以切换x轴和y轴,并且geom_point仍然可以工作,而无需使用coord_flip。但是,geom_bar期望值是y变量,类别是x变量,因此您需要使用coord_flip以获得水平条。

为了避免coord_flip,你可以使用水平GEOM geom_barhggstance封装,这样free在空间和尺度设置facet_grid将工作:

library(ggplot2)
library(ggstance)

ggplot(data=mpg, aes(x=cty, y=model)) +
  geom_barh(stat="identity") +
  facet_grid(manufacturer ~ ., scales = "free_y", space = "free_y")
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码创建了一个堆叠的条形图,其中cty给定所有汽车的mpg 值一个model堆叠在另一个之上,这是荒谬的。例如,如果您设置colour="green"在内部,则可以看到此内容geom_barh。我认为此图仅用于说明,但我想指出这一点是为了完整性。

在此处输入图片说明