当前位置: 首页 > article >正文

Matplotlib完全指南:数据可视化从入门到实战

目录

引言

一、环境配置与基础概念

1.1 安装Matplotlib

1.2 导入惯例

1.3 两种绘图模式

二、基础图形绘制

2.1 折线图(Line Plot)

2.2 柱状图(Bar Chart)

三、高级图表类型

3.1 散点图(Scatter Plot)

3.2 饼图(Pie Chart)

3.3 直方图(Histogram)

四、多图布局与样式定制

4.1 子图布局(Subplots)

4.2 样式定制(StyleCustomization)

五、三维可视化

5.1 3D曲面图

六、实战案例:销售数据分析

案例1:多维度销售趋势分析

案例2:动态交互式可视化

七、高级技巧与优化

7.1 样式美化

7.2 输出高清图像

7.3 性能优化

八、常见问题解决方案

8.1 中文显示问题

8.2 坐标轴科学计数法

结语


引言

Matplotlib是Python最强大的数据可视化库,可以创建高质量的2D/3D图形,完美支持科学计算与数据分析。本文将深入讲解Matplotlib的核心功能,通过20+个实战案例,带你从基础绘图到高级可视化技巧,全面掌握数据图形化表达!


一、环境配置与基础概念

1.1 安装Matplotlib

pip install matplotlib

1.2 导入惯例

import matplotlib.pyplot as plt  # 主要接口
import numpy as np               # 配合使用

1.3 两种绘图模式

  • 脚本模式

    plt.plot() + plt.show()
  • 面向对象模式(推荐):

    fig, ax = plt.subplots()
    ax.plot(x, y)
     

二、基础图形绘制

2.1 折线图(Line Plot)

x = np.linspace(0, 10, 100)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(8,4))
ax.plot(x, y, 
        color='red', 
        linestyle='--', 
        linewidth=2,
        marker='o',
        markersize=5,
        label='sin(x)')
ax.set_title("正弦曲线示例")
ax.set_xlabel("X轴")
ax.set_ylabel("Y轴")
ax.legend()
plt.show()

2.2 柱状图(Bar Chart)

categories = ['A', 'B', 'C', 'D']
values = [25, 40, 30, 45]

fig, ax = plt.subplots()
bars = ax.bar(categories, values, 
             color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'],
             edgecolor='black')

# 添加数值标签
for bar in bars:
    height = bar.get_height()
    ax.text(bar.get_x() + bar.get_width()/2., height,
            f'{height}',
            ha='center', va='bottom')

ax.set_ylim(0, 50)
ax.grid(axis='y', linestyle='--')


三、高级图表类型

3.1 散点图(Scatter Plot)

x = np.random.randn(100)
y = x * 2 + np.random.randn(100)

fig, ax = plt.subplots()
scatter = ax.scatter(x, y, 
                    c=np.abs(x+y),  # 颜色映射
                    s=50,          # 点大小
                    cmap='viridis',
                    alpha=0.7)
plt.colorbar(scatter, label='强度值')

3.2 饼图(Pie Chart)

labels = ['电子产品', '服饰', '食品', '图书']
sizes = [35, 25, 20, 20]
explode = (0.1, 0, 0, 0)  # 突出显示第一项

fig, ax = plt.subplots()
ax.pie(sizes, 
       explode=explode,
       labels=labels,
       autopct='%1.1f%%',
       shadow=True,
       startangle=90)
ax.axis('equal')  # 正圆形

3.3 直方图(Histogram)

data = np.random.normal(170, 10, 1000)

fig, ax = plt.subplots()
ax.hist(data, bins=30,
        density=True,   # 显示概率密度
        histtype='stepfilled',
        color='skyblue',
        edgecolor='black')
ax.set_xlabel("Height distribution")
ax.set_ylabel("probability density")


四、多图布局与样式定制

4.1 子图布局(Subplots)

x = np.random.randn(100)
y = x * 2 + np.random.randn(100)
data = np.random.normal(170, 10, 1000)
labels = ['electronics', 'costume', 'food', 'book']
sizes = [35, 25, 20, 20]

fig, axs = plt.subplots(2, 2, figsize=(10,8))

# 第一个子图
axs[0,0].plot(x, y)
axs[0,0].set_title("折线图")

# 第二个子图
axs[0,1].scatter(x, y)

# 第三个子图
axs[1,0].hist(data)

# 第四个子图
axs[1,1].pie(sizes, labels=labels)

plt.tight_layout()  # 自动调整间距

