Python多图展示案例实操?

wen python案例 2

本文目录导读:

  1. Matplotlib基础多图布局
  2. Seaborn多图展示
  3. 交互式多图展示(Plotly)
  4. 实际数据分析案例
  5. 高级自定义布局

我来给你介绍几个Python多图展示的实操案例,从基础到进阶:

Matplotlib基础多图布局

1 subplots() 最常用方法

import matplotlib.pyplot as plt
import numpy as np
# 创建2x2的子图
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# 生成数据
x = np.linspace(0, 10, 100)
# 在四个子图中分别绘图
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title('正弦函数')
axes[0, 1].plot(x, np.cos(x), 'r')
axes[0, 1].set_title('余弦函数')
axes[1, 0].plot(x, np.exp(-x/2) * np.sin(x), 'g')
axes[1, 0].set_title('衰减震荡')
axes[1, 1].scatter(x[:20], np.random.randn(20), c='purple')
axes[1, 1].set_title('散点图')
plt.tight_layout()  # 自动调整子图间距
plt.show()

2 非对称布局

import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(3, 3, figure=fig)
# 创建不同大小的子图
ax1 = fig.add_subplot(gs[0, :])    # 第一行占满
ax2 = fig.add_subplot(gs[1, :-1])  # 第二行前两列
ax3 = fig.add_subplot(gs[1:, -1])  # 最后一列占两行
ax4 = fig.add_subplot(gs[2, 0])    # 第三行第一列
ax5 = fig.add_subplot(gs[2, 1])    # 第三行第二列
# 绘制不同的图表类型
x = np.linspace(0, 10, 100)
# 折线图
ax1.plot(x, np.sin(x), linewidth=2)
ax1.set_title('大图:正弦波')
ax1.grid(True)
# 直方图
data = np.random.randn(1000)
ax2.hist(data, bins=30, alpha=0.7, color='skyblue')
ax2.set_title('直方图')
# 饼图
sizes = [30, 25, 20, 15, 10]
ax3.pie(sizes, labels=['A', 'B', 'C', 'D', 'E'], autopct='%1.1f%%')
ax3.set_title('饼图')
# 柱状图
categories = ['A', 'B', 'C', 'D']
values = [23, 45, 56, 78]
ax4.bar(categories, values, color='lightcoral')
ax4.set_title('柱状图')
# 箱线图
data2 = [np.random.randn(100) for _ in range(4)]
ax5.boxplot(data2)
ax5.set_title('箱线图')
plt.tight_layout()
plt.show()

Seaborn多图展示

1 数据集多维度探索

import seaborn as sns
import pandas as pd
# 加载数据集
tips = sns.load_dataset('tips')
# 创建多子图
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
fig.suptitle('小费数据多维分析', fontsize=16)
# 1. 箱线图:不同性别的小费分布
sns.boxplot(data=tips, x='sex', y='tip', ax=axes[0, 0])
axes[0, 0].set_title('性别与消费')
# 2. 小提琴图:不同时间的小费分布
sns.violinplot(data=tips, x='time', y='tip', ax=axes[0, 1])
axes[0, 1].set_title('用餐时间与消费')
# 3. 散点图:总消费与消费的关系
sns.scatterplot(data=tips, x='total_bill', y='tip', 
                hue='time', style='sex', ax=axes[0, 2])
axes[0, 2].set_title('消费与消费关系')
# 4. 热力图:数值列的相关系数
numeric_cols = tips.select_dtypes(include=[np.number]).columns
corr_matrix = tips[numeric_cols].corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', ax=axes[1, 0])
axes[1, 0].set_title('特征相关性')
# 5. 柱状图:每日消费总额
daily_tips = tips.groupby('day')['tip'].sum().reset_index()
sns.barplot(data=daily_tips, x='day', y='tip', ax=axes[1, 1])
axes[1, 1].set_title('每日消费总额')
# 6. 直方图:消费分布
sns.histplot(data=tips, x='total_bill', bins=20, kde=True, ax=axes[1, 2])
axes[1, 2].set_title('消费分布')
plt.tight_layout()
plt.show()

交互式多图展示(Plotly)

import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 创建2x2的子图
fig = make_subplots(
    rows=2, cols=2,
    subplot_titles=('折线图', '柱状图', '散点图', '饼图'),
    specs=[[{'type': 'scatter'}, {'type': 'bar'}],
           [{'type': 'scatter'}, {'type': 'pie'}]]
)
# 生成示例数据
x = list(range(10))
y1 = [i**2 for i in x]
y2 = [i*2 for i in x]
categories = ['A', 'B', 'C', 'D', 'E']
values = [20, 35, 30, 25, 15]
# 添加子图
fig.add_trace(
    go.Scatter(x=x, y=y1, mode='lines+markers', name='二次函数'),
    row=1, col=1
)
fig.add_trace(
    go.Bar(x=categories, y=values, name='柱状图'),
    row=1, col=2
)
fig.add_trace(
    go.Scatter(x=x, y=y2, mode='markers', 
               marker=dict(size=10, color=y2, colorscale='Viridis'),
               name='散点图'),
    row=2, col=1
)
fig.add_trace(
    go.Pie(labels=categories, values=values, name='饼图'),
    row=2, col=2
)
# 更新布局
fig.update_layout(height=600, width=1000, 
                  title_text="Plotly交互式多图展示")
