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

Seaborn分面图:移除子图图例+添加全局图例+补全X轴标签

解决Seaborn分面箱线图的重复图例与X轴标签缺失问题

1. 移除子图重复图例,添加全局统一图例

Seaborn的FacetGrid默认会给每个子图生成图例,要解决重复问题,关键是先关闭子图图例,再统一添加全局图例:

  • 调用sns.boxplot时传入legend=False,让每个子图都不生成图例
  • 绘制完成后用g.add_legend()添加全局图例,还能通过bbox_to_anchor参数调整图例位置,避免遮挡图表

代码片段:

# 假设已处理好长格式数据df_long
g = sns.FacetGrid(df_long, col="Proportion_Charge", col_wrap=3, hue="Fragmentation")
# 绘制箱线图时关闭子图图例
g.map_dataframe(sns.boxplot, x="Dataset", y="Proportion", hue="Fragmentation", legend=False)
# 添加全局图例并自定义位置
g.add_legend(bbox_to_anchor=(1.05, 1), loc="upper left", title="Fragmentation Method")

2. 给所有分面子图添加X轴标签

默认FacetGrid只给最后一行子图显示X轴标签,要让所有子图都显示,有两种可行方法:

方法一:关闭X轴共享

创建FacetGrid时设置sharex=False,之后用set_xlabels()统一设置标签:

g = sns.FacetGrid(df_long, col="Proportion_Charge", col_wrap=3, hue="Fragmentation", sharex=False)
g.map_dataframe(sns.boxplot, x="Dataset", y="Proportion", legend=False)
g.add_legend()
# 为所有子图设置X轴标签
g.set_xlabels("Dataset")

方法二:遍历子图手动设置

如果需要保留X轴范围共享,直接遍历每个子图设置标签:

g = sns.FacetGrid(df_long, col="Proportion_Charge", col_wrap=3, hue="Fragmentation")
g.map_dataframe(sns.boxplot, x="Dataset", y="Proportion", legend=False)
g.add_legend()
# 遍历所有子图,逐个添加X轴标签
for ax in g.axes.flat:
    ax.set_xlabel("Dataset")

完整可运行示例

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# 模拟长格式数据(替换为你的真实数据即可)
dfs = []
for charge in range(1, 8):
    df = pd.DataFrame({
        "Proportion_Charge": f"+{charge}",
        "Dataset": np.random.choice(["DatasetA", "DatasetB"], size=100),
        "Fragmentation": np.random.choice(["HCD", "CID", "ETD"], size=100),
        "Proportion": np.random.normal(0.5, 0.1, size=100)
    })
    dfs.append(df)
df_long = pd.concat(dfs, ignore_index=True)

# 绘制分面箱线图
g = sns.FacetGrid(df_long, col="Proportion_Charge", col_wrap=3, hue="Fragmentation", sharex=False)
g.map_dataframe(sns.boxplot, x="Dataset", y="Proportion", legend=False)
# 添加全局图例
g.add_legend(title="Fragmentation Method", bbox_to_anchor=(1.02, 1), loc="upper left")
# 设置所有子图的X轴标签
g.set_xlabels("Dataset")
# 调整布局避免元素重叠
plt.tight_layout()
plt.show()

内容的提问来源于stack exchange,提问作者Fred

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:33:18