一、单变量可视化
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. 性能优化:
- 大数据集使用hexbin代替散点图
- 使用采样技术展示大量数据点
- 考虑使用交互式图表处理复杂多维数据
通过这种从简单到复杂的方法,可以系统地探索和理解数据中的模式和关系。