用 Matplotlib 绘制多维度对比图表指南

核心概念

多维度数据对比需同时展示 3 个以上变量关系,常用方法:

  1. 散点图矩阵:展示变量两两关系
  2. 气泡图:用点大小表示第三维度
  3. 平行坐标图:处理 4+ 维度
  4. 雷达图:对比多维度特征

示例代码(含三维数据对比)

1. 散点图矩阵
import matplotlib.pyplot as plt
import pandas as pd
from pandas.plotting import scatter_matrix

# 生成示例数据(4个维度)
data = pd.DataFrame({
    '销量': [120, 95, 140, 80, 110],
    '价格': [25, 32, 18, 40, 28],
    '广告投入': [8, 12, 5, 15, 9],
    '满意度': [7.2, 6.8, 8.1, 5.5, 7.5]
})

# 绘制散点图矩阵
scatter_matrix(data, figsize=(10, 8), diagonal='kde')
plt.suptitle('产品多维度关系矩阵', fontsize=16)
plt.tight_layout()
plt.show()

2. 气泡图(三维对比)
import numpy as np

plt.figure(figsize=(10, 6))

# 创建数据
x = data['价格']
y = data['销量']
z = data['广告投入'] * 40  # 气泡大小系数

# 绘制气泡图
plt.scatter(x, y, s=z, c=data['满意度'], 
            cmap='viridis', alpha=0.7,
            edgecolors='gray')

# 添加标签和色标
plt.colorbar(label='客户满意度')
plt.xlabel('产品价格')
plt.ylabel('销售数量')
plt.title('价格-销量-广告投入关系 (气泡大小=广告投入)')

# 添加数据标签
for i, row in data.iterrows():
    plt.annotate(f"{row['广告投入']}万", (x[i], y[i]), 
                 xytext=(5,0), textcoords='offset points')

plt.grid(alpha=0.3)
plt.show()

3. 平行坐标图(四维对比)
from pandas.plotting import parallel_coordinates

plt.figure(figsize=(12, 6))
parallel_coordinates(data, '满意度', 
                     colormap='plasma',
                     linewidth=2, alpha=0.7)
plt.title('四维数据平行坐标对比')
plt.ylabel('标准化数值')
plt.grid(axis='y', alpha=0.3)
plt.legend(loc='upper right')
plt.show()


关键技巧

  1. 维度编码原则

    • X/Y 轴:核心对比维度
    • 点大小:数量型维度
    • 颜色:分类/连续型维度
    • 形状:分类维度
  2. 交互增强

    from mpl_toolkits.mplot3d import Axes3D
    
    fig = plt.figure(figsize=(10, 8))
    ax = fig.add_subplot(111, projection='3d')
    
    ax.scatter(data['价格'], data['销量'], data['广告投入'],
               c=data['满意度'], s=50, cmap='coolwarm')
    
    ax.set_xlabel('价格')
    ax.set_ylabel('销量')
    ax.set_zlabel('广告投入')
    plt.title('三维空间数据分布')
    plt.show()
    

  3. 多图组合

    fig, axs = plt.subplots(2, 2, figsize=(14, 10))
    
    # 子图1:价格-销量
    axs[0,0].scatter(data['价格'], data['销量'], c='blue')
    
    # 子图2:价格-满意度
    axs[0,1].scatter(data['价格'], data['满意度'], c='green')
    
    # 子图3:广告-满意度
    axs[1,0].bar(data['广告投入'], data['满意度'], color='orange')
    
    # 子图4:综合雷达图
    angles = np.linspace(0, 2*np.pi, len(data.columns), endpoint=False)
    values = data.mean().values.tolist()
    values += values[:1]  # 闭合曲线
    axs[1,1].plot(np.append(angles, angles[0]), values, 'o-')
    axs[1,1].fill(np.append(angles, angles[0]), values, alpha=0.25)
    


最佳实践建议

  1. 维度选择:优先展示强相关维度,避免超过 5 个维度
  2. 标准化处理:使用 MinMaxScaler 统一量纲
    from sklearn.preprocessing import MinMaxScaler
    scaler = MinMaxScaler()
    data_scaled = pd.DataFrame(scaler.fit_transform(data), columns=data.columns)
    

  3. 动态可视化:结合 %matplotlib notebook 实现旋转查看
  4. 标注优化:关键数据点使用 plt.annotate() 添加说明

通过组合使用这些技术,可清晰展示高维数据关系,如市场营销中的「价格-销量-广告-满意度」四维分析,或产品特性多维对比等场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