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)
在 ggplot/ggplotly 中使用 facet_wrap 时如何防止 y 轴挤压标签?
R语言ggplot2可视化散点图并使用scale_y_log10函数配置Y轴对数坐标使用ggforce包的facet_zoom函数将可视化结果中需要突出放大的区域进行放大(Zoom in)