【Python篇】matplotlib超详细教程-由入门到精通(下篇)1

简介: 【Python篇】matplotlib超详细教程-由入门到精通(下篇)

前言

建议把代码复制到pycharm等IDE上面看实际效果,方便理解嗷❤️

第六部分:保存与导出图表

在实际的应用场景中,我们不仅需要在程序中展示图表,有时候还需要将这些图表保存为文件,以便在其他地方使用,比如插入文档、报告或网页中。matplotlib 提供了非常方便的保存图表功能。

6.1 保存为图片文件

matplotlib 可以将生成的图表保存为多种格式的图片文件,比如 PNG、JPG、SVG 等。我们可以通过 savefig() 函数来完成这个操作。

示例:保存图表为 PNG 文件

import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y)

# 添加标题
plt.title('保存为 PNG 文件的示例')

# 保存图表为 PNG 文件
plt.savefig('my_plot.png')

# 显示图表
plt.show()

解释:

  • plt.savefig('my_plot.png'):将当前的图表保存为名为 my_plot.png 的图片文件。默认保存为 PNG 格式。

关键点:

  • savefig() 的参数是文件名,可以指定文件格式。如果没有明确指定格式,它会根据文件名的后缀来确定格式。例如,my_plot.jpg 会保存为 JPG 文件。
  • savefig() 可以在 plt.show() 之前或之后调用,但推荐在 plt.show() 之前保存,这样不会受后续图表显示的影响。

6.2 保存为高分辨率图片

有时候我们需要保存高分辨率的图片,比如用于打印或发布。可以通过 dpi 参数设置分辨率。

示例:保存为高分辨率图片

import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y)

# 添加标题
plt.title('保存为高分辨率 PNG 文件的示例')

# 保存图表为高分辨率的 PNG 文件,dpi 参数设置分辨率
plt.savefig('high_res_plot.png', dpi=300)

# 显示图表
plt.show()

解释:

  • dpi=300:设置图像分辨率为 300 DPI(每英寸像素数),这在出版或打印中通常是常用的高分辨率标准。

6.3 保存为不同文件格式

matplotlib 支持多种文件格式,常见的格式有:

  • PNG:位图格式,常用于网页和应用程序中。
  • JPG:另一种常用的位图格式,但通常会有压缩损失。
  • SVG:矢量图格式,适合在网页中显示,并且在缩放时不会失真。
  • PDF:矢量图格式,适合用于打印和高质量展示。

示例:保存为不同文件格式

import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y)

# 添加标题
plt.title('保存为多种格式的示例')

# 保存为 PNG 文件
plt.savefig('plot.png')

# 保存为 JPG 文件
plt.savefig('plot.jpg')

# 保存为 SVG 文件
plt.savefig('plot.svg')

# 保存为 PDF 文件
plt.savefig('plot.pdf')

# 显示图表
plt.show()

解释:

  • 根据文件的后缀名自动保存为相应的格式。
  • 矢量图 (SVG, PDF) 在放大和缩小时不会失真,适合用于需要缩放的场景。

6.4 调整图表的保存尺寸

我们可以通过 figsize 参数来控制保存的图片大小,figsize 以英寸为单位。

示例:设置图片尺寸并保存

import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表,并设置图像大小为 10x6 英寸
plt.figure(figsize=(10, 6))

# 绘制图表
plt.plot(x, y)

# 添加标题
plt.title('设置图片尺寸并保存')

# 保存图表为指定尺寸的 PNG 文件
plt.savefig('custom_size_plot.png')

# 显示图表
plt.show()

解释:

  • plt.figure(figsize=(10, 6)):设置图像的宽度为 10 英寸,高度为 6 英寸。这样可以控制保存图像的实际尺寸。

6.5 解决中文乱码问题

在绘制带有中文标题或标签的图表时,可能会遇到显示乱码的问题。这是由于 matplotlib 默认使用的字体不支持中文。我们可以通过设置字体来解决这个问题。

示例:解决中文显示乱码

import matplotlib.pyplot as plt

# 导入中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体

# 解决负号 '-' 显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 绘制图表,添加中文标题和标签
plt.plot(x, y)
plt.title('折线图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')

