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

《Python星球日记》第26天:Matplotlib 可视化

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
订阅专栏:《Python星球日记》

目录

    • 一、Matplotlib 简介
      • 1. 什么是 Matplotlib?为什么使用 Matplotlib?
      • 2. 安装与导入
    • 二、基本绘图
      • 1. 绘制折线图:`plot()`
        • 绘制多条线
        • 自定义线条样式
      • 2. 绘制柱状图:`bar()` 和 `barh()`
        • 垂直柱状图
        • 水平柱状图
        • 分组柱状图
      • 3. 绘制饼图:`pie()`
    • 三、图形美化
      • 1. 添加标题、标签、图例
        • 标题和标签
        • 图例
      • 2. 调整颜色、样式、网格
        • 设置样式
        • 设置颜色和透明度
        • 添加网格
      • 3. 调整坐标轴
      • 4. 子图布局
    • 四、练习:可视化销售数据趋势
      • 1️⃣准备数据
      • 2️⃣绘制销售趋势图表
      • 3️⃣分析与总结
    • 五、总结与拓展
      • 1. 核心知识点回顾
      • 2. 进阶技巧
      • 3. 学习资源推荐

👋 专栏介绍: Python星球日记专栏介绍(持续更新ing)
上一篇: Python星球日记 - 第22天:NumPy 基础

欢迎来到Python星球🪐的第26天!

今天我们将学习Matplotlib,Python中最流行的数据可视化库。通过本文,你将了解如何创建各种类型的图表,以及如何美化它们,让你的数据"说话"更有说服力。

一、Matplotlib 简介

1. 什么是 Matplotlib?为什么使用 Matplotlib?

Matplotlib 是 Python 中最流行的绘图库,它提供了一个完整的 2D 绘图环境,可以创建出具有出版质量的图形。

John Hunter 于 2003 年创建,最初的目的是为了复现 MATLAB 的绘图功能

在这里插入图片描述

为什么要使用 Matplotlib?以下是几个主要原因:

  • 功能丰富:支持线图、散点图、柱状图、饼图、直方图等多种图表类型
  • 高度可定制:几乎每个图形元素都可以自定义
  • 广泛集成:与 NumPy、Pandas 和其他科学计算库紧密集成
  • 行业标准:在数据科学、机器学习和科学研究中被广泛使用
  • 跨平台:支持多种输出格式,包括 PNG、PDF、SVG、EPS 等

Matplotlib 的架构主要分为两种接口

  • pyplot 接口:提供类似 MATLAB 的命令式绘图方式,适合简单快速的绘图
  • 面向对象接口:提供更精确的控制和更复杂的图形组合,适合高度自定义的图表
    在这里插入图片描述

2. 安装与导入

安装 Matplotlib 非常简单,可以使用 pip 或 conda:

# 使用 pip 安装
pip install matplotlib

# 使用 conda 安装
conda install matplotlib

在代码中导入 Matplotlib

# 标准导入方式
import matplotlib.pyplot as plt
import numpy as np  # 通常还需要导入 NumPy 进行数据处理

注意plt 是导入 matplotlib.pyplot 的常用别名,几乎所有 Python 数据科学代码都使用这个约定。

二、基本绘图

Matplotlib 提供了多种基本图表类型。下面我们将学习最常用的三种:折线图、柱状图和饼图。

在这里插入图片描述

1. 绘制折线图:plot()

折线图是最基本的图表类型,用于展示数据的变化趋势。使用 plt.plot() 函数可以轻松创建:

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 准备数据
x = np.linspace(0, 10, 100)  # 从0到10创建100个等间距的点
y = np.sin(x)                # 计算每个点的正弦值

# 绘制折线图
plt.figure(figsize=(8, 4))   # 创建画布,设置大小为 8x4 英寸
plt.plot(x, y)               # 绘制折线图
plt.title('正弦函数')         # 添加标题
plt.xlabel('x')              # 添加 x 轴标签
plt.ylabel('sin(x)')         # 添加 y 轴标签
plt.grid(True)               # 添加网格线
plt.show()                   # 显示图形

输出结果:
在这里插入图片描述

