前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python进阶之Matplotlib入门(九)

Python进阶之Matplotlib入门(九)

作者头像
HuangWeiAI
发布2019-12-17 17:13:35
6290
发布2019-12-17 17:13:35
举报
文章被收录于专栏:浊酒清味浊酒清味

引言

Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。

学完这节课,您将会:

1、在一张图上画出很多的小图。

2、在一张图上画出大小各异的小图。

3、画出图中图的效果。

子图

到目前为止,我们展示的都是一个图的画法,这些图包括:

  • 线图;
  • 散点图;
  • 等高线图;
  • 条形图;
  • 柱状图;
  • 3D 图形

然而,很多时候,我们需要同时展示好几张图。这时候我们需要引入Matplotlib中的子图功能。实现这个子图功能的函数叫做plt.shubplot。

用subplot 函数的时候,你需要指明网格的行列数量,以及你希望将图样放在哪一个网格区域中。我们举个例子:

代码语言:javascript
复制
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)。其中:

  • 第一个plt.subplot函数里面的参数(2,1,1)中的(2,1)表示网格,第三个数字1表示第一个图;
  • 第二个plt.subplot函数里面的参数(2,1,2)中的(2,1)表示网格,第三个数字2表示第二个图;

有了三个基本参数,大家也可以画出下面几种图:

我们在图中填充一些具体图片:

实现这个图的代码非常之简单:

代码语言:javascript
复制
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
  • gridspec

subplot2grid的参数和subplot的参数略有不同,它接收四个基本数字参数,还有一个额外“跨度参数”:

代码语言:javascript
复制
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函数功能也非常强大,我们需要单独导入这个函数:

代码语言:javascript
复制
import matplotlib.gridspec as gridspec

gridspec需要和subplot搭配来实现不均匀子图:

代码语言:javascript
复制
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函数里面插入:

  • gs[0,:],这个表示占据第0行以及所有的列的
  • gs[1:2],这个表示占据第一行第二列的位置

于是就可以获得下面的运行结果图:

图中图

图中图其实是一个比较高级的画法,掌握了这种画法出去zhuangbi完全没有问题。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与机器学习之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档