# 显示图表
plt.show()

解释:

  • plt.rcParams['font.sans-serif'] = ['SimHei']:设置默认字体为 SimHei(黑体),以支持中文字符显示。
  • plt.rcParams['axes.unicode_minus'] = False:避免负号显示为方块。

至此,我们已经完成了 matplotlib 的基本操作,并掌握了保存图表的方式。在今后的应用中,可以根据需求保存图表为各种格式,并控制图像的尺寸和分辨率。同时也学会了如何处理中文字符显示的问题。


接下来我们继续深入,学习 matplotlib 的更多高级功能,例如:

  • 绘制 3D 图形
  • 动态图表
  • 动画的创建

第七部分:高级图表定制

在实际的数据可视化中,我们可能不仅仅满足于绘制简单的图表。为了让图表更具表现力和可读性,matplotlib 提供了许多高级的定制功能。这部分内容会深入讲解如何控制图表中的各个元素,使其更贴合实际需求。

7.1 设置坐标轴的范围与刻度

有时候,matplotlib 会自动根据数据的范围来设置坐标轴的范围,但这并不总是理想的。在某些场景下,我们可能需要手动调整坐标轴的范围,以突出重点数据。我们可以使用 xlim()ylim() 方法来设置坐标轴的范围。

示例:手动设置坐标轴范围

import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y)

# 手动设置 X 轴和 Y 轴的范围
plt.xlim(0, 6)  # 设置 X 轴范围为 0 到 6
plt.ylim(0, 30)  # 设置 Y 轴范围为 0 到 30

# 添加标题和坐标轴标签
plt.title('手动设置坐标轴范围的示例')
plt.xlabel('X 轴')
plt.ylabel('Y 轴')

# 显示图表
plt.show()

解释:

  • plt.xlim(0, 6):设置 X 轴的显示范围为 0 到 6。
  • plt.ylim(0, 30):设置 Y 轴的显示范围为 0 到 30。

拓展:

  • 在一些动态数据可视化中,坐标轴范围的设置可以根据实际需要动态调整,从而使得数据更直观。

7.2 自定义坐标轴刻度

除了坐标轴的范围,有时候我们也需要更改刻度的显示,比如让刻度间隔更大或更小,或是使用特定的数字或文本作为刻度标记。

示例:自定义刻度

import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y)

# 自定义 X 轴和 Y 轴的刻度
plt.xticks([0, 1, 2, 3, 4, 5, 6], ['零', '一', '二', '三', '四', '五', '六'])  # 自定义 X 轴刻度为中文
plt.yticks([0, 5, 10, 15, 20, 25, 30], ['0', '5', '10', '15', '20', '25', '30'])

# 添加标题和坐标轴标签
plt.title('自定义刻度的示例')
plt.xlabel('X 轴')
plt.ylabel('Y 轴')

# 显示图表
plt.show()

解释:

  • plt.xticks():自定义 X 轴的刻度及显示内容,可以是数字、文本或其他符号。
  • plt.yticks():自定义 Y 轴的刻度及显示内容。

7.3 添加网格线

为了使数据更加清晰直观,特别是在查看大范围的数据时,网格线 (Grid) 是一个很有用的工具。matplotlib 允许我们为图表添加水平和垂直网格线,并可以定制网格线的样式。

示例:添加网格线

import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y)

# 添加网格线,并设置样式
plt.grid(True, linestyle='--', color='grey', alpha=0.7)

# 添加标题和坐标轴标签
plt.title('添加网格线的示例')
plt.xlabel('X 轴')
plt.ylabel('Y 轴')

# 显示图表
plt.show()

解释:

  • plt.grid(True):开启网格线,True 表示显示网格线。
  • linestyle:设置网格线的线型,例如虚线 '--'
  • color:设置网格线的颜色。
  • alpha:设置网格线的透明度,值为 0 到 1,越接近 1 越不透明。

拓展:

除了基本的添加网格线功能,matplotlib 允许我们对网格线进行更高级的自定义。例如,我们可以单独为 X 轴或 Y 轴添加网格线,改变网格线的密度、样式、颜色等。这些功能特别适用于精细化的图表设计,使数据更容易解读。

