五指山纤凝网

Python数据可视化之从单变量到多变量的方法

2026-03-25 06:46:01 浏览次数:1
详细信息

一、单变量可视化

1. 数值型变量

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

# 创建示例数据
np.random.seed(42)
data = pd.DataFrame({
    'age': np.random.normal(35, 10, 1000),
    'income': np.random.lognormal(10, 0.5, 1000)
})

# 直方图
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.hist(data['age'], bins=30, edgecolor='black', alpha=0.7)
plt.title('Age Distribution')

# 密度图
plt.subplot(1, 3, 2)
sns.kdeplot(data['age'], fill=True)
plt.title('Density Plot')

# 箱线图
plt.subplot(1, 3, 3)
sns.boxplot(y=data['age'])
plt.title('Box Plot')
plt.tight_layout()
plt.show()

2. 类别型变量

# 类别数据
categories = ['A', 'B', 'C', 'D']
counts = np.random.randint(20, 100, 4)
category_data = pd.DataFrame({'category': categories, 'count': counts})

# 条形图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
sns.barplot(x='category', y='count', data=category_data)
plt.title('Bar Chart')

# 饼图
plt.subplot(1, 2, 2)
plt.pie(category_data['count'], labels=categories, autopct='%1.1f%%')
plt.title('Pie Chart')
plt.tight_layout()
plt.show()

二、双变量可视化

1. 数值型 vs 数值型

# 散点图
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.scatter(data['age'], data['income'], alpha=0.5)
plt.xlabel('Age')
plt.ylabel('Income')
plt.title('Scatter Plot')

# 添加回归线
plt.subplot(1, 3, 2)
sns.regplot(x='age', y='income', data=data, scatter_kws={'alpha':0.3})
plt.title('Scatter with Regression')

# 热力图(相关矩阵)
plt.subplot(1, 3, 3)
corr_matrix = data.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('Correlation Heatmap')
plt.tight_layout()
plt.show()

2. 数值型 vs 类别型

# 添加类别变量
data['group'] = np.random.choice(['Group1', 'Group2', 'Group3'], size=1000)

plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
sns.boxplot(x='group', y='income', data=data)
plt.title('Box Plot by Group')

plt.subplot(1, 3, 2)
sns.violinplot(x='group', y='age', data=data)
plt.title('Violin Plot')

plt.subplot(1, 3, 3)
for group in data['group'].unique():
    subset = data[data['group'] == group]
    plt.hist(subset['income'], alpha=0.5, label=group, bins=30)
plt.legend()
plt.title('Stacked Histogram')
plt.tight_layout()
plt.show()

三、多变量可视化(3个及以上变量)

1. 散点图矩阵

# 添加更多变量
np.random.seed(42)
data['education'] = np.random.normal(15, 3, 1000)
data['experience'] = np.random.normal(10, 5, 1000)
data['satisfaction'] = np.random.uniform(1, 10, 1000)

# 散点图矩阵
sns.pairplot(data[['age', 'income', 'education', 'experience']], 
             diag_kind='kde', plot_kws={'alpha': 0.3})
plt.suptitle('Pair Plot Matrix', y=1.02)
plt.show()

2. 多维度散点图

plt.figure(figsize=(10, 6))
scatter = plt.scatter(data['age'], data['income'], 
                      c=data['education'],  # 颜色维度
                      s=data['experience']*2,  # 大小维度
                      alpha=0.6, 
                      cmap='viridis')
plt.colorbar(scatter, label='Education Years')
plt.xlabel('Age')
plt.ylabel('Income')
plt.title('Multi-dimensional Scatter Plot\n(size=experience, color=education)')
plt.show()

3. 平行坐标图

from pandas.plotting import parallel_coordinates

# 创建分组数据
sample_data = data.sample(100)  # 取样100个点
sample_data['group_cluster'] = pd.qcut(sample_data['income'], 3, 
                                       labels=['Low', 'Medium', 'High'])

plt.figure(figsize=(12, 6))
parallel_coordinates(sample_data[['age', 'income', 'education', 
                                  'experience', 'group_cluster']], 
                     'group_cluster', colormap='Set2')
plt.title('Parallel Coordinates Plot')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

4. 气泡图

