Python案例如何用Pandas做数据分组散点

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据分组散点

  1. 基础数据准备
  2. 简单分组散点图
  3. 高级分组散点图示例
  4. 使用Seaborn增强可视化
  5. 统计分组散点图
  6. 时间序列分组散点图
  7. 交互式分组散点图(可选)
  8. 实用技巧

我来详细讲解如何使用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()

这些案例覆盖了从基础到高级的数据分组散点图绘制方法,你可以根据实际需求选择合适的方案,记得根据数据特点调整参数(如点的大小、透明度、颜色等)以获得最佳可视化效果。

抱歉,评论功能暂时关闭!