fig.show()

实际数据分析案例

1 销售数据分析

# 模拟销售数据
np.random.seed(42)
dates = pd.date_range('2023-01-01', '2023-12-31', freq='M')
sales_data = pd.DataFrame({
    '月份': dates.month.map(lambda x: f'2023-{x:02d}'),
    '销售额': np.random.randint(1000, 5000, 12),
    '利润': np.random.randint(100, 1000, 12),
    '客户数': np.random.randint(50, 200, 12)
})
# 创建多子图分析
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. 月度销售趋势
axes[0, 0].plot(sales_data['月份'], sales_data['销售额'], 
                marker='o', linewidth=2, color='#2196F3')
axes[0, 0].set_title('月度销售趋势', fontsize=12, fontweight='bold')
axes[0, 0].tick_params(axis='x', rotation=45)
axes[0, 0].grid(True, alpha=0.3)
# 2. 销售与利润关系
axes[0, 1].scatter(sales_data['销售额'], sales_data['利润'], 
                   s=sales_data['客户数'], alpha=0.6, 
                   c=sales_data['客户数'], cmap='viridis')
axes[0, 1].set_xlabel('销售额')
axes[0, 1].set_ylabel('利润')
axes[0, 1].set_title('销售与利润关系(点大小=客户数)')
# 3. 客户数分布
axes[1, 0].hist(sales_data['客户数'], bins=6, 
                edgecolor='white', color='#FF9800', alpha=0.7)
axes[1, 0].axvline(x=sales_data['客户数'].mean(), 
                   color='red', linestyle='--', 
                   label=f'平均: {sales_data["客户数"].mean():.0f}')
axes[1, 0].legend()
axes[1, 0].set_title('月度客户数分布')
# 4. 利润率饼图
profit_rates = (sales_data['利润'] / sales_data['销售额'] * 100)
colors = plt.cm.Set3(np.linspace(0, 1, 12))
wedges, texts, autotexts = axes[1, 1].pie(
    profit_rates, labels=sales_data['月份'],
    autopct='%1.1f%%', colors=colors,
    startangle=90
)
axes[1, 1].set_title('各月利润率占比')
plt.suptitle('2023年销售数据综合分析', fontsize=16, y=1.02)
plt.tight_layout()
plt.show()

高级自定义布局

1 嵌套布局

# 创建嵌套子图
fig = plt.figure(figsize=(12, 10))
# 外层网格
outer_grid = gridspec.GridSpec(2, 2, figure=fig, wspace=0.3, hspace=0.3)
# 左上角 - 内部再分4个小子图
inner_grid_1 = gridspec.GridSpecFromSubplotSpec(2, 2, 
    subplot_spec=outer_grid[0, 0], wspace=0.2, hspace=0.2)
for i in range(4):
    ax = fig.add_subplot(inner_grid_1[i])
    ax.plot(np.random.randn(20))
    ax.set_title(f'子图{i+1}', fontsize=8)
# 右上角 - 大图
ax_right = fig.add_subplot(outer_grid[0, 1])
x = np.linspace(0, 2*np.pi, 100)
ax_right.plot(x, np.sin(x), 'b-', linewidth=2, label='sin(x)')
ax_right.plot(x, np.cos(x), 'r--', linewidth=2, label='cos(x)')
ax_right.legend()
ax_right.set_title('三角函数', fontsize=12)
ax_right.grid(True, alpha=0.3)
# 下方两个子图
for i, color in enumerate(['#4CAF50', '#FF5722']):
    ax = fig.add_subplot(outer_grid[1, i])
    data = np.random.randn(1000)
    ax.hist(data, bins=30, color=color, alpha=0.7, edgecolor='white')
    ax.set_title(f'直方图 {i+1}', fontsize=12)
    ax.axvline(x=data.mean(), color='black', linestyle='--', 
               linewidth=2, label=f'均值: {data.mean():.2f}')
    ax.legend()
plt.suptitle('复杂嵌套布局示例', fontsize=16, y=0.95)
plt.show()
  1. 布局选择

    • 简单规则布局:plt.subplots()
    • 复杂布局:gridspec
    • 交互式:plotly.subplots
  2. 美化技巧

    # 统一设置样式
    plt.style.use('seaborn-v0_8-darkgrid')
    # 自动调整布局
    plt.tight_layout()
    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
  3. 性能优化

    • 大数据集使用scatter代替plot
    • 使用ax.set_xlim()限制显示范围
    • 清除不用的子图:fig.delaxes(ax)

这些案例涵盖了从基础到高级的多图展示技巧,你可以根据实际需求选择合适的方案,如果有特定场景需要实现,欢迎继续提问!

标签: 数据可视化 Matplotlib

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