科学计算与可视化入门教程:Matplotlib与Seaborn详解

科学计算与可视化入门教程:Matplotlib与Seaborn详解

一、环境准备与基础概念

1.1 开发环境搭建

bash



# 创建虚拟环境
conda create -n sci-visual python=3.9
conda activate sci-visual
 
# 安装核心库
pip install numpy pandas matplotlib seaborn jupyterlab

1.2 核心库功能定位

NumPy:提供多维数组运算支持,是科学计算的基础Pandas:数据处理与分析工具,提供DataFrame数据结构Matplotlib:底层可视化库,支持几乎所有图表类型的绘制Seaborn:基于Matplotlib的高级封装,专注统计数据可视化JupyterLab:交互式编程环境,支持代码、文本、图表混排

1.3 基本概念入门

Figure:画布,所有图表的基础容器Axes:子图,一个Figure可包含多个Axes图表类型
基础图表:折线图、散点图、柱状图、直方图统计图表:箱线图、热力图、小提琴图、聚类图高级图表:3D图、地理分布图、交互式图表

二、Matplotlib基础操作

2.1 基础绘图流程

python



import numpy as np
import matplotlib.pyplot as plt
 
# 1. 准备数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
 
# 2. 创建画布和子图
fig, ax = plt.subplots(figsize=(8, 4))
 
# 3. 绘制图表
ax.plot(x, y, label='sin(x)')
 
# 4. 自定义图表
ax.set_title('正弦函数曲线')
ax.set_xlabel('x值')
ax.set_ylabel('sin(x)值')
ax.legend()
ax.grid(True, linestyle='--', alpha=0.7)
 
# 5. 显示或保存
plt.tight_layout()  # 自动调整布局
plt.savefig('sin_curve.png', dpi=300, bbox_inches='tight')
plt.show()

2.2 常用图表类型实现

折线图(时间序列数据)

python



# 生成示例数据
dates = pd.date_range(start='2023-01-01', periods=30)
values = np.cumsum(np.random.randn(30))
 
# 绘图
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(dates, values, marker='o', linestyle='-', color='#2c7fb8')
ax.set_title('30天数据趋势图', fontproperties='SimHei', fontsize=14)
ax.tick_params(axis='x', rotation=45)
plt.tight_layout()

柱状图(分类数据比较)

python



# 生成示例数据
categories = ['A', 'B', 'C', 'D', 'E']
values1 = np.random.randint(50, 100, size=5)
values2 = np.random.randint(30, 80, size=5)
 
# 绘图
fig, ax = plt.subplots(figsize=(8, 5))
bar_width = 0.35
x = np.arange(len(categories))
ax.bar(x - bar_width/2, values1, bar_width, label='组1')
ax.bar(x + bar_width/2, values2, bar_width, label='组2')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
ax.set_title('两组数据对比', fontproperties='SimHei')

散点图(相关性分析)

python



# 生成示例数据
np.random.seed(42)
x = np.random.randn(100)
y = 2*x + np.random.randn(100)*0.5
colors = np.random.rand(100)
sizes = np.abs(np.random.randn(100)) * 100
 
# 绘图
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y, c=colors, s=sizes, alpha=0.6, cmap='viridis')
ax.set_xlabel('X值')
ax.set_ylabel('Y值')
ax.set_title('相关性散点图')
plt.colorbar(scatter, label='颜色强度')

2.3 中文显示问题解决

python



# 全局设置方法
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
 
# 局部设置方法
fig, ax = plt.subplots()
ax.set_title('中文标题', fontproperties='SimHei', fontsize=14)

三、Seaborn高级可视化

3.1 Seaborn核心优势

内置美观的主题风格,默认效果优于Matplotlib专为统计数据可视化设计,支持复杂图表一键生成与Pandas DataFrame无缝集成,简化数据处理流程内置多种调色板,支持主题定制

3.2 主题与风格设置

python



import seaborn as sns
 
# 设置主题
sns.set_theme(style="whitegrid", context="talk", palette="viridis")
# 可选风格:white, dark, whitegrid, darkgrid, ticks
# 可选上下文:paper, notebook, talk, poster(控制元素大小)
 
# 临时设置
with sns.axes_style("darkgrid"):
    plt.plot(x, y)

3.3 统计图表示例

箱线图(数据分布比较)

python



# 加载示例数据
tips = sns.load_dataset("tips")  # 内置数据集:餐厅小费数据
 
