Python 数据可视化:用 Matplotlib 绘制多维度对比图表
·
用 Matplotlib 绘制多维度对比图表指南
核心概念
多维度数据对比需同时展示 3 个以上变量关系,常用方法:
- 散点图矩阵:展示变量两两关系
- 气泡图:用点大小表示第三维度
- 平行坐标图:处理 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()
关键技巧
-
维度编码原则:
- X/Y 轴:核心对比维度
- 点大小:数量型维度
- 颜色:分类/连续型维度
- 形状:分类维度
-
交互增强:
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() -
多图组合:
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)
最佳实践建议
- 维度选择:优先展示强相关维度,避免超过 5 个维度
- 标准化处理:使用
MinMaxScaler统一量纲from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() data_scaled = pd.DataFrame(scaler.fit_transform(data), columns=data.columns) - 动态可视化:结合
%matplotlib notebook实现旋转查看 - 标注优化:关键数据点使用
plt.annotate()添加说明
通过组合使用这些技术,可清晰展示高维数据关系,如市场营销中的「价格-销量-广告-满意度」四维分析,或产品特性多维对比等场景。
更多推荐
所有评论(0)