4.2 样式定制(StyleCustomization)

x = np.random.randn(10)
y = x * 2 + np.random.randn(10)
plt.style.use('ggplot')  # 使用内置主题

fig, ax = plt.subplots()
ax.plot(x, y, 
        linewidth=2,
        marker='D',
        markersize=8,
        markerfacecolor='yellow',
        markeredgecolor='black')

# 设置刻度参数
ax.tick_params(axis='both', 
              which='major', 
              labelsize=12,
              direction='inout')

# 设置网格线
ax.grid(True, 
       linestyle='--', 
       alpha=0.6)

# 设置坐标轴范围
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)


五、三维可视化

5.1 3D曲面图

from mpl_toolkits.mplot3d import Axes3D

X = np.linspace(-5, 5, 100)
Y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(X, Y)
Z = np.sin(np.sqrt(X**2 + Y**2))

fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, 
                      cmap='viridis',
                      antialiased=True)
fig.colorbar(surf, shrink=0.5)


六、实战案例:销售数据分析

案例1:多维度销售趋势分析

months = ['Jan', 'Feb', 'Mar', 'Apr']
sales_2023 = [120, 145, 178, 205]
sales_2024 = [135, 160, 190, None]  # 模拟缺失值

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,5))

# 左侧:双折线图
ax1.plot(months, sales_2023, marker='o', label='2023')
ax1.plot(months[:3], sales_2024[:3], marker='s', label='2024')
ax1.set_title("月度销售趋势对比")
ax1.legend()

# 右侧:柱状图
ax2.bar(months, sales_2023, alpha=0.7, label='2023')
ax2.bar(months, sales_2024, alpha=0.7, label='2024', 
        bottom=sales_2023)
ax2.set_title("累计销售额对比")

案例2:动态交互式可视化

from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'ro')

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)
plt.show()
 

七、高级技巧与优化

7.1 样式美化

plt.rcParams.update({
    'font.family': 'SimHei',        # 中文字体
    'font.size': 12,
    'axes.titlesize': 14,
    'axes.labelsize': 12
})

7.2 输出高清图像

fig.savefig('output.png', 
           dpi=300,          # 分辨率
           bbox_inches='tight', 
           facecolor='white')

7.3 性能优化

  • 使用ax.plot()替代多次plt.plot()

  • 对于大数据集使用numpy进行预计算

  • 关闭交互模式:plt.ioff()


八、常见问题解决方案

8.1 中文显示问题

# 方法1:指定中文字体
plt.rcParams['font.family'] = 'SimHei'

# 方法2:动态加载字体
from matplotlib.font_manager import FontProperties
font = FontProperties(fname='msyh.ttc', size=12)
ax.set_title("标题", fontproperties=font)

8.2 坐标轴科学计数法

ax.ticklabel_format(axis='y', style='sci', scilimits=(0,0))
 

结语

Matplotlib是数据可视化的瑞士军刀,本文涵盖了其核心功能的80%。建议通过以下方式精进:

  1. 每天练习一种图表类型

  2. 研究优秀可视化案例的源码

  3. 学习结合Pandas直接绘图

  4. 探索Seaborn等高级封装库


http://www.kler.cn/a/597669.html

相关文章:

  • upload-labs靶场学习记录2
  • 再学:区块链基础与合约初探 EVM与GAS机制
  • java开发接口中,响应速度率成倍数提高的方法与策略
  • 基于BClinux8部署Ceph 19.2(squid)集群
  • SQL——创建临时表方法总结
  • 城市街拍人像自拍电影风格Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • Opencv计算机视觉编程攻略-第一节 图像读取与基本处理
  • 百度SEO和必应SEO优化方法
  • 【css酷炫效果】纯CSS实现科技感网格背景
  • JVM运行时数据区内部结构难记?一个例子优化记忆
  • 摄影工作室预约管理系统基于Spring BootSSM
  • 校园自习室预约小程序(源码+部署教程)
  • 基于Spring Boot的健身房管理系统的设计与实现(LW+源码+讲解)
  • python网络爬虫开发实战之网页数据的解析提取
  • 如何在Spring Boot项目中集成LangChain4J开源开发框架
  • 论文阅读:2024-NAACL Semstamp、2024-ACL (Findings) k-SemStamp
  • 【第21节】windows sdk编程:网络编程基础
  • 【Spring】Spring Task详解
  • java设计模式之建造者模式《装修启示录》​
  • MAC-在使用@Async注解的方法时,分布式锁管理和释放