# 绘图
fig, ax = plt.subplots(figsize=(10, 6))
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex", ax=ax)
ax.set_title('不同日期和性别顾客的账单分布', fontproperties='SimHei')
ax.legend(title='性别')

热力图(相关性分析)

python



# 加载示例数据
flights = sns.load_dataset("flights")
flights_pivot = flights.pivot("month", "year", "passengers")
 
# 绘图
fig, ax = plt.subplots(figsize=(12, 8))
heatmap = sns.heatmap(flights_pivot, annot=True, fmt='d', cmap='YlGnBu', 
                      linewidths=.5, ax=ax)
ax.set_title('航班乘客热力图', fontproperties='SimHei')
plt.tight_layout()

联合分布图(双变量关系)

python



# 绘图
g = sns.jointplot(data=tips, x="total_bill", y="tip", hue="smoker",
                  kind="scatter", height=8)
g.fig.suptitle('账单金额与小费关系', y=1.02, fontproperties='SimHei')

3.4 多子图组合

python



# 创建多子图
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
sns.histplot(data=tips, x="total_bill", ax=axes[0,0])
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time", ax=axes[0,1])
sns.boxplot(data=tips, x="day", y="tip", ax=axes[1,0])
sns.lineplot(data=flights, x="month", y="passengers", ax=axes[1,1])
 
# 调整布局和标题
plt.suptitle('多子图组合示例', fontproperties='SimHei', fontsize=16, y=1.02)
plt.tight_layout()

四、实战案例:数据分析与可视化全流程

4.1 案例背景

分析某电商平台销售数据,包括销售额趋势、产品类别分布、用户消费行为等维度。

4.2 数据准备

python



import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
 
# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei"]
plt.rcParams['axes.unicode_minus'] = False
 
# 生成模拟数据
dates = pd.date_range(start='2023-01-01', end='2023-12-31')
product_categories = ['电子产品', '服装', '食品', '图书', '家居']
 
np.random.seed(42)
data = {
    '日期': np.random.choice(dates, size=1000),
    '产品类别': np.random.choice(product_categories, size=1000),
    '销售额': np.random.randint(50, 2000, size=1000),
    '用户年龄': np.random.randint(18, 65, size=1000),
    '性别': np.random.choice(['男', '女'], size=1000, p=[0.45, 0.55])
}
df = pd.DataFrame(data)
df['月份'] = df['日期'].dt.to_period('M')  # 按月聚合

4.3 多维度可视化分析

1. 销售额月度趋势

python



monthly_sales = df.groupby('月份')['销售额'].sum().reset_index()
 
fig, ax = plt.subplots(figsize=(12, 6))
sns.lineplot(data=monthly_sales, x='月份', y='销售额', marker='o', ax=ax)
ax.set_title('2023年销售额月度趋势', fontsize=15)
ax.tick_params(axis='x', rotation=45)
ax.axhline(monthly_sales['销售额'].mean(), color='r', linestyle='--', 
           label=f'平均值: {monthly_sales["销售额"].mean():.0f}')
ax.legend()
plt.tight_layout()

2. 产品类别销售分布

python



category_sales = df.groupby('产品类别')['销售额'].agg(['sum', 'count']).reset_index()
category_sales.columns = ['产品类别', '总销售额', '订单数']
 
# 创建双轴图
fig, ax1 = plt.subplots(figsize=(10, 6))
sns.barplot(data=category_sales, x='产品类别', y='总销售额', ax=ax1, color='skyblue')
ax1.set_ylabel('总销售额')
ax1.set_title('产品类别销售分析', fontsize=15)
 
ax2 = ax1.twinx()
sns.lineplot(data=category_sales, x='产品类别', y='订单数', marker='s', 
             ax=ax2, color='red', label='订单数')
ax2.set_ylabel('订单数')
ax2.legend()

3. 用户特征与消费关系

python



# 创建年龄分组
df['年龄组'] = pd.cut(df['用户年龄'], bins=[18, 25, 35, 45, 65], 
                    labels=['18-25', '26-35', '36-45', '46-65'])
 
fig, axes = plt.subplots(1, 2, figsize=(16, 7))
 
# 年龄组销售额分布
sns.boxplot(data=df, x='年龄组', y='销售额', ax=axes[0])
axes[0].set_title('不同年龄组销售额分布')
 
# 性别与产品类别交叉分析
pivot_data = df.pivot_table(index='产品类别', columns='性别', values='销售额', aggfunc='mean')
sns.heatmap(pivot_data, annot=True, fmt='.0f', cmap='Blues', ax=axes[1])
axes[1].set_title('不同性别在各类别产品的平均消费')
 