绘制多条线

你可以在一个图表上绘制多条线,只需多次调用 plot() 函数:

plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), label='sin(x)')     # 绘制正弦函数
plt.plot(x, np.cos(x), label='cos(x)')     # 绘制余弦函数
plt.plot(x, np.tan(x), label='tan(x)')     # 绘制正切函数

plt.title('三角函数')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()                               # 添加图例
plt.grid(True)
plt.show()
自定义线条样式

可以通过格式字符串或关键字参数自定义线条的样式:

plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), 'r-', linewidth=2)         # 红色实线
plt.plot(x, np.cos(x), 'b--', linewidth=2)        # 蓝色虚线
plt.plot(x, np.sin(x) + np.cos(x), 'g-.', linewidth=2)  # 绿色点划线
plt.show()

样式字符串的构成:

  • 颜色:‘r’ (红)、‘g’ (绿)、‘b’ (蓝)、‘c’ (青)、‘m’ (洋红)、‘y’ (黄)、‘k’ (黑)、‘w’ (白)
  • 线型:‘-’ (实线)、‘–’ (虚线)、‘-.’ (点划线)、‘:’ (点线)
  • 标记:‘o’ (圆点)、‘s’ (方块)、‘^’ (三角形)、‘*’ (星号)等

2. 绘制柱状图:bar()barh()

柱状图用于比较不同类别的数据大小,分为垂直柱状图(bar())和水平柱状图(barh())。

垂直柱状图
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 准备数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [25, 40, 30, 55, 15]

# 创建垂直柱状图
plt.figure(figsize=(8, 6))
plt.bar(categories, values, color='skyblue', edgecolor='navy')
plt.title('各类别数据比较')
plt.xlabel('类别')
plt.ylabel('数值')
plt.show()

在这里插入图片描述

水平柱状图
plt.figure(figsize=(8, 6))
plt.barh(categories, values, color='skyblue', edgecolor='navy')
plt.title('各类别数据比较')
plt.xlabel('数值')
plt.ylabel('类别')
plt.show()
分组柱状图

分组柱状图用于比较多个数据集:

# 准备数据
categories = ['A', 'B', 'C', 'D', 'E']
values1 = [25, 40, 30, 55, 15]
values2 = [15, 30, 40, 20, 35]

# 设置柱状图位置
x = np.arange(len(categories))  # 类别标签位置
width = 0.35  # 柱子宽度

# 创建分组柱状图
plt.figure(figsize=(10, 6))
plt.bar(x - width/2, values1, width, label='组1', color='skyblue')
plt.bar(x + width/2, values2, width, label='组2', color='lightgreen')

# 添加标签和图例
plt.title('两组数据比较')
plt.xlabel('类别')
plt.ylabel('数值')
plt.xticks(x, categories)  # 替换 x 轴刻度标签
plt.legend()
plt.grid(True, axis='y')  # 只显示水平网格线
plt.show()

3. 绘制饼图:pie()

饼图用于显示数据的比例关系,特别适合表示占比或分布情况。

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 准备数据
labels = ['A', 'B', 'C', 'D', 'E']
sizes = [15, 30, 25, 10, 20]  # 各部分大小
explode = (0, 0.1, 0, 0, 0)   # 突出显示第二部分
colors = ['gold', 'lightcoral', 'lightskyblue', 'lightgreen', 'lightpink']  # 各部分颜色

# 创建饼图
plt.figure(figsize=(8, 8))
plt.pie(sizes, explode=explode, labels=labels, colors=colors, 
        autopct='%1.1f%%',  # 显示百分比格式
        shadow=True,        # 添加阴影
        startangle=90)      # 起始角度
plt.axis('equal')           # 确保饼图是圆形的
plt.title('数据占比分布')
plt.show()

输出结果:

在这里插入图片描述

饼图的主要参数:

  • sizes:各部分的大小
  • explode:特定部分的突出显示
  • labels:各部分的标签
  • colors:各部分的颜色
  • autopct:显示百分比的格式
  • shadow:是否添加阴影效果
  • startangle:起始角度

三、图形美化

