引言
Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。
学完这节课,您将会:
1、在一张图上画出很多的小图。
2、在一张图上画出大小各异的小图。
3、画出图中图的效果。
子图
到目前为止,我们展示的都是一个图的画法,这些图包括:
然而,很多时候,我们需要同时展示好几张图。这时候我们需要引入Matplotlib中的子图功能。实现这个子图功能的函数叫做plt.shubplot。
用subplot 函数的时候,你需要指明网格的行列数量,以及你希望将图样放在哪一个网格区域中。我们举个例子:
import matplotlib.pyplot as plt
plt.subplot(2,1,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,1,1)',ha='center',va='center',size=24,alpha=.5)
plt.subplot(2,1,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,1,2)',ha='center',va='center',size=24,alpha=.5)
plt.show()
运行结果:
在这个例子中,我们指定网格的行列数量分别是(2,1)。其中:
有了三个基本参数,大家也可以画出下面几种图:
我们在图中填充一些具体图片:
实现这个图的代码非常之简单:
import matplotlib.pyplot as plt
plt.subplot(2,2,1)
plt.plot([0,1],[0,1])
plt.subplot(2,2,2)
plt.plot([0,1],[0,2])
plt.subplot(223)
plt.plot([0,1],[0,3])
plt.subplot(224)
plt.plot([0,1],[0,4])
plt.show()
不均匀子图
我们使用了subplot函数实现了子图,且展示的都是均匀画法,这里我们介绍两种方法来实现不均匀子图,让表达方式更加丰富:
subplot2grid的参数和subplot的参数略有不同,它接收四个基本数字参数,还有一个额外“跨度参数”:
import matplotlib.pyplot as plt
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax1.plot([1, 2], [1, 2])
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.scatter([1, 2], [2, 2])
ax4.set_xlabel('ax4_x')
ax4.set_ylabel('ax4_y')
ax5 = plt.subplot2grid((3, 3), (2, 1))
plt.show()
在上面的代码中,(3,3)表示将整个窗口划分成3*3的子窗口,后面的(1,0)表示从第一行第零列开始作图,而colspan=2表示列跨度为2;同理rowspan=2表示行跨度为二。最终运行结果如下:
gridspec函数功能也非常强大,我们需要单独导入这个函数:
import matplotlib.gridspec as gridspec
gridspec需要和subplot搭配来实现不均匀子图:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure()
gs = gridspec.GridSpec(3, 3)
ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :2])
ax3 = plt.subplot(gs[1:, 2])
ax4 = plt.subplot(gs[-1, 0])
ax5 = plt.subplot(gs[-1, -2])
plt.show()
我们先利用gradspec建立一个(3,3)的网格,然后在subplot函数里面插入:
于是就可以获得下面的运行结果图:
图中图
图中图其实是一个比较高级的画法,掌握了这种画法出去zhuangbi完全没有问题。
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
x = np.linspace(-10, 10, 1000)
y = np.exp(x)
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('title')
left, bottom, width, height = 0.3, 0.5, 0.25, 0.25
ax2 = fig.add_axes([left, bottom, width, height])
ax2.plot(x, y, 'b')
plt.xlim(5,10)
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('title inside 1')
plt.show()
运行结果
我们来解释代码:首先我们用numpy中的函数来创建x,y数据。然后我们画大图,left,bottom加上width,height给出大框框,然后把数据画进去,用红色标记。然后我们画小图,它是大图曲线在横坐标[5,10]之间的“细节放大”图,我们用蓝色标记。
参考资料
菜鸟教程
莫烦Python
本文分享自 Python与机器学习之路 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!