plt.tight_layout()

4.4 可视化报告整合

python



# 创建一个包含多个子图的综合报告
fig, axes = plt.subplots(2, 2, figsize=(18, 14))
fig.suptitle('电商销售数据分析报告', fontsize=20, fontproperties='SimHei')
 
# 1. 月度趋势图
sns.lineplot(data=monthly_sales, x='月份', y='销售额', marker='o', ax=axes[0,0])
axes[0,0].set_title('月度销售额趋势')
axes[0,0].tick_params(axis='x', rotation=45)
 
# 2. 产品类别占比
axes[0,1].pie(category_sales['总销售额'], labels=category_sales['产品类别'], 
              autopct='%1.1f%%', startangle=90)
axes[0,1].set_title('产品类别销售占比')
 
# 3. 年龄与销售额关系
sns.scatterplot(data=df, x='用户年龄', y='销售额', hue='产品类别', 
                alpha=0.6, ax=axes[1,0])
axes[1,0].set_title('年龄与销售额散点图')
 
# 4. 性别消费对比
sns.boxplot(data=df, x='性别', y='销售额', hue='产品类别', ax=axes[1,1])
axes[1,1].set_title('不同性别和产品类别的消费分布')
 
plt.tight_layout(rect=[0, 0, 1, 0.96])  # 为suptitle留出空间
plt.savefig('销售数据分析报告.png', dpi=300, bbox_inches='tight')

五、高级技巧与最佳实践

5.1 图表保存与导出

python



# 保存为多种格式
plt.savefig('figure.png', dpi=300, bbox_inches='tight')  # PNG格式
plt.savefig('figure.svg', format='svg')  # SVG矢量图,适合印刷
plt.savefig('figure.pdf', format='pdf')  # PDF格式,支持无损缩放
 
# 设置清晰度和大小
fig, ax = plt.subplots(figsize=(8, 5), dpi=100)  # 创建时设置DPI

5.2 交互式可视化

python



# 安装交互式库
# pip install plotly
 
import plotly.express as px
 
# 创建交互式散点图
fig = px.scatter(df, x='用户年龄', y='销售额', color='产品类别', 
                 size='销售额', hover_data=['日期'], 
                 title='交互式销售额散点图')
fig.show()  # 在浏览器中打开或在Jupyter中显示

5.3 常见问题解决方案

中文显示问题

python



# 方法1:设置全局字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
 
# 方法2:安装额外字体
# 1. 下载SimHei字体文件
# 2. 复制到matplotlib字体目录:
#    import matplotlib
#    print(matplotlib.get_data_path() + "/fonts/ttf/")
# 3. 清除缓存:rm -rf ~/.cache/matplotlib

图表元素调整

python



# 调整图例位置
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')  # 图例放在图外
 
# 设置坐标轴范围
ax.set_xlim(0, 100)
ax.set_ylim(-1, 1)
 
# 自定义刻度
ax.set_xticks([0, 25, 50, 75, 100])
ax.set_xticklabels(['0%', '25%', '50%', '75%', '100%'])

批量生成图表

python



# 循环生成多类别图表
for category in product_categories:
    subset = df[df['产品类别'] == category]
    fig, ax = plt.subplots(figsize=(8, 5))
    sns.histplot(subset['销售额'], kde=True, ax=ax)
    ax.set_title(f'{category}销售额分布')
    plt.savefig(f'{category}_销售额分布.png', dpi=300)
    plt.close()  # 关闭图表避免内存占用

六、学习资源与进阶路径

推荐学习资源

官方文档

Matplotlib官方教程Seaborn官方教程Pandas可视化教程

在线课程

Coursera:”Python数据科学专项课程”(密歇根大学)DataCamp:”Data Visualization with Python”

书籍

《Python数据可视化之美》《Matplotlib for Python Developers》《Python for Data Analysis》(Wes McKinney)

进阶学习路径

基础阶段:掌握Matplotlib基础语法和Seaborn常用图表中级阶段:学习统计可视化、自定义主题和复杂图表组合高级阶段:交互式可视化(Plotly)、地理信息可视化、3D可视化专业方向
科学论文图表制作商业数据可视化报告仪表盘开发(Dashboard)数据艺术创作

通过本教程的学习,读者可以掌握科学计算与数据可视化的核心技能,为数据分析、机器学习等后续学习打下坚实基础。建议结合实际数据集进行练习,逐步提升可视化思维和技能水平。

© 版权声明

相关文章

暂无评论

none
暂无评论...