本文主要是介绍matplotlib多子图共享坐标轴,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 共用坐标
- 添加共享轴
- 灰度直方图
共用坐标
当一个图像中有多个子图时,若这些子图坐标的含义相同,那么省略一些坐标可以让图像更加简洁。在matplotlib中,通过sharex或者sharey可以起到共享x或y轴坐标的作用。示例如下
import numpy as np
import matplotlib.pyplot as pltx = 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多子图共享坐标轴的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!