默认的 Matplotlib 图形样式较为简单,通过一些美化设置可以让图表更加专业和美观。

1. 添加标题、标签、图例

标题和标签
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))

# 添加标题和标签
plt.title('正弦函数图', fontsize=16)          # 添加标题,设置字体大小
plt.xlabel('X 轴', fontsize=12)               # 添加 x 轴标签
plt.ylabel('Y 轴', fontsize=12)               # 添加 y 轴标签

# 添加文本注释
plt.text(5, 0.5, 'sin(x) 的最大值是 1', fontsize=12)

plt.show()
图例

图例帮助识别图表中的不同数据系列:

plt.figure(figsize=(10, 6))

# 绘制多条线并设置标签
plt.plot(x, np.sin(x), 'r-', label='sin(x)')
plt.plot(x, np.cos(x), 'b--', label='cos(x)')
plt.plot(x, np.sin(x) * np.cos(x), 'g-.', label='sin(x)·cos(x)')

# 添加图例
plt.legend(loc='best',          # 自动选择最佳位置
           fontsize=12,         # 设置字体大小
           frameon=True,        # 显示边框
           shadow=True)         # 添加阴影效果

plt.show()

图例位置选项:

  • 'best':自动选择最佳位置
  • 'upper right', 'upper left', 'lower right', 'lower left':四个角
  • 'center', 'center left', 'center right', 'lower center', 'upper center':中心和边缘

2. 调整颜色、样式、网格

设置样式

Matplotlib 提供了多种预设样式可供选择:

# 查看可用样式
print(plt.style.available)

# 设置样式
plt.style.use('seaborn-v0_8-darkgrid')  # 使用 Seaborn 暗网格样式

plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))
plt.title('使用 Seaborn 样式的图表')
plt.show()

常用样式包括:‘ggplot’, ‘seaborn’, ‘bmh’, ‘dark_background’, ‘fivethirtyeight’ 等。

设置颜色和透明度
plt.figure(figsize=(10, 6))

# 设置颜色和透明度
plt.plot(x, np.sin(x), color='#FF5733', alpha=0.8, linewidth=2)
plt.fill_between(x, np.sin(x), alpha=0.3, color='#FF5733')  # 添加填充区域

plt.title('带填充区域的正弦函数')
plt.show()

颜色可以通过名称(如 ‘red’)、十六进制代码(如 ‘#FF5733’)或 RGB 元组(如 (1, 0, 0))指定。

添加网格
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))

# 添加网格
plt.grid(True,               # 显示网格
         linestyle='--',     # 虚线样式
         alpha=0.7,          # 透明度
         color='gray')       # 颜色

plt.show()

3. 调整坐标轴

plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))

# 设置坐标轴范围
plt.xlim(0, 10)              # 设置 x 轴范围
plt.ylim(-1.5, 1.5)          # 设置 y 轴范围

# 设置刻度
plt.xticks(np.arange(0, 11, 2))          # 设置 x 轴刻度
plt.yticks([-1, -0.5, 0, 0.5, 1])        # 设置 y 轴刻度

plt.show()

4. 子图布局

使用 subplot 可以在一个图形中创建多个子图:

plt.figure(figsize=(12, 8))

# 创建 2x2 布局的子图
plt.subplot(2, 2, 1)  # 第一行第一列
plt.plot(x, np.sin(x))
plt.title('sin(x)')

plt.subplot(2, 2, 2)  # 第一行第二列
plt.plot(x, np.cos(x), 'g-')
plt.title('cos(x)')

plt.subplot(2, 2, 3)  # 第二行第一列
plt.plot(x, np.sin(x) * np.cos(x), 'r-')
plt.title('sin(x)·cos(x)')

plt.subplot(2, 2, 4)  # 第二行第二列
plt.plot(x, np.sin(x) + np.cos(x), 'm-')
plt.title('sin(x)+cos(x)')

plt.tight_layout()  # 自动调整子图参数,使之填充整个图像区域
plt.show()

四、练习:可视化销售数据趋势

现在,让我们应用所学知识,创建一个销售数据可视化案例。

1️⃣准备数据

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.ticker import StrMethodFormatter

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  
plt.rcParams['axes.unicode_minus'] = False

