在R的ggplot中堆叠底部图例,适配含多几何对象的绘图区域
解决方案:调整ggplot图例布局与空间分配
以下是针对你的需求优化后的代码,解决了图例超出窗口、绘图区域压缩及图例布局的问题:
library(tidyverse) iris |> rowwise() |> mutate( min = Petal.Width -.5, mid = Petal.Width + 1.5, max = Petal.Width + 3.5, pw1 = Petal.Width +1, pw2 = Petal.Width + 2, pw3 = Petal.Width + 3 ) |> ggplot(aes(x = Petal.Length))+ # 修正fill标签的语法错误(补全右括号) geom_ribbon(aes(ymin = Petal.Width, ymax = pw3, fill = "Normal Range \n(middle 80%)"), alpha = .7)+ geom_ribbon(aes(ymin = pw1, ymax = pw2, fill = "Inner Quartile Range \n(middle 50%)"), alpha = .7)+ geom_line(aes(y = max, linetype = "Maximum"))+ geom_line(aes(y = mid, linetype = "Median"))+ geom_line(aes(y = min, linetype = "Minimum"))+ scale_fill_manual("Statistic", values = c("lightgreen", "blue"), # 控制填充图例的顺序、换行及标题位置 guide = guide_legend(order = 1, nrow = 2, title.position = "left")) + scale_linetype_manual("", values = c("dotted", "dashed", "dotted"), # 控制线型图例的顺序与换行 guide = guide_legend(order = 2, nrow = 3)) + theme( legend.position = "bottom", legend.box = "vertical", # 让两个图例垂直堆叠 legend.box.just = "center", # 图例组整体居中 legend.spacing.y = unit(0.5, "lines"), # 两个图例间的垂直间距 legend.key.height = unit(0.8, "lines"), # 缩小图例项高度,减少垂直空间占用 legend.margin = margin(t = 5, r = 5, b = 5, l = 5), # 图例内部边距 plot.margin = margin(t = 10, r = 10, b = 20, l = 10) # 增大底部边距,避免图例被截断 )
关键调整说明
- 语法修正:补全
geom_ribbon中fill标签缺失的右括号,避免代码报错。 - 图例顺序与布局:
- 通过
guide_legend(order = 1/2)明确填充图例在上、线型图例在下的堆叠顺序。 - 用
nrow参数让两类图例的项垂直排列,减少水平空间占用。 title.position = "left"实现填充图例标题“Statistic”左对齐。
- 通过
- 空间优化:
legend.box = "vertical"强制图例垂直堆叠,而非默认的水平排列。legend.key.height缩小图例项高度,降低图例整体垂直空间占比,避免压缩绘图区域。plot.margin增大底部边距,确保图例完全显示在窗口内。
内容的提问来源于stack exchange,提问作者Brian Fisher
相关产品推荐
相关产品推荐

