本文目录导读:

我来详细讲解如何使用Pandas进行数据分组散点图绘制,包含多个实用案例。
基础数据准备
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42)
df = pd.DataFrame({
'类别': np.random.choice(['A', 'B', 'C'], 100),
'X值': np.random.randn(100),
'Y值': np.random.randn(100),
'分组': np.random.choice(['组1', '组2'], 100)
})
print(df.head())
简单分组散点图
# 按类别分组,为每个组绘制不同颜色的散点
plt.figure(figsize=(10, 6))
for category, group in df.groupby('类别'):
plt.scatter(group['X值'], group['Y值'], label=category, alpha=0.7)
plt.xlabel('X值')
plt.ylabel('Y值')'按类别分组的散点图')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
高级分组散点图示例
# 创建更复杂的数据
df_complex = pd.DataFrame({
'城市': np.random.choice(['北京', '上海', '广州', '深圳'], 200),
'温度': np.random.normal(25, 5, 200),
'湿度': np.random.normal(60, 10, 200),
'季节': np.random.choice(['春', '夏', '秋', '冬'], 200)
})
# 按城市和季节分组
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes = axes.ravel()
for idx, (city, group) in enumerate(df_complex.groupby('城市')):
# 按季节设置不同颜色
seasons = group.groupby('季节')
colors = {'春': 'green', '夏': 'red', '秋': 'orange', '冬': 'blue'}
for season, season_data in seasons:
axes[idx].scatter(season_data['温度'],
season_data['湿度'],
c=colors[season],
label=season,
alpha=0.6,
s=50)
axes[idx].set_title(f'{city} 温湿度分布')
axes[idx].set_xlabel('温度 (°C)')
axes[idx].set_ylabel('湿度 (%)')
axes[idx].legend()
axes[idx].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
使用Seaborn增强可视化
import seaborn as sns
# 准备数据
df_sns = pd.DataFrame({
'产品': np.random.choice(['产品A', '产品B', '产品C'], 150),
'销量': np.random.poisson(100, 150),
'价格': np.random.uniform(10, 100, 150),
'利润': np.random.normal(20, 5, 150),
'地区': np.random.choice(['东部', '西部', '南部', '北部'], 150)
})
# Seaborn分组散点图
plt.figure(figsize=(12, 8))
sns.scatterplot(data=df_sns,
x='销量',
y='价格',
hue='产品', # 按产品分组着色
style='地区', # 按地区分组样式
size='利润', # 点的大小表示利润
sizes=(20, 200),
alpha=0.7)
'产品销售分析 - 分组散点图')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
统计分组散点图
# 创建含有统计信息的数据分组散点图
df_stats = pd.DataFrame({
'组别': np.repeat(['控制组', '实验组'], 50),
'测试前': np.concatenate([np.random.normal(70, 10, 50),
np.random.normal(72, 10, 50)]),
'测试后': np.concatenate([np.random.normal(75, 10, 50),
np.random.normal(85, 10, 50)])
})
# 计算每个组的均值
group_means = df_stats.groupby('组别').mean()
plt.figure(figsize=(10, 8))
# 绘制散点
for group_name, group_data in df_stats.groupby('组别'):
plt.scatter(group_data['测试前'],
group_data['测试后'],
label=f'{group_name} (n={len(group_data)})',
alpha=0.6)
# 添加均值线
for group_name, means in group_means.iterrows():
plt.axhline(y=means['测试后'], linestyle='--', alpha=0.5,
label=f'{group_name} 均值: {means["测试后"]:.1f}')
plt.xlabel('测试前得分')
plt.ylabel('测试后得分')'实验效果分析 - 分组散点图')
plt.legend(bbox_to_anchor=(1.05, 1))
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
时间序列分组散点图
# 创建时间序列数据
dates = pd.date_range('2024-01-01', periods=200, freq='D')
df_time = pd.DataFrame({
'日期': dates,
'销售额': np.random.normal(1000, 200, 200) + np.sin(np.arange(200)/10)*200,
'客流量': np.random.poisson(500, 200) + np.arange(200)/2,
'星期': dates.dayofweek,
'月份': dates.month
})
# 按星期分组
weekday_names = ['周一', '周二', '周三', '周四', '周五']
df_weekday = df_time[df_time['星期'] < 5].copy()
df_weekday['星期名称'] = df_weekday['星期'].map(lambda x: weekday_names[x])
plt.figure(figsize=(12, 8))
# 为每个工作日绘制不同颜色的散点
for weekday, group in df_weekday.groupby('星期名称'):
plt.scatter(group['客流量'],
group['销售额'],
label=weekday,
alpha=0.6,
s=50)
plt.xlabel('客流量')
plt.ylabel('销售额')'工作日销售额与客流量关系分析')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
交互式分组散点图(可选)
# 如果安装了plotly,可以创建交互式图表
try:
import plotly.express as px
import plotly.graph_objects as go
# 创建交互式分组散点图
fig = px.scatter(df_complex,
x='温度',
y='湿度',
color='城市',
symbol='季节',
size='湿度',
hover_data=['城市', '季节'],
title='交互式温湿度分布图')
fig.show()
except ImportError:
print("请安装plotly: pip install plotly")
实用技巧
自定义颜色和样式
# 自定义颜色映射
colors = {'A': '#FF6B6B', 'B': '#4ECDC4', 'C': '#45B7D1'}
markers = {'组1': 'o', '组2': '^'}
plt.figure(figsize=(10, 6))
for (cat, group), group_data in df.groupby(['类别', '分组']):
plt.scatter(group_data['X值'],
group_data['Y值'],
c=colors[cat],
marker=markers[group],
label=f'{cat}-{group}',
alpha=0.7)
plt.legend(bbox_to_anchor=(1.05, 1))
plt.show()
添加趋势线
from scipy import stats
plt.figure(figsize=(10, 6))
for group_name, group_data in df.groupby('类别'):
plt.scatter(group_data['X值'], group_data['Y值'], label=group_name, alpha=0.5)
# 添加回归线
slope, intercept, r_value, p_value, std_err = stats.linregress(
group_data['X值'], group_data['Y值']
)
x_line = np.linspace(group_data['X值'].min(), group_data['X值'].max(), 100)
plt.plot(x_line, slope * x_line + intercept, '--', linewidth=1)
plt.xlabel('X值')
plt.ylabel('Y值')'含趋势线的分组散点图')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
这些案例覆盖了从基础到高级的数据分组散点图绘制方法,你可以根据实际需求选择合适的方案,记得根据数据特点调整参数(如点的大小、透明度、颜色等)以获得最佳可视化效果。