# 生成销售数据
np.random.seed(42)  # 设置随机种子,确保结果可重现

# 创建月份数据
months = pd.date_range(start='2023-01-01', periods=12, freq='ME')
month_labels = [m.strftime('%Y-%m') for m in months]

# 创建三种产品的销售数据
product_A = np.random.randint(100, 200, size=12) * (1 + np.sin(np.linspace(0, 2*np.pi, 12)) * 0.2)
product_B = np.random.randint(150, 250, size=12) * (1 + np.cos(np.linspace(0, 2*np.pi, 12)) * 0.1)
product_C = np.random.randint(80, 180, size=12) * (1 + 0.05 * np.arange(12))  # 线性增长趋势

# 创建 DataFrame
sales_data = pd.DataFrame({
    '月份': month_labels,
    '产品A': product_A,
    '产品B': product_B,
    '产品C': product_C
})

# 计算总销售额
sales_data['总销售额'] = sales_data['产品A'] + sales_data['产品B'] + sales_data['产品C']

print(sales_data.head())

输出结果:

在这里插入图片描述

2️⃣绘制销售趋势图表

# 设置绘图样式
plt.style.use('seaborn-v0_8-whitegrid')

# 创建一个大画布,包含多个子图
plt.figure(figsize=(15, 10))

# 1. 绘制各产品月度销售趋势折线图
plt.subplot(2, 2, 1)
plt.plot(sales_data['月份'], sales_data['产品A'], 'o-', label='产品A', linewidth=2)
plt.plot(sales_data['月份'], sales_data['产品B'], 's-', label='产品B', linewidth=2)
plt.plot(sales_data['月份'], sales_data['产品C'], '^-', label='产品C', linewidth=2)

plt.title('各产品月度销售趋势', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额', fontsize=12)
plt.xticks(rotation=45)  # 旋转 x 轴标签,防止重叠
plt.legend()
plt.grid(True)

# 2. 绘制总销售额柱状图
plt.subplot(2, 2, 2)
bars = plt.bar(sales_data['月份'], sales_data['总销售额'], color='skyblue', edgecolor='navy')

# 为柱状图添加数值标签
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2., height + 5,
            f'{int(height)}',
            ha='center', va='bottom', fontsize=9)

plt.title('月度总销售额', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额', fontsize=12)
plt.xticks(rotation=45)
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))  # 设置 y 轴格式

# 3. 绘制每月各产品销售占比(堆叠柱状图)
plt.subplot(2, 2, 3)
bottom = np.zeros(12)  # 初始底部位置

for product, color in zip(['产品A', '产品B', '产品C'], ['#5DA5DA', '#FAA43A', '#60BD68']):
    plt.bar(sales_data['月份'], sales_data[product], bottom=bottom, 
            label=product, color=color, alpha=0.8)
    bottom += sales_data[product]  # 更新底部位置

