You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:50:25