# 按group聚合
aggregated = data.groupby('group').agg({
    'age': 'mean',
    'income': 'mean',
    'satisfaction': 'mean',
    'education': 'count'
}).reset_index()
aggregated.columns = ['group', 'avg_age', 'avg_income', 
                      'avg_satisfaction', 'count']

plt.figure(figsize=(10, 6))
scatter = plt.scatter(aggregated['avg_age'], aggregated['avg_income'],
                      s=aggregated['count']*10,  # 气泡大小
                      c=aggregated['avg_satisfaction'],  # 颜色
                      cmap='RdYlGn',
                      edgecolors='black',
                      alpha=0.7)

# 添加标签
for i, row in aggregated.iterrows():
    plt.text(row['avg_age'], row['avg_income'], row['group'], 
             fontsize=10, ha='center')

plt.colorbar(scatter, label='Satisfaction')
plt.xlabel('Average Age')
plt.ylabel('Average Income')
plt.title('Bubble Chart: Group Analysis')
plt.grid(True, alpha=0.3)
plt.show()

四、高级多变量可视化

1. 子图组合(Facet Grid)

# 创建网格图
g = sns.FacetGrid(data, col='group', col_wrap=2, height=4)
g.map(sns.scatterplot, 'age', 'income', alpha=0.6)
g.set_axis_labels("Age", "Income")
g.set_titles("{col_name}")
plt.tight_layout()
plt.show()

# 更复杂的网格图
g = sns.FacetGrid(data, row='group', col='satisfaction_bin', 
                  margin_titles=True)
g.map(plt.scatter, 'age', 'education', alpha=0.5)
plt.tight_layout()
plt.show()

2. 热力图增强

# 多变量相关矩阵
correlation = data[['age', 'income', 'education', 'experience', 
                   'satisfaction']].corr()

plt.figure(figsize=(10, 8))
sns.heatmap(correlation, annot=True, fmt='.2f', 
           cmap='RdBu_r', center=0, 
           square=True, linewidths=1,
           cbar_kws={"shrink": .8})
plt.title('Multi-variable Correlation Matrix')
plt.tight_layout()
plt.show()

3. 3D可视化

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 3D散点图
scatter = ax.scatter(data['age'][:200], data['education'][:200], 
                     data['income'][:200],
                     c=data['satisfaction'][:200], 
                     cmap='viridis',
                     s=data['experience'][:200]/2)

ax.set_xlabel('Age')
ax.set_ylabel('Education')
ax.set_zlabel('Income')
plt.colorbar(scatter, label='Satisfaction')
plt.title('3D Scatter Plot')
plt.show()

五、交互式多变量可视化

import plotly.express as px
import plotly.graph_objects as go

# Plotly交互式散点图
fig = px.scatter_3d(data.sample(200), 
                    x='age', y='education', z='income',
                    color='satisfaction',
                    size='experience',
                    hover_name='group',
                    opacity=0.7,
                    color_continuous_scale=px.colors.sequential.Viridis)

fig.update_layout(title='Interactive 3D Scatter Plot')
fig.show()

# 并行坐标图(交互式)
fig = px.parallel_coordinates(data, 
                              color='satisfaction',
                              dimensions=['age', 'income', 'education', 'experience'],
                              color_continuous_scale=px.colors.diverging.Tealrose)
fig.show()

六、实用技巧总结

1. 选择指南

2. 最佳实践

# 1. 渐进式分析
def progressive_analysis(df):
    """渐进式可视化分析"""
    # 单变量分布
    df.hist(figsize=(12, 8), bins=30, edgecolor='black')
    plt.suptitle('Univariate Distributions')
    plt.tight_layout()
    plt.show()

    # 双变量关系
    sns.pairplot(df.select_dtypes(include=[np.number]), 
                 diag_kind='kde', plot_kws={'alpha': 0.5})
    plt.suptitle('Bivariate Relationships')
    plt.show()

    # 多变量相关性
    plt.figure(figsize=(10, 8))
    sns.heatmap(df.corr(), annot=True, cmap='coolwarm', center=0)
    plt.title('Multi-variable Correlation')
    plt.show()

# 2. 使用颜色、大小、形状编码多个维度
plt.scatter(x, y, c=z, s=s*100, alpha=0.6, cmap='viridis')

3. 性能优化

通过这种从简单到复杂的方法,可以系统地探索和理解数据中的模式和关系。

相关推荐