如何解决如何绘制具有不连续 y 轴的刻面
我正在尝试使用不连续的 y 轴生成一个图,但无法让构面标题只显示一次:
示例数据:
data(mpg)
library(ggplot2)
> ggplot(mpg,aes(displ,cty)) +
+ geom_point() +
+ facet_grid(. ~ drv)
经过多次挖掘,这似乎在 ggplot2
中是不可能的,但我发现了 gg.gap
包。然而,这个包复制了每个情节段的刻面标题。假设我想在 22-32 之间的 y 轴上中断,如下所示:
library(gg.gap)
gg.gap(plot = p,segments = c(22,32),ylim = c(0,35))
每个情节段都会出现分面标题,但这在美学上显然非常令人困惑和糟糕。我将不胜感激任何人可以提供的任何帮助!我被难住了。
我知道如果我在基础 R 中绘图,这是可能的,但鉴于其他限制,我无法这样做(我需要 ggplot2
提供的图形/语法。
提前致谢!
解决方法
这是一个有点丑陋的解决方法。这个想法是将断开部分中的 y 值设置为 NA
,这样就不会在那里绘制任何点。然后,我们在 findInterval()
上使用轴的中断点(负数,因为我们想要保留从下到上的轴)。最后,我们使用 ggh4x::force_panelsizes()
手动调整面板大小以将第二个面板设置为 0 高度。完全免责声明,我写了 ggh4x 所以我有偏见。
一些细节:通过将相关主题元素设置为空白来隐藏沿 y 方向的条带。此外,理想情况下,您应该计算上部面相对于下部面的比例,并用该数字替换 0.2
。
library(ggplot2)
library(ggh4x)
ggplot(mpg,aes(displ,cty)) +
geom_point(aes(y = ifelse(cty >= 22 & cty < 32,NA,cty))) +
facet_grid(-findInterval(cty,c(-Inf,22,32,Inf)) ~ drv,scales = "free_y",space = "free_y") +
theme(strip.background.y = element_blank(),strip.text.y = element_blank(),panel.spacing.y = unit(5.5/2,"pt")) +
force_panelsizes(rows = c(0.2,1))
#> Warning: Removed 20 rows containing missing values (geom_point).
箱线图的替代方法:
您可以复制数据并操纵位置比例以显示您想要的内容,而不是检查中断位。我们依靠坐标系对数据的裁剪来裁剪图形对象。
library(ggplot2)
library(ggh4x)
ggplot(mpg,aes(class,cty)) +
geom_boxplot(data = ~ transform(.,facet = 2)) +
geom_boxplot(data = ~ transform(.,facet = 1)) +
facet_grid(facet ~ drv,space = "free_y") +
facetted_pos_scales(y = list(
scale_y_continuous(limits = c(32,NA),oob = scales::oob_keep,# <- keeps data
expand = c(0,0.05,0)),scale_y_continuous(limits= c(NA,21),expand = c(0.05,0))
)) +
theme(strip.background.y = element_blank(),strip.text.y = element_blank())
,
这是一种方法,它依赖于在 ggplot2 之前更改数据,然后调整比例标签,类似于您对辅助 y 轴所做的操作。
airflow resetdb
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。