Python常见库matplotlib之多个子图绘图

该文章详细介绍了如何使用Python的matplotlib库创建和配置多子图,包括设置子图的参数、坐标轴标签、标题以及刻度参数。通过示例代码展示了如何指定字体以支持中文显示,并调整子图间的距离和刻度标签的样式。文章还强调了在多子图中设置不同参数的重要性。
部署运行你感兴趣的模型镜像

系列文章目录

第一章 Python常见库matplotlib之画图文字的中文显示
第二章 Python常见库matplotlib之画图中各个模块的含义及修改方式
第三章 Python常见库matplotlib之多个子图绘图



前言

前两章介绍了单张图的绘图操作,这一章介绍下在一张图中画多个图的操作。我们把前一篇的程序稍微改动一下,上一篇中是将正弦函数和余弦函数画在一张图中,这一次我们将两个曲线分别画在不同的子图中。
完整程序如下所示:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 指定字体
font_path = 'SIMSUN.TTC'
font_prop = fm.FontProperties(fname=font_path, size=12)

en_font_path = 'TIMES.TTF'
en_font_prop = fm.FontProperties(fname=en_font_path, size=12)

x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))

ax1.plot(x, y1, label=u'正弦曲线', color='blue')
ax1.set_ylabel('正弦值', fontproperties=font_prop)
ax1.set_xlabel('横轴', fontproperties=font_prop)
ax1.set_title('正弦函数', fontproperties=font_prop)

plt.subplots_adjust(hspace=0.6) # 调整子图之间的距离

ax2.plot(x, y2, label=u'余弦曲线', color='red')
ax2.set_ylabel('余弦值', fontproperties=font_prop)
ax2.set_xlabel('横轴', fontproperties=font_prop)
ax2.set_title('余弦函数', fontproperties=font_prop)

plt.suptitle('函数', fontproperties=font_prop)

ax1.tick_params(axis='both', which='major', labelsize=10, direction='in', bottom=True)
ax2.tick_params(axis='both', which='major', labelsize=10, direction='in')
# ax1.xaxis.set_tick_params(which='both', labelbottom=True)
# ax1.yaxis.set_tick_params(which='both', labelleft=True)
for tick in ax1.get_xticklabels():
    tick.set_fontproperties(en_font_prop)
for tick in ax1.get_yticklabels():
    tick.set_fontproperties(en_font_prop)
for tick in ax2.get_xticklabels():
    tick.set_fontproperties(en_font_prop)
for tick in ax2.get_yticklabels():
    tick.set_fontproperties(en_font_prop)

ax1.legend(loc='upper right', fontsize=12, edgecolor='black', fancybox=False, framealpha=1, prop=font_prop)
ax2.legend(loc='upper right', fontsize=12, edgecolor='black', fancybox=False, framealpha=1, prop=font_prop)

plt.show()

上述的代码显示结果是:
在这里插入图片描述
下面我们开始对代码一段段分析。


一、多张子图的参数设置

1. 子图(subplots)

下面的代码就是先进行子图设置。

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))

第一个参数为2,表示子图行的排布方式,为2行
第二个参数为1,表示子图列的排布方式,为1列
figsize的参数为(10,6),表示最终图的总像素数为1000*600。也就是说第一个值为宽,第二个值为高,分别乘以100后,即为生成最终图的宽高。

除了上面描述的几种参数以外,还有下面的可选参数:

参数含义
squeeze是否压缩返回的子图网格数组,如果为 True,则当 nrows=1 且 ncols=1 时,返回的是单个 Axes 实例,而不是一个包含单个 Axes 实例的数组。
subplot_kw传递给每个子图的关键字参数字典。
gridspec_kw传递给 GridSpec 的关键字参数字典。
sharex是否共享 x 轴的限制范围。可选值为 ‘none’、‘all’ 或 ‘row’。
sharey是否共享 y 轴的限制范围。可选值为 ‘none’、‘all’ 或 ‘col’。

2. 子图y轴坐标说明(set_ylabel),子图x轴坐标说明(set_xlabel),设置子图标题(set_title)

与单一图像不同的是,有子图的情况下,我们对子图设置坐标名称和子图名称时调用的名字前面要加上set_

