R ggplot facet label在y轴标题和y轴刻度标签之间的位置

Posted

技术标签:

【中文标题】R ggplot facet label在y轴标题和y轴刻度标签之间的位置【英文标题】:R ggplot facet label position between y axis title and y axis tick mark labels 【发布时间】:2021-12-19 16:29:09 【问题描述】:

我想将构面标签一直放在左侧,这样 y 轴标题就在它的右侧。我已经可以创建一个合适的间距,但是我不能交换顺序。

library(ggplot2)
library(tibble)
tg <- ToothGrowth %>%
  as_tibble()

tg %>%
  ggplot(aes(supp, len)) +
  geom_boxplot(aes(fill = supp)) +
  theme(strip.placement = "outside",
        strip.switch.pad.grid = unit(1, "cm"),) +
  facet_grid(dose ~ ., switch = "y")

这个顺序很重要,因为我将这个图与其他两个图放在一起以获得更一致的布局。谢谢!!

编辑:对我来说最好的解决方案是 aosmith 评论中的第二个链接。

代码如下:

tg %>%
  ggplot(aes(supp, len)) +
  geom_boxplot(aes(fill = supp)) +
  facet_grid(dose ~ ., switch = "y") +
  theme(strip.placement = "outside",
        strip.switch.pad.grid = unit(1, "cm"),
        axis.title.y = element_text(vjust = -15))

带有网格包的解决方案看起来也不错,但是继续使用它很复杂。 假轴的解决方案改变了x轴刻度线的间距 并且 "label = " 不接受表达式。 感谢大家的大力帮助!

【问题讨论】:

我在this similar SO question/answer 中看到了一种(复杂的!)方法。为another SO question 展示了其他几种方法。 【参考方案1】:

我认为这在 ggplot 中是不可能的,因为完成的gtable 的布局方式。 y 轴标签始终位于刻面条的左侧。当然,您可以根据 aosmith 共享的链接渲染 ggplot 并交换 gtable。对于您想要做的事情来说,这可能有点太复杂了。

我认为实现您想要的结果的最简单方法是使用grid.draw 在绘图上绘制 y 轴标签。

tg %>%
  ggplot(aes(supp, len)) +
  geom_boxplot(aes(fill = supp)) +
  theme(strip.placement = "outside",
        strip.switch.pad.grid = unit(1, "cm"),) +
  labs(y = "") +
  facet_grid(dose ~ ., switch = "y") +
  theme(strip.placement = "outside") 

library(grid)

grid.draw(textGrob("len", x = unit(0.1, "npc"), y = unit(0.53, "npc"), rot = 90))

如果您想要一个 ggplot 对象而不必在其上绘制,另一种方法是使用 geom_text 制作一个假轴标题。这将需要更多的工作,但最终结果更加独立,因为它可以作为对象传递,并且可以对其进行各种修改,而不必总是在之后绘制标签:

tg %>%
  ggplot(aes(supp, len)) +
  geom_boxplot(aes(fill = supp)) +
  scale_y_continuous(labels = function(x) formatC(x, width = 10)) +
  theme(strip.placement = "outside",
        strip.switch.pad.grid = unit(1, "cm"),) +
  labs(y = "") +
  scale_color_manual(values = c("white", "black", "white"),
                     guide = guide_none()) +
  geom_text(aes(x = -0.5, y = 20, color = factor(dose), label = "len"),
            check_overlap = TRUE, angle = 90) +
  facet_grid(dose ~ ., switch = "y") +
  coord_cartesian(clip = "off", xlim = c(0.5, 2.5))

【讨论】:

感谢您的建议!考虑到它是一个非本地解决方案,它似乎是可行的,只需相对较少的额外努力。我将直接使用我的数据进行尝试。再次感谢! @maRvin 您可能需要在对textGrob 的调用中使用unit 调用中的数字来正确定位轴标签。如果您需要更改字体、颜色等,您可以使用textGrob 内部的一个名为gp 的参数来实现,该参数将调用grid::gpar 作为参数 - 请参阅?grid::gpar 是的,将x = unit(0.1, "npc") 增加到x = unit(0.11, "npc") 添加了上标编号所需的间距。 :) grid.draw 似乎与 ggsave 不兼容。网格包中是否有兼容的替代方案?还是您必须以不同的方式保存绘图(例如,使用 png())? @maRvin 查看我的更新,它提供了一个可以与 ggsave 一起使用的纯 ggplot 解决方案

以上是关于R ggplot facet label在y轴标题和y轴刻度标签之间的位置的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化绘制带有双y轴(double y axis)的分面图(facetfacet_grid)

Facet_Wrap标题与ggplotly中的y轴重叠?

在 ggplot/ggplotly 中使用 facet_wrap 时如何防止 y 轴挤压标签?

ggplot2,facet_grid 的 x 轴问题

在 R 中使用 ggplot 和拼凑更改轴标签和比例

R语言ggplot2可视化散点图并使用scale_y_log10函数配置Y轴对数坐标使用ggforce包的facet_zoom函数将可视化结果中需要突出放大的区域进行放大(Zoom in)