matplotlib多子图实现共享坐标轴的示例详解
共用坐标
当一个图像中有多个子图时,若这些子图坐标的含义相同,那么省略一些坐标可以让图像更加简洁。在matplotlib中,通过sharex或者sharey可以起到共享x或y轴坐标的作用。示例如下
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5,5,100)
ys = [np.sin(x+i) for i in range(5)]
fig,axes = plt.subplots(2,2,sharex=True, sharey=True)
axes = axes.reshape(-1)
for i in range(4):
axes[i].plot(x, ys[i])
plt.show()
效果如下,左上角的子图没有x刻度值,右下角则没有y刻度值,右上角则什么坐标轴也没有。

添加共享轴
直接通过subplots来创建图窗和坐标轴,尽管用一行代码解决了很多问题,但相应地也不够灵活,而灵活添加坐标轴的函数add_subplot也有sharex和sharey的参数,但二者并不是布尔型参数,而是需要输入希望共享的坐标轴。
fig = plt.figure() ax3 = fig.add_subplot(223) ax3.plot(x,ys[2]) ax1 = fig.add_subplot(221, sharex=ax3) ax1.plot(x[:50],ys[0][:50]) ax4 = fig.add_subplot(224, sharey=ax3) ax4.plot(x[50:],ys[3][50:]) ax2 = fig.add_subplot(222, sharex=ax4, sharey=ax1) ax2.plot(x,ys[1]) plt.show()
效果如下,一方面,从各坐标轴的坐标来看,的确实现了坐标共享,但并没有像subplots中一样,直接隐藏不必要的坐标刻度。

为了达到和subplots相同的效果,需要手动隐藏坐标刻度,如将代码改为下面的形式,即可实现目标
fig = plt.figure() ax3 = fig.add_subplot(223) ax3.plot(x,ys[2]) ax1 = fig.add_subplot(221, sharex=ax3) ax1.plot(x[:50],ys[0][:50]) ax1.tick_params(axis="x", labelbottom=False) ax4 = fig.add_subplot(224, sharey=ax3) ax4.plot(x[50:],ys[3][50:]) ax4.tick_params(axis="y", labelleft=False) ax2 = fig.add_subplot(222, sharex=ax4, sharey=ax1) ax2.plot(x,ys[1]) ax2.tick_params(axis="x", labelbottom=False) ax2.tick_params(axis="y", labelleft=False) plt.show()
灰度直方图
上面示例中那几个子图,彼此之间区别不大,放在一张图中是完全没问题的,但有些情况则不适合放在一张图中,比如对于一张图片来说,想知道其水平方向上灰度强度的分布,就比较适合坐标。
path = r'lena.jpg'
img = plt.imread(path)
xs = [np.sum(img[:,:,i],0) for i in range(3)]
ys = [np.sum(img[:,:,i],1) for i in range(3)]
fig = plt.figure()
gs = fig.add_gridspec(2, 2,
width_ratios=(4, 1),
height_ratios=(1, 4))
ax = fig.add_subplot(gs[1, 0])
ax.imshow(img) # 散点图绘制
plt.axis('off')
xHist = fig.add_subplot(gs[0, 0], sharex=ax)
xHist.tick_params(axis="x", labelbottom=False)
yHist = fig.add_subplot(gs[1, 1], sharey=ax)
yHist.tick_params(axis="y", labelleft=False)
colors = 'rgb'
for i in range(3):
xHist.plot(xs[i], color=colors[i])
yHist.plot(ys[i], np.arange(len(ys[i])),color=colors[i])
plt.show()
由于lena图有3个通道,所以在对每行或者每列像素求和时,选择分别对三个通道进行操作。而后在绘制曲线时,对三个通道的值也使用了不同的颜色方案。通过tick_params函数,取消了上图底部和右图左侧的坐标刻度。
最后得图如下

到此这篇关于matplotlib多子图实现共享坐标轴的示例详解的文章就介绍到这了,更多相关matplotlib共享坐标轴内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
python通过TimedRotatingFileHandler按时间切割日志
这篇文章主要介绍了python通过TimedRotatingFileHandler按时间切割日志的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-07-07
python+matplotlib绘制简单的海豚(顶点和节点的操作)
这篇文章主要介绍了python+matplotlib绘制简单的海豚(顶点和节点的操作),具有一定借鉴价值,需要的朋友可以参考下2018-01-01
Python使用JDAudioCrawler将下载的音频存储到本地
在当今数字化时代,音频数据的获取和处理变得越来越重要,本文将访问网易云音乐为案例,介绍如何使用JDAudioCrawler这个强大的工具,将音频数据存储下载到本地存储中,需要的可以了解下2023-10-10
Python使用自带的base64库进行base64编码和解码的实现
本文主要介绍了Python使用自带的base64库进行base64编码和解码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-03-03


最新评论