Python画图|多图共享X轴和Y轴

【1】引言

在python画图的众多场景中,存在多图对应X轴和Y轴可能一致的情形。

为此,尝试找到相关方法,不仅可以将代码写得更简洁,也更节省电脑内存,是提升工作效率的可选之路。

【2】官网教程

点击下方链接,直达官网教程:

Shared axis — Matplotlib 3.9.2 documentation

官网教程非常简洁,我尝试对其进行了注释。

【3】代码解析

首先是引入画图模块matplo和计算模块numpy:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

然后定义了自变量和因变量:

t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量

这里的3个因变量将输出3个子图。

接下来先输出第一个图形:

ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6) #设置X轴范围

然后在定义第二个图形的时候,指明要和第一个图形共享X轴:sharex=ax1

# share x only
ax2 = plt.subplot(312, sharex=ax1) #输出第二个图形,共享第一个图像的X轴
plt.plot(t, s2) #画图
# make these tick labels invisible
plt.tick_params('x', labelbottom=False) #设置图形,不显示X轴内容

再之后定义第三个图形, 指明要和第一个图形共享X轴和Y轴:sharex=ax1,sharey=ax1

# share x and y
ax3 = plt.subplot(313, sharex=ax1, sharey=ax1) #输出第三个图形,共享第一个图像的X轴和Y轴
plt.plot(t, s3) #画图
plt.xlim(0.01, 5.0) #限制X轴范围

最后输出图形:

plt.show() #输出图形

至此的输出图像为:

图1

完整代码为:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量

ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6) #设置X轴范围

# share x only
ax2 = plt.subplot(312, sharex=ax1) #输出第二个图形,共享第一个图像的X轴
plt.plot(t, s2) #画图
# make these tick labels invisible
plt.tick_params('x', labelbottom=False) #设置图形,不显示X轴内容

# share x and y
ax3 = plt.subplot(313, sharex=ax1, sharey=ax1) #输出第三个图形,共享第一个图像的X轴和Y轴
plt.plot(t, s3) #画图
plt.xlim(0.01, 5.0) #限制X轴范围
plt.show() #输出图形

【4】代码修改

【4.1】设置子图名称

由于图1中没有给任何子图命名,且第一个和第三个子图都显示了X轴,为了优化表达效果,先给各个子图命名,增加如下代码:

ax1.set_title('s1')
ax2.set_title('s2')
ax3.set_title('s3')

获得输出结果为:

图2

可见每个子图上都有了名称。

【4.2】只显示最底下的X轴标签内容

现在进一步优化代码,把S1的X轴标签去除。

此处采用的方法是,增加labelbottom=False代码,增加后:

ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6,labelbottom=False) #设置X轴范围

此时的输出结果为:

图3

由图3可见,S1不再显示X轴标签内容。

【4.3】显示最底下的X轴和各Y轴

继续增加代码,显示最底下的X轴和各Y轴:

ax1.set_ylabel('s1')
ax2.set_ylabel('s2')
ax3.set_ylabel('s3')
ax3.set_xlabel('X')

此时的输出结果为:

图4

由图4可见,各个子图的表达已经更加完善。

此时的完整代码为:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量

ax1 = plt.subplot(311) #输出第一个图形
plt.plot(t, s1) #画图
plt.tick_params('x', labelsize=6,labelbottom=False) #设置X轴范围

# share x only
ax2 = plt.subplot(312, sharex=ax1) #输出第二个图形,共享第一个图像的X轴
plt.plot(t, s2) #画图
# make these tick labels invisible
plt.tick_params('x', labelbottom=False) #设置图形,不显示X轴内容

# share x and y
ax3 = plt.subplot(313, sharex=ax1, sharey=ax1) #输出第三个图形,共享第一个图像的X轴和Y轴
plt.plot(t, s3) #画图
plt.xlim(0.01, 5.0) #限制X轴范围

ax1.set_title('s1') #设置图名
ax2.set_title('s2') #设置图名
ax3.set_title('s3') #设置图名

ax1.set_ylabel('s1') #设置Y轴
ax2.set_ylabel('s2') #设置Y轴
ax3.set_ylabel('s3') #设置Y轴
ax3.set_xlabel('X') #设置X轴

plt.show() #输出图形

【5】代码优化

其实共享X轴更为简洁的方式是将所有图形画到同一个坐标系。

删除所有ax定义,替换为下述代码:

plt.plot(t, s1,'o--',label='s1') #画图
plt.plot(t,s2,'--',label='s2') #画图
plt.plot(t,s3,label='s3') #画图
plt.xlabel('X') #设置X轴
plt.ylabel('Y') #设置Y轴
plt.legend() #输出图例

此时的输出结果为:

图5

 图5显然比之前的图形都更紧凑,展示内容也更集中。

当然,图5的选用应在曲线范围一致的情况下才有好的效果,不然还是需要回到之前的子图形式。

至此的完整代码为:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

t = np.arange(0.01, 5.0, 0.01) #定义自变量
s1 = np.sin(2 * np.pi * t) #定义因变量
s2 = np.exp(-t) #定义因变量
s3 = np.sin(4 * np.pi * t) #定义因变量

plt.plot(t, s1,'o--',label='s1') #画图
plt.plot(t,s2,'--',label='s2') #画图
plt.plot(t,s3,label='s3') #画图
plt.xlabel('X') #设置X轴
plt.ylabel('Y') #设置X轴
plt.legend() #输出图例

plt.show() #输出图形

【6】总结

探索了多图共享X轴和Y轴的基本技巧,并对输出图形进行了图例、轴标签等属性设置,最后将所有曲线集中到一个坐标轴内部输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值