如何用ggMarginal将边际分布置于左侧并调整Y轴标签位置
实现左侧Y轴边际密度分布及Y轴标签居中摆放的两种方法
方法一:直接使用ggExtra的参数调整
ggExtra的ggMarginal()函数本身支持通过side参数将Y轴边际图放在左侧,再配合ggplot主题调整Y轴标签的位置,使其落在主图与边际图之间:
# 加载依赖包 library(ggplot2) library(ggExtra) # 绘制主图:调整Y轴标签位置,预留左侧空间 p <- ggplot(mtcars, aes(x=wt, y=mpg, color=cyl, size=cyl)) + geom_point() + labs(y = "mpg") + # 定义Y轴标签 theme( legend.position = "none", # 调整Y轴标签的水平对齐和边距,使其靠近主图左侧边缘 axis.title.y = element_text(hjust = 0, margin = margin(r = 12)), # 给左侧预留足够空间放置边际图和标签 plot.margin = margin(l = 60, r = 10, t = 10, b = 10) ) # 生成左侧Y轴边际密度图 p2 <- ggMarginal(p, type = "density", margins = "y", side = "left", # 指定边际图放在左侧 size = 4) # 调整边际图相对于主图的大小 p2
方法二:用patchwork手动拼接(更灵活)
如果需要更精细的布局控制,可以用patchwork包分别绘制主图和边际图,再手动拼接,同时精准控制Y轴标签的位置:
# 加载依赖包 library(ggplot2) library(patchwork) # 绘制主图:隐藏Y轴刻度,将标签移至左侧边缘 main_plot <- ggplot(mtcars, aes(x=wt, y=mpg, color=cyl, size=cyl)) + geom_point() + labs(y = "mpg") + theme( legend.position = "none", # 调整Y轴标签位置,使其落在主图左侧 axis.title.y = element_text(hjust = 0, margin = margin(r = 15)), # 隐藏主图Y轴刻度,避免与边际图重复 axis.text.y = element_blank(), axis.ticks.y = element_blank(), plot.margin = margin(l = 0, r = 10, t = 10, b = 10) ) # 绘制左侧边际密度图:转为垂直方向,清空多余元素 marginal_plot <- ggplot(mtcars, aes(y=mpg, fill=factor(cyl))) + geom_density(alpha = 0.5) + theme_void() + # 移除所有轴元素 theme(legend.position = "none") + coord_flip() # 翻转坐标系,适配左侧垂直布局 # 拼接布局:边际图占1份宽度,主图占4份宽度 marginal_plot + main_plot + plot_layout(widths = c(1, 4))
两种方法都能实现需求:方法一更简洁,依赖ggExtra原生参数;方法二布局自由度更高,适合需要自定义细节的场景。
内容的提问来源于stack exchange,提问作者imtaiky
相关产品推荐
相关产品推荐

