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

如何创建含子图的多图网格?解决数值差异可视化问题

解决多子图网格中区域数值差异导致的可视化问题

当数据中某一区域(如area1)的数值远高于其他区域时,多属性子图网格会出现其他区域细节被掩盖的问题,以下是几种可行的解决方案:

方案1:为每个子图单独设置自适应Y轴范围

针对每个属性的子图,仅基于area2、area3的数值范围设置Y轴上限,同时在子图顶部标注area1的实际数值,既保留关键数据,又能清晰展示其他区域的差异。

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

# 模拟数据结构
data = pd.DataFrame({
    'attribute': ['attr1']*9 + ['attr2']*9 + ['attr3']*9,
    'area': ['area1', 'area2', 'area3']*9,
    'value': [100, 10, 5]*3 + [90, 8, 4]*3 + [110, 12, 6]*3
})

# 创建分面子图网格
g = sns.catplot(x='area', y='value', col='attribute', data=data, kind='bar')

# 遍历每个子图,单独调整Y轴范围并标注area1数值
for ax, attr in zip(g.axes.flat, data['attribute'].unique()):
    # 获取当前属性下area2和area3的最大数值
    sub_data = data[(data['attribute'] == attr) & (data['area'] != 'area1')]
    max_val = sub_data['value'].max()
    # 设置Y轴上限为最大值的1.2倍,预留留白
    ax.set_ylim(0, max_val * 1.2)
    # 标注area1的实际数值
    area1_val = data[(data['attribute'] == attr) & (data['area'] == 'area1')]['value'].iloc[0]
    ax.text(0, max_val * 1.1, f'area1: {area1_val}', ha='center', fontweight='bold')

plt.tight_layout()
plt.show()

方案2:使用对数坐标轴

对数坐标轴可以极大压缩高值区域的视觉占比,让低值区域的细微差异更易分辨,适合所有数值为正数的场景。

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

data = pd.DataFrame({
    'attribute': ['attr1']*9 + ['attr2']*9 + ['attr3']*9,
    'area': ['area1', 'area2', 'area3']*9,
    'value': [100, 10, 5]*3 + [90, 8, 4]*3 + [110, 12, 6]*3
})

g = sns.catplot(x='area', y='value', col='attribute', data=data, kind='bar')

# 为每个子图设置对数Y轴,并自定义刻度提升可读性
for ax in g.axes.flat:
    ax.set_yscale('log')
    ax.set_yticks([1, 5, 10, 50, 100])
    ax.set_yticklabels(['1', '5', '10', '50', '100'])

plt.tight_layout()
plt.show()

方案3:数据归一化处理

将每个属性下的所有区域数值归一化到0-1范围(除以当前属性的最大值),这样所有子图的数值尺度统一,能直观对比各区域在对应属性中的相对占比。

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

data = pd.DataFrame({
    'attribute': ['attr1']*9 + ['attr2']*9 + ['attr3']*9,
    'area': ['area1', 'area2', 'area3']*9,
    'value': [100, 10, 5]*3 + [90, 8, 4]*3 + [110, 12, 6]*3
})

# 按属性分组归一化数值
data['norm_value'] = data.groupby('attribute')['value'].transform(lambda x: x / x.max())

g = sns.catplot(x='area', y='norm_value', col='attribute', data=data, kind='bar')

# 调整子图标签和Y轴范围
for ax in g.axes.flat:
    ax.set_ylabel('Normalized Value')
    ax.set_ylim(0, 1.1)

plt.tight_layout()
plt.show()

内容的提问来源于stack exchange,提问作者Anas.S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:03:23