plt.title('月度产品销售比例', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额', fontsize=12)
plt.xticks(rotation=45)
plt.legend()

# 4. 绘制三种产品总销售额占比(饼图)
plt.subplot(2, 2, 4)
product_totals = [sales_data['产品A'].sum(), sales_data['产品B'].sum(), sales_data['产品C'].sum()]
labels = ['产品A', '产品B', '产品C']
colors = ['#5DA5DA', '#FAA43A', '#60BD68']
explode = (0.05, 0, 0)  # 突出显示产品A

plt.pie(product_totals, labels=labels, colors=colors, 
        autopct='%1.1f%%', startangle=90, explode=explode, shadow=True)
plt.axis('equal')  # 保证饼图是圆的
plt.title('各产品销售总额占比', fontsize=14)

# 调整布局
plt.tight_layout()
plt.savefig('sales_analysis.png', dpi=300, bbox_inches='tight')  # 保存图表
plt.show()

输出结果:

在这里插入图片描述

3️⃣分析与总结

通过上面的可视化图表,我们可以清晰地看到:

  1. 销售趋势:折线图展示了各产品每月的销售变化趋势,可以观察到季节性波动和长期趋势。
  2. 销售规模:柱状图直观地展示了每月的总销售额,便于比较不同月份的销售表现。
  3. 产品结构:堆叠柱状图展示了每月各产品的销售构成,饼图则展示了全年各产品的销售比例。

这种综合性的可视化方式,可以帮助我们从多个角度分析销售数据,发现潜在的商业机会和挑战。

五、总结与拓展

1. 核心知识点回顾

在本文中,我们学习了:

- `Matplotlib 的基本概念`:包括其架构、用途和导入方式
- `基本图表类型`:如何创建折线图、柱状图和饼图
- `图形美化技巧`:如何添加标题、标签、图例,以及调整颜色、样式和网格
- `实战应用`:如何将多种图表类型组合使用,进行综合性的数据可视化

2. 进阶技巧

如果你想进一步提升 Matplotlib 可视化技能,可以探索以下内容:

  • 更多图表类型:如散点图、直方图、箱线图、热力图等
  • 3D 绘图:使用 mplot3d 工具包创建三维图表
  • 交互式图表:结合 ipywidgets 创建交互式可视化
  • 动画:使用 animation 模块创建动态图表
  • 与 Pandas 结合:使用 Pandas 的 plot() 方法,简化数据可视化流程

3. 学习资源推荐

  • 官方文档:Matplotlib 官方文档
  • 图例集:Matplotlib 图例集
  • 在线教程:Datacamp、Coursera 上的 Python 数据可视化课程
  • 书籍:《Python for Data Analysis》和《Python Data Science Handbook》

在下一篇文章中,我们将探索另一个强大的可视化库 Seaborn,它基于 Matplotlib 构建,提供了更高级的统计图表和更优雅的默认样式。

关键词:Python, Matplotlib, 数据可视化, 绘图, 折线图, 柱状图, 饼图, 图表美化, CSDN Python教程

练习题

  1. 尝试结合 Pandas 和 Matplotlib,可视化一个包含多个变量的真实数据集(如气温、股票价格等)。
  2. 创建一个包含 4 个子图的画布,分别用不同类型的图表展示同一数据集的不同特征。
  3. 探索 Matplotlib 的颜色映射(colormap)功能,尝试使用不同的颜色方案来增强可视化效果。

希望这篇文章能帮助你掌握 Matplotlib 的基础知识,开始创建引人注目的数据可视化作品,如有问题,欢迎在评论区留言交流!

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果你对今天的内容有任何问题,或者想分享你的学习心得,欢迎在评论区留言讨论!

相关文章:

  • SEER: Self-Aligned Evidence Extraction for Retrieval-AugmentedGeneration
  • SQL 查询中涉及的表及其作用说明
  • docker compose方式安装ClickHouse数据库
  • 工会考试重点内容有哪些:核心考点与备考指南
  • 软考-数据库系统工程师(15万词+400张图片)(一)
  • SFM/MVS_NERF_3DGAUSS三维重建
  • linux内核升级
  • 行业案例 | SAS 基于 SQL 托管实例构建高弹性安全的数据平台
  • 低频rfid手持机,助力动物耳标智能化管理
  • 管理大规模监控技术栈的最佳实践
  • 【数据结构与算法】包装类初识泛型
  • 拓扑排序 —— 2. 力扣刷题207. 课程表
  • 14.1 - VDMA彩条显示实验之固定分辨率
  • 【Javascript】在canvas中加载shader着色器的方法(开箱即用)
  • 102.二叉树的层序遍历- 力扣(LeetCode)
  • JavaScript Number 对象
  • Unity中使用FMETP STREAM传输实时画面
  • python全栈-vue框架
  • Hibernate:让对象与数据库无缝对话的全自动ORM框架
  • CesiumEarth能够本地浏览的三维倾斜模型切片(3DTiles)
  • 青岛 网站维护/seo网站推广培训
  • 北京上地网站建设/亚马逊关键词搜索工具
  • 做网站挣钱快吗/北京百度公司地址在哪里
  • 做攻略的网站好/百度竞价是什么工作
  • 建设网站费用会计分录/工具seo
  • 域名怎么做网站内容/谷歌搜索引擎优化