ggplot2双图例配置:一个水平排列,一个垂直排列
解决方案
要实现一个图例水平排列、另一个垂直排列的布局,需要分别为每个映射的图例指定内部排列方向,而非全局统一设置。具体实现如下:
1. 补全可复现的映射定义
先补充示例中缺失的形状、颜色映射,确保代码能直接运行:
# 定义Stage对应的形状映射 Stage_shape <- c("Plaque" = 16, "Patch" = 17, "nonlesional" = 15) # 定义Patient对应的颜色映射 Patient_Colour <- c("Pat1" = "#E63946", "Pat3" = "#457B9D", "Pat4" = "#1D3557", "Pat5" = "#F1FAEE")
2. 调整图例布局的完整代码
在基础图表的基础上,通过guides()分别控制两个图例的内部排列方向,再调整图例容器的整体布局:
library(ggplot2) # 构建基础PCA散点图 PCAplot <- ggplot(pcaData, aes(PC1, PC2, color = Patient, shape = Stage)) + geom_point(size = 4) + scale_shape_manual(values = Stage_shape) + scale_color_manual(values = Patient_Colour) + theme_bw() + theme( legend.position = "top", legend.title = element_blank(), legend.key.size = unit(1, "char"), legend.spacing = unit(-0.5, "line") ) # 调整图例排列方向与整体布局 PCAplot + guides( color = guide_legend(direction = "horizontal"), # Patient(颜色)图例水平排列 shape = guide_legend(direction = "vertical") # Stage(形状)图例垂直排列 ) + theme( legend.box = "horizontal", # 两个图例横向并排展示 legend.spacing.x = unit(2, "line") # 调整两个图例之间的横向间距 )
关键修正说明
- 之前的错误操作:
- 使用
theme(legend.direction = "horizontal")是全局设置所有图例的内部排列,导致两个图例都变成水平; guides()中错误指定了size参数,而非实际映射的color和shape。
- 使用
- 核心逻辑:
guide_legend(direction = ...)控制单个图例内部项的排列方向;legend.box = "horizontal"控制两个图例的整体排列方式(横向并排)。
内容的提问来源于stack exchange,提问作者plicht
相关产品推荐
相关产品推荐