ax1.plot(x, y1, label=u'正弦曲线', color='blue')
ax1.set_ylabel('正弦值', fontproperties=font_prop)
ax1.set_xlabel('横轴', fontproperties=font_prop)
ax1.set_title('正弦函数', fontproperties=font_prop)

可以设置的参数在下面的对应列表中,上面程序中的'正弦值''横轴'就是下面的参数label。

参数含义
label标签的文本内容。
fontsize(size)标签的字体大小。
fontweight标签的字体粗细,通常为 ‘bold’ 或 ‘normal’,是否有变化还要看字体文件本身是否支持
color标签的字体颜色,可以是颜色名称、十六进制码或 RGB 元组。
rotation标签的旋转角度,通常为 0(水平)或 90(垂直)。
va标签的垂直对齐方式,可选值包括 ‘top’、‘center’ 或 ‘bottom’。
ha标签的水平对齐方式,可选值包括 ‘center’、‘left’ 或 ‘right’

3. 图片总标题(suptitle)

设置图的总名称需要调用suptitle函数实现。suptitle是super title的缩写,其实就是总标题,下文参数表格中的超级标题即总标题。

plt.suptitle('函数', fontproperties=font_prop)

suptitle可以设置参数如下表所示,本例中‘函数’就是参数中的t

参数含义
t超级标题的文本内容。
x超级标题的 x 坐标,通常为 0.5,即位于子图网格的中央。这个值是一个百分比,左边为0,右边为1。0.5就是处于图像正中间。
y超级标题的 y 坐标,默认值为 0.98,即位于子图网格的顶部。这个值是一个百分比,顶部为1,底部为0。0.98就是这个图像高度的98%的位置。
fontsize(size)超级标题的字体大小。
fontweight超级标题的字体粗细,通常为 ‘bold’ 或 ‘normal’。
color超级标题的字体颜色,可以是颜色名称、十六进制码或 RGB 元组。
ha超级标题的水平对齐方式,可选值包括 ‘center’、‘left’ 或 ‘right’。
va超级标题的垂直对齐方式,可选值包括 ‘top’、‘center’ 或 ‘bottom’

4. 刻度参数设置(tick_parms)

ax1.tick_params(axis='both', which='major', labelsize=10, direction='in', bottom=True)
ax2.tick_params(axis='both', which='major', labelsize=10, direction='in')

常见的使用到的参数如下表所示

参数含义
axis指定要设置哪个坐标轴的刻度线和标签属性,可选值为 ‘x’、‘y’ 或 ‘both’
which指定要设置哪些刻度线和标签属性,可选值为 ‘major’(主刻度线和标签)、‘minor’(次刻度线和标签)或 ‘both’(主刻度线和标签以及次刻度线和标签)
direction指定刻度线的方向,可选值为 ‘in’(向内)、‘out’(向外)或 ‘inout’(内外均有)
length指定刻度线的长度(单位为点)
width指定刻度线的宽度(单位为点)
color指定刻度线和标签的颜色
pad指定刻度标签与刻度线之间的间距(单位为点)
labelsize指定刻度标签的字号大小(单位为点)
labelcolor指定刻度标签的颜色
bottom、top、left、right分别指定四个边框上的刻度线和标签属性,这些值都是布尔属性,默认bottom和left是True,top和right是False

把上面的tick_params中的参数修改下,添加下表中的一些参数,如下面所示

ax1.tick_params(axis='both', which='major', labelsize=10, direction='in', width=5, pad=10, top=True, left=False, right=True, labelcolor='green')

显示出的图就变了,我是随便加了些,内容反而显的杂乱了,其目的主要是为了测试。
在这里插入图片描述

5. 刻度标签的字体(get_xticklabels)(set_fontproperties)

关于刻度标签的很多参数,在tick_params中其实就可以设置了,比如说color,pad,labelsize,labelcolor。但唯独这个字体的格式的设置比较特殊,需要按下面的代码进行修改

for tick in ax1.get_xticklabels():
    tick.set_fontproperties(en_font_prop)
for tick in ax1.get_yticklabels():
    tick.set_fontproperties(en_font_prop)
for tick in ax2.get_xticklabels():
    tick.set_fontproperties(en_font_prop)
for tick in ax2.get_yticklabels():
    tick.set_fontproperties(en_font_prop)