7.3.1 为特定轴添加网格线

我们不一定需要为所有的轴都添加网格线。有时,数据只需要在某个特定方向上进行参照。可以通过 axis 参数指定网格线仅应用于 X 轴或 Y 轴。

示例:仅为 Y 轴添加网格线
import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y)

# 仅为 Y 轴添加网格线
plt.grid(True, axis='y', linestyle='--', color='grey', alpha=0.7)

# 添加标题
plt.title('仅为 Y 轴添加网格线')

# 显示图表
plt.show()


解释:
  • axis='y':表示仅为 Y 轴添加网格线。如果想只为 X 轴添加网格线,可以将 axis 设置为 'x'
  • 这样可以避免图表中过多的视觉干扰,突出某个方向的数据信息。

7.3.2 设置网格线的间隔与密度

在某些场景下,默认的网格线密度可能过高或过低。我们可以通过设置主刻度 (major) 和次刻度 (minor) 来控制网格线的间隔与密度。

示例:为次刻度添加网格线
import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y)

# 设置主刻度和次刻度
plt.minorticks_on()  # 打开次刻度
plt.grid(which='major', linestyle='-', linewidth='0.5', color='black')  # 主刻度网格线
plt.grid(which='minor', linestyle=':', linewidth='0.5', color='grey')   # 次刻度网格线

# 添加标题
plt.title('为次刻度添加网格线')

# 显示图表
plt.show()
解释:
  • plt.minorticks_on():打开次刻度。
  • which='major':设置主刻度的网格线样式。
  • which='minor':设置次刻度的网格线样式。

7.3.3 自定义网格线的样式与线宽

matplotlib 允许我们通过不同的线型、线宽、颜色等选项,灵活地调整网格线的外观,使其与图表的整体风格保持一致。

示例:自定义网格线的线型与线宽
import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y)

# 自定义网格线的样式与线宽
plt.grid(True, linestyle='-.', linewidth=2, color='green')

# 添加标题
plt.title('自定义网格线样式与线宽')

# 显示图表
plt.show()
解释:
  • linestyle='-.'::使用点划线的样式作为网格线(类似于点划线)。
  • linewidth=2: 将网格线的宽度设置为 2,这比默认的线宽更粗,更容易看清。

拓展:
  • 在有多个数据系列的复杂图表中,不同的网格线样式有助于将重要数据与背景信息区分开。可以尝试不同的线型,如 '-', '--', ':' 等,调整视觉效果。
  • 同时,使用 alpha 参数可以设置网格线的透明度,以避免网格线过于突出影响数据阅读。

7.3.4 控制网格线的显示层次 (zorder)

matplotlib 中的每个图形元素都有一个 zorder,决定了它们在图表中的显示顺序。通过控制网格线的 zorder,我们可以确保它们出现在数据线条的上方或下方。

示例:调整网格线的 zorder
import matplotlib.pyplot as plt

# 定义数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建图表
plt.plot(x, y, zorder=2)  # 数据线条的 zorder 为 2

# 将网格线的 zorder 设置为 1,这样网格线会在数据线的下方
plt.grid(True, linestyle='--', color='grey', zorder=1)

# 添加标题
plt.title('调整网格线的显示层次')

# 显示图表
plt.show()
解释:
  • zorder=2: 设置数据线条的显示顺序为 2(较高的顺序)。
  • zorder=1: 设置网格线的显示顺序为 1,使其显示在数据线条的下方。


拓展:
  • 通过调节 zorder,我们可以让网格线与图表中的其他元素保持适当的层次关系。特别是在有多个数据系列和复杂背景的图表中,合理的 zorder 设置可以极大提升图表的可读性。

【Python篇】matplotlib超详细教程-由入门到精通(下篇)2;https://developer.aliyun.com/article/1617469

目录
相关文章
|
21天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
17天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2564 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
15天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
13天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
17天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1556 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
19天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
830 14
|
14天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
622 7
|
8天前
|
Docker 容器
Docker操作 (五)
Docker操作 (五)
170 69
|
8天前
|
Docker 容器
Docker操作 (三)
Docker操作 (三)
167 69
|
19天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
632 53
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界