前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实操:手把手教你用Matplotlib把数据画出来

Python实操:手把手教你用Matplotlib把数据画出来

作者头像
IT阅读排行榜
发布2019-06-05 17:38:34
2.2K0
发布2019-06-05 17:38:34
举报
文章被收录于专栏:华章科技华章科技

导读:获取数据之后,而不知道如何查看数据,用途还是有限的。幸好,我们有Matplotlib!

Matplotlib 是基于 NumPy 数组构建的多平台数据可视化库。它是John Hunter 在2002年构想的,原本的设计是给 IPython 打补丁,让命令行中也可以有交互式的 MATLAB 风格的画图工具。

在近些年,已经出现了更新更好的工具最终替代了 Matplotlib(比如 R 语言中的ggplot和ggvis), 但 Matplotlib 依旧是一个经过良好测试的、跨平台的图形引擎。

作者:迈克尔·贝耶勒(Michael Beyeler)

如需转载请联系大数据(ID:hzdashuju)

01 引入 Matplotlib

如果已安装Anaconda Python版本,就已经安装好了可以使用的 Matplotlib。否则,可能要访问官网并从中获取安装说明:

http://matplotlib.org

正如使用np作为 NumPy 的缩写,我们将使用一些标准的缩写来表示 Matplotlib 的引入:

代码语言:javascript
复制
In [1]: import matplotlib as mpl
In [2]: import matplotlib.pyplot as plt

在本书中,plt接口会被频繁使用。

02 生成一个简单的绘图

让我们创建第一个绘图。

假设想要画出正弦函数sin(x)的线性图。得到函数在x坐标轴上0≤x<10内所有点的值。我们将使用 NumPy 中的 linspace 函数来在x坐标轴上创建一个从0到10的线性空间,以及100个采样点:

代码语言:javascript
复制
In [3]: import numpy as np
In [4]: x = np.linspace(0, 10, 100)

可以使用 NumPy 中的sin函数得到所有x点的值,并通过调用plt中的plot函数把结果画出来:

代码语言:javascript
复制
In [5]: plt.plot(x, np.sin(x))

你亲自尝试了吗?发生了什么吗?有没有什么东西出现?

实际情况是,取决于你在哪里运行脚本,可能无法看到任何东西。有下面几种可能性:

1. 从.py脚本中绘图

如果从一个脚本中运行 Matplotlib,需要加上下面的这行调用:

代码语言:javascript
复制
plt.show()

在脚本末尾调用这个函数,你的绘图就会出现!

2. 从 IPython shell 中绘图

这实际上是交互式地执行Matplotlib最方便的方式。为了让绘图出现,需要在启动 IPython 后使用所谓的%matplotlib魔法命令。

代码语言:javascript
复制
In [1]: %matplotlib
Using matplotlib backend: TkAgg
In [2]: import matplotlib.pyplot as plt

接下来,无须每次调用plt.show()函数,所有的绘图将会自动出现。

3. 从 Jupyter Notebook 中绘图

如果你是从基于浏览器的 Jupyter Notebook 中看这段代码,需要使用同样的%matplotlib魔法命令。然而,也可以直接在notebook中嵌入图形,这会有两种输出选项:

  • %matplotlib notebook 将会把交互式的绘图嵌入到notebook中
  • %matplotlib inline 将会把绘图的静态图像嵌入到notebook中

在本书中,将会使用inline选项:

代码语言:javascript
复制
In [6]: %matplotlib inline

现在再次尝试一下:

代码语言:javascript
复制
In [7]: plt.plot(x, np.sin(x))
Out[7]: [<matplotlib.lines.Line2D at 0x7f3aac426eb8>]

上面的命令会得到下面的绘图输出结果:

▲使用 Matplotlib 绘制正弦函数图像

如果想要把绘图保存下来留作以后使用,可以直接在 IPython 或者 Jupyter Notebook 使用下面的命令保存:

代码语言:javascript
复制
In [8]: plt.savefig('figures/02.03-sine.png')