上面的代码实现的是对子图1和子图2的x轴刻度标签和y轴刻度标签的修改,总共要做四次,修改成新罗马体。
get_xticklabels 是 Matplotlib 中用于获取 x 轴刻度标签的方法。这个方法没有参数可以设置,它返回的是一个包含 Text 对象的列表,每个 Text 对象代表一个 x 轴刻度标签,可以通过调用 Text 对象的方法不仅可以用来设置刻度标签的字体,还可以设置刻度标签的属性,例如字体大小、颜色、旋转角度等,等于是通过for循环遍历来一个个设置刻度标签。

以下是一些常用的 Text 对象方法及其含义:

对象方法含义
set_text(text)设置刻度标签的文本内容。
set_fontsize(size)设置刻度标签的字号大小。
set_color(color)设置刻度标签的颜色。
set_rotation(angle)设置刻度标签的旋转角度(单位为度)。
set_ha(ha)设置刻度标签的水平对齐方式,可选值为 ‘left’、‘center’ 或 ‘right’。
set_va(va)设置刻度标签的垂直对齐方式,可选值为 ‘top’、‘center’ 或 ‘bottom’。

总结

本章节主要介绍了子图绘图中常见的几个参数的设置,与单一图所使用的函数是不同的,使用者需要注意。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

在使用 Matplotlib 绘制个子时,程序可能会在绘图完成后立即结束并关闭像窗口,这通常是由以下几个原因造成的: 1. **脚本执行完毕后自动关闭像窗口** 在标准的 Python 脚本中(例如使用 `plt.show()` 的方式),Matplotlib 会启动一个事件循环来显示形界面。一旦该函数被调用并且脚本执行完毕,像窗口将被关闭[^1]。这是正常的行为,因为大数非交互式脚本在绘图后没有进一步的操作需求。 2. **未正确阻塞主线程以维持像窗口** 如果希望像窗口保持打开状态直到用户手动关闭,需要确保程序不会在调用 `plt.show()` 后立即退出。可以通过添加输入等待语句(如 `input()`)来实现阻塞效果,从而防止程序过早终止。 3. **使用了非交互式的后端** Matplotlib 使用不同的“后端”来渲染形和处理用户交互。某些默认配置可能使用的是非交互式后端(如 `Agg`),这会导致 `plt.show()` 不弹出窗口或仅短暂显示后自动关闭。可以检查当前使用的后端并尝试更改为支持交互的后端(如 `TkAgg` 或 `Qt5Agg`)。 4. **Jupyter Notebook 中的内联显示问题** 在 Jupyter Notebook 环境下,如果未启用 `%matplotlib inline` 或 `%matplotlib notebook` 魔法命令,则像可能无法正确嵌入到单元格中,或者在绘制后立即消失。使用 `%matplotlib notebook` 可以启用交互功能,使像保持可见。 ### 解决方法 - **确保 `plt.show()` 是脚本的最后一行** 将 `plt.show()` 放置在脚本的最后,并在其后添加 `input()` 以保持窗口不关闭: ```python import matplotlib.pyplot as plt fig, axes = plt.subplots(2, 2) for ax in axes.flat: ax.plot([0, 1], [0, 1]) plt.show() input("Press Enter to exit...") ``` - **更改 Matplotlib 后端设置** 修改 `matplotlibrc` 文件中的 `backend` 参数为支持交互的后端,或在运行脚本前通过代码动态设置: ```python import matplotlib matplotlib.use('TkAgg') # 必须在导入 pyplot 前设置 import matplotlib.pyplot as plt ``` - **在 Jupyter Notebook 中启用交互模式** 添加以下魔法命令以确保像在 Notebook 中正确显示并保持交互性: ```python %matplotlib notebook ``` - **保存像而不是直接显示** 如果不需要实时查看像,可以选择将像保存到文件中,避免依赖 GUI 显示: ```python plt.savefig("subplots.png") ``` ### 示例:绘制个子并保持窗口打开 ```python import matplotlib.pyplot as plt fig, axes = plt.subplots(2, 2, figsize=(8, 6)) for i, ax in enumerate(axes.flat): ax.plot([0, 1], [0, (i+1)/4]) ax.set_title(f"Subplot {i+1}") plt.tight_layout() plt.show() input("Press Enter to exit...") # 防止窗口立即关闭 ``` ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PellyKoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值