专栏首页浊酒清味Python进阶之Matplotlib入门(九)

Python进阶之Matplotlib入门(九)

引言

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

学完这节课,您将会:

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

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

3、画出图中图的效果。

子图

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

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

然而,很多时候,我们需要同时展示好几张图。这时候我们需要引入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)。其中:

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

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

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

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

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的参数略有不同,它接收四个基本数字参数,还有一个额外“跨度参数”:

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函数里面插入:

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

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

图中图

图中图其实是一个比较高级的画法,掌握了这种画法出去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与机器学习之路(gh_39aead19f756),作者:Huangwei AI

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python进阶之Matplotlib入门(三)

    Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技...

    HuangWeiAI
  • 手把手教你使用PCA进行数据降维

    对数据降维可以帮助我们提取数据集的主要信息,即将原始的高维特征空间压缩到低纬度的特征子空间。数据降维是用于提高计算效率的典型手段,另一个好处是也能够减小维度诅咒...

    HuangWeiAI
  • Python进阶之Matplotlib入门(二)

    Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技...

    HuangWeiAI
  • python matplotlib函数备忘

    matplotlib是python中一个非常好用的画图库,倾向于使用数据画图,设计思路与matlab中的plot相同。

    羽翰尘
  • Matplotlib使用笔记

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    村雨遥
  • Python数据处理从零开始----第四章(可视化)(18)一文解决柱状图barplot or barchart

    柱状图(或条形图)是最常见的图类型之一。 它显示了数值变量和类别变量之间的关系。 (1)绘制基础柱状图

    用户1359560
  • 我的Python分析成长之路10

        figure.add_subplot:添加子图,可以指定子图的行数、列数和选中图片的编号。

    用户2398817
  • Matplotlib

    闪电gogogo
  • plt 数据可视化

      plt.xlabel()/plt.ylabel()需要在plt.subplot()后面,否则不起作用。

    用户2398817
  • python 画图--简单开始及折线图

           本博客转载自:http://blog.csdn.net/jenyzhang/article/details/52046372

    用户2398817

扫码关注云+社区

领取腾讯云代金券