仅需要确保你使用了支持的文件后缀,比如.jpg、.png、.tif、.svg、.eps或者.pdf。

Tips:可以在引入Matplotlib后通过运行plt.style.use(style_name)来修改绘图的风格。所有可用的风格在plt.style.available中列出。比如,尝试使用plt.style.use('fivethirtyeight')、plt.style.use('ggplot')或者plt.style.use('seaborn-dark')。为了更好玩,可以运行plt.xkcd(),然后尝试绘制一些别的图形。

03 可视化外部数据集的数据

作为本章最后一个测试,让我们对外部数据集进行可视化,比如scikit-learn中的数字数据集。

为此,需要三个可视化工具:

  • scikit-learn用于获取实际数据
  • NumPy 用于数据再加工
  • Matplotlib

那么开始引入这些包吧:

代码语言:javascript
复制
In [1]: import numpy as np
...     from sklearn import datasets
...     import matplotlib.pyplot as plt
...     % matplotlib inline

第一步是载入实际数据:

代码语言:javascript
复制
In [2]: digits = datasets.load_digits()

如果没记错的话,digits应该有两个不同的数据域:data域包含了真正的图像数据,target域包含了图像的标签。相对于相信我们的记忆,我们还是应该对digits稍加探索。输入它的名字,添加一个点号,然后按Tab键:digits.<TAB>,这个操作将向我们展示digits也包含了一些其他的域,比如一个名为images的域。images和data这两个域,似乎简单从形状上就可以区分。

代码语言:javascript
复制
In [3]: print(digits.data.shape)
...     print(digits.images.shape)
Out[3]: (1797, 64)
...     (1797, 8, 8)

两种情况中,第一维对应的都是数据集中的图像数量。然而,data中所有像素都在一个大的向量中排列,而images保留了各个图像8×8的空间排列。

因此,如果想要绘制出一副单独的图像,使用images将更加合适。首先,使用NumPy的数组切片从数据集中获取一幅图像:

代码语言:javascript
复制
In [4]: img = digits.images[0, :, :]

这里是从1797个元素的数组中获取了它的第一行数据,这行数据对应的是8×8=64个像素。下面就可以使用plt中的imshow函数来绘制这幅图像:

代码语言:javascript
复制
In [5]: plt.imshow(img, cmap='gray')
Out[5]: <matplotlib.image.AxesImage at 0x7efcd27f30f0>

上面的命令得到下面的输出:

▲数字数据集中的一个图像样例

此外,这里也使用cmap参数指定了一个颜色映射。默认情况下,Matplotlib 使用MATLAB默认的颜色映射jet。然而,在灰度图像的情况下,gray颜色映射更有效。

最后,可以使用plt的subplot函数绘制全部数字的样例。subplot函数与MATLAB中的函数一样,需要指定行数、列数以及当前的子绘图索引(从1开始计算)。我们将使用for 循环在数据集中迭代出前十张图像,每张图像都分配到一个单独的子绘图中。

代码语言:javascript
复制
In [6]: for image_index in range(10):
...         # 图像按0开始索引,子绘图按1开始索引
...         subplot_index = image_index + 1
...         plt.subplot(2, 5, subplot_index)
...         plt.imshow(digits.images[image_index, :, :], cmap='gray')

这会得到下面的输出结果:

▲数字数据集中的十幅样例图像

Tips:另一个拥有各种数据集资源的是我的母校——加利福尼亚大学欧文分校的机器学习仓库:

http://archive.ics.uci.edu/ml

关于作者:Michael Beyeler,华盛顿大学神经工程和数据科学专业的博士后,主攻仿生视觉计算模型,用以为盲人植入人工视网膜(仿生眼睛),改善盲人的视觉体验。 他的工作属于神经科学、计算机工程、计算机视觉和机器学习的交叉领域。同时他也是多个开源项目的积极贡献者。

本文摘编自《机器学习:使用OpenCV和Python进行智能图像处理》,经出版方授权发布。

延伸阅读《机器学习》

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

本文分享自 大数据DT 微信公众号,前往查看

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

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

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