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

Seaborn多子图行列标签调整:替换分隔符避免重叠

解决Seaborn多子图行列标签重叠问题

当使用Seaborn的relplot绘制多子图时,若行列标签过长(或包含竖线分隔的内容),会出现标签重叠的情况,可通过将标签中的竖线替换为换行符\n来优化显示,以下是两种实现方案:


方案一:提前处理DataFrame中的标签文本

在拼接数据前,直接将目标列中的竖线替换为换行符,绘图时Seaborn会自动识别换行并分行显示:

import numpy as np
import pandas as pd
import seaborn as sns

# 构造示例数据
df1 = pd.DataFrame(
    np.zeros((6,6)),
    columns=['Epoch', 'Correlation', 'PreprocessingStyle', 'Model', 'Dataset', 'Type'],
)
# 模拟带竖线的长标签(实际根据你的数据调整)
df1['Model'] = 'aaaaaaaaaaaaaaaaaaaaaaaaaa|model1'
df1['PreprocessingStyle'] = 'bbbbbbbbbbbbbbbbbbbbbbbbbb|style1'

df2 = pd.DataFrame(
    np.zeros((6,6)),
    columns=['Epoch', 'Correlation', 'PreprocessingStyle', 'Model', 'Dataset', 'Type'],
)
df2['Model'] = 'cccccccccccccccccccccccccc|model2'
df2['PreprocessingStyle'] = 'dddddddddddddddddddddddddd|style2'

# 替换竖线为换行符(regex=False避免转义问题)
df1['Model'] = df1['Model'].str.replace('|', '\n', regex=False)
df1['PreprocessingStyle'] = df1['PreprocessingStyle'].str.replace('|', '\n', regex=False)
df2['Model'] = df2['Model'].str.replace('|', '\n', regex=False)
df2['PreprocessingStyle'] = df2['PreprocessingStyle'].str.replace('|', '\n', regex=False)

df = pd.concat([df1, df2])

# 绘制多子图
g = sns.relplot(
    df,
    x='Epoch',
    y='Correlation',
    col='PreprocessingStyle',
    row='Model',
    hue='Dataset',
    style='Type',
    kind='line',
    markers=True,
    dashes=False,
)

方案二:绘图后修改子图标签

如果不想改动原始数据,可在绘图完成后遍历子图的行列标签,手动替换竖线为换行符:

import numpy as np
import pandas as pd
import seaborn as sns

# 构造示例数据(无需提前修改标签)
df1 = pd.DataFrame(
    np.zeros((6,6)),
    columns=['Epoch', 'Correlation', 'PreprocessingStyle', 'Model', 'Dataset', 'Type'],
)
df1['Model'] = 'aaaaaaaaaaaaaaaaaaaaaaaaaa|model1'
df1['PreprocessingStyle'] = 'bbbbbbbbbbbbbbbbbbbbbbbbbb|style1'

df2 = pd.DataFrame(
    np.zeros((6,6)),
    columns=['Epoch', 'Correlation', 'PreprocessingStyle', 'Model', 'Dataset', 'Type'],
)
df2['Model'] = 'cccccccccccccccccccccccccc|model2'
df2['PreprocessingStyle'] = 'dddddddddddddddddddddddddd|style2'

df = pd.concat([df1, df2])

# 绘制多子图
g = sns.relplot(
    df,
    x='Epoch',
    y='Correlation',
    col='PreprocessingStyle',
    row='Model',
    hue='Dataset',
    style='Type',
    kind='line',
    markers=True,
    dashes=False,
)

# 修改行标签(Model列)
for i, row_label in enumerate(g.row_names):
    g.axes[i, 0].set_ylabel(row_label.replace('|', '\n'))

# 修改列标题(PreprocessingStyle列)
for j, col_label in enumerate(g.col_names):
    g.axes[0, j].set_title(col_label.replace('|', '\n'))

补充说明

如果你的标签是无竖线的纯长字符串,也可以通过字符串切片插入换行,例如将标签从第13个字符处拆分:

label = 'aaaaaaaaaaaaaaaaaaaaaaaaaa'
new_label = label[:13] + '\n' + label[13:]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:05:06