matplotlib多子图实现共享坐标轴的示例详解

 更新时间:2024年02月01日 13:56:10   作者:微小冷  
这篇文章主要为大家详细介绍了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的爬虫框架Scrapy的结构与运作流程

    深入剖析Python的爬虫框架Scrapy的结构与运作流程

    这篇文章主要介绍了Python的爬虫框架Scrapy的结构与运作流程,并以一个实际的项目来讲解Scrapy的原理机制,十分推荐!需要的朋友可以参考下
    2016-01-01
  • Python bsonrpc源码解读

    Python bsonrpc源码解读

    这篇文章主要介绍了Python bsonrpc源码的相关资料,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • Python实现自动回复讨论功能的脚本分享

    Python实现自动回复讨论功能的脚本分享

    这篇文章主要为大家详细介绍了如何利用Python语言实现自动回复讨论功能的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-10-10
  • opencv-python的RGB与BGR互转方式

    opencv-python的RGB与BGR互转方式

    这篇文章主要介绍了opencv-python的RGB与BGR互转方式,具有很好的参考价值,希望对大家有所 帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python简单实现图片转字符画的实例项目

    Python简单实现图片转字符画的实例项目

    这篇文章主要介绍了Python简单实现图片转字符画的实例项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python 中闭包与装饰器案例详解

    Python 中闭包与装饰器案例详解

    这篇文章主要介绍了Python 中闭包与装饰器案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 如何用Python编写一个电子考勤系统

    如何用Python编写一个电子考勤系统

    这篇文章主要介绍了用Python编写一个电子考勤系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • flask上传作品之dbm操作的实现

    flask上传作品之dbm操作的实现

    本文主要介绍了flask上传作品之dbm操作的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • python tkinter实现界面切换的示例代码

    python tkinter实现界面切换的示例代码

    今天小编就为大家分享一篇python tkinter实现界面切换的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python基础之包的导入和__init__.py的介绍

    python基础之包的导入和__init__.py的介绍

    这篇文章主要介绍了python基础之包的导入和__init__.py的相关资料,需要的朋友可以参考下
    2018-01-01

最新评论