手把手教你用Matplotlib进行数据可视化

导读:Matplotlib是建立在NumPy数组上的一个多平台数据可视化库。在2002年,约翰·亨特(John Hunter)提出Matplotlib,最初的构思是设计为IPython的一个补丁,以便能够从命令行启用交互式MATLAB样式绘图。

近几年,更新、更炫酷的工具(例如,R语言中的ggplot和ggvis)层出不穷,最终取代了Matplotlib,可是Matplotlib仍然是一个经过良好测试的、非常重要的跨平台图形引擎。

作者:阿迪蒂亚·夏尔马(Aditya Sharma)、维什韦什·拉维·什里马利(Vishwesh Ravi Shrimali)、迈克尔·贝耶勒(Michael Beyeler)
来源:大数据DT(ID:hzdashuju)

01 导入Matplotlib

如果你安装了完整的Python Anaconda,那么你已经安装了Matplotlib,可以开始了。否则,你可能要访问官网获取安装说明。

http://matplotlib.org

就像我们用缩写np来表示NumPy一样,我们也会用一些标准的缩写来表示Matplotlib导入:

import matplotlib as mpl
import matplotlib.pyplot as plt

plt是我们最常用的一个接口。

02 生成一个简单的图形

言归正传,让我们创建第一个图形。

假设我们要绘制正弦函数sin(x)的一个简单线图。我们希望函数求x轴(0≤x≤10)上的所有值。我们将使用NumPy的linspace函数在x轴上创建一个线性空间,x值从0到10,共100个样本点:

import numpy as np
x = np.linspace(0, 10, 100)

我们可以使用NumPy的sin函数求sin函数的所有x值,并通过调用plt的plot函数可视化结果:

plt.plot(x, np.sin(x))

你亲自试过了吗?发生什么了?有什么发现吗?

问题是,这取决于你在何处运行这个脚本,你可能什么都看不到。以下是可以考虑的可能性:

1. 从.py脚本绘图

如果你正从一个脚本运行matplotlib,那么你只需要调用plt,如下所示:

plt.show()

调用后,图形就会显示出来!

2. 从IPython shell绘图

这实际上是以交互方式运行matplotlib的最便捷的方式之一。要显示绘图,你需要在启动IPython之后,调用%matplotlib魔术命令:

%matplotlib
Using matplotlib backend: Qt5Agg
import matplotlib.pyplot as plt

然后,所有图都会自动显示出来,不必每次都调用plt.show()。

3. 从Jupyter Notebook绘图

如果你从基于浏览器的Jupyter Notebook上查看这段代码,你需要使用同样的%matplotlib魔术命令。可是,你还可以选择将图形直接嵌入notebook中,这有两种可能的结果:

  • %matplotlib notebook将生成的交互式图嵌入notebook中。

  • %matplotlib inline将生成的静态图嵌入notebook中。

我们通常会选择内联选项:

%matplotlib inline

现在,让我们再试一次:

plt.plot(x, np.sin(x))

上述命令给出的输出如图2-4所示。

▲图2-4 应用内联选项生成的图

稍后,如果你想保存图表,可以直接从IPython或Jupyter Notebook的选项中保存:

plt.savefig('figures/02.03-sine.png')

只要保证使用所支持的文件后缀即可,例如.jpg、.png、.tif、.svg、.eps或者.pdf。

在导入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的digits数据集。

具体来说,我们将需要3个可视化工具:

  • 用于实际数据的scikit-learn

  • 用于数据处理的NumPy

  • Matplotlib

首先,让我们导入所有这些可视化工具:

import numpy as npfrom sklearn import datasetsimport matplotlib.pyplot as plt%matplotlib inline

第一步是实际加载数据:

digits = datasets.load_digits()

如果我们没有记错的话,digits应该有2个不同的字段:一个是data字段,包含实际的图像数据;另一个是target字段,包含图像标签。

与其相信我们的记忆,不如让我们研究一下digits对象。这通过输入字段名称、添加句点、再按下Tab键—digits.<TAB>来实现。这会显示出digits对象还包含了一些其他字段,例如一个名为images的字段。images和data这2个字段似乎只是形状不同:

print(digits.data.shape)print(digits.images.shape)

输出结果:

(1797, 64)
(1797, 8, 8)

在这两个例子中,第一维都对应于数据集中的图像数。但是data将所有像素排列在一个大的向量中,而images则保留了每个图像的8×8空间排列。

因此,如果我们想绘制单张图像,images字段可能更合适。首先,使用NumPy的数组切割,从数据集中抓取一张图像:

img = digits.images[0, :, :]

这里,我们说想要抓取长为1797项的数组中的第一行,以及所有对应的8×8=64个像素。然后,我们可以使用plt的imshow函数绘制图像:

plt.imshow(img, cmap='gray')
plt.savefig('figures/02.04-digit0.png')

上述命令给出的输出如图2-5所示。请注意,图像是模糊的,因为我们将该图像调整到了更大的尺寸。原始图像的大小只有8×8。

▲图2-5 生成单张图像的示例结果

此外,我们还可以使用cmap参数指定一个彩图。在默认情况下,Matplotlib使用MATLAB的默认彩图jet。可是,对于灰度图像,gray彩图更有意义。

最后,我们可以利用plt的subplot函数绘制一组数字样本。subplot函数与在MATLAB中一样,我们指定行数、列数以及当前子图的索引(从1开始)。我们将使用一个for循环遍历数据集中的前10个图像,每个图像都有自己的子图:

plt.figure(figsize=(14, 4))

for image_index in range(10):    # images are 0-indexed, subplots are 1-indexed    subplot_index = image_index + 1    plt.subplot(2, 5, subplot_index)    plt.imshow(digits.images[image_index, :, :], cmap='gray')

生成的输出如图2-6所示。

▲图2-6 生成包含10个数字的一组子图

对于各种数据集,另一个很好的资源是本书作者迈克尔·贝耶勒的母校加州大学欧文分校的机器学习资源库:

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

关于作者:阿迪蒂亚·夏尔马(Aditya Sharma),罗伯特·博世(Robert Bosch)公司的一名高级工程师,致力于解决真实世界的自动计算机视觉问题。曾获得罗伯特·博世公司2019年人工智能编程马拉松的首名。

(0)

相关推荐

  • 散点图

    最近好像不想动,只想追剧,追综艺,追电影,追小说,就是不想费脑子,感觉想要飞上天...... 来点绿色洗洗眼. 散点图,就是在坐标系里画点点点的图,尤其应用在回归分析中经常画. 要绘制散点图,主要是要 ...

  • python 读取并显示图片的两种方法

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

  • Python可视化 5. 使用Matplotlib数据可视化

    全文共4750字,预计阅读时间20分钟. 第五章 使用NumPy和Matplotlib进行数据可视化 目录 一.Matplotlib 二.使用NumPy和Matplotlib实现可视化 三.单线图(S ...

  • 【量化】seaborn在金融数据可视化中的应用

    <python与量化投资从基础到实战>学习笔记tips:如果没时间阅读,可收藏本文或者直接滑动到文末获取本项目代码下载链接 seaborn库是以matplotlib为基础,同时支持nump ...

  • matplotlib pyplot 画图基础教程

    用Python绘制图表在工作中是一项非常有用的技能,虽然说强大的matlab基本可以满足我们所有的绘图需求,但是在有些情况下,使用Python绘图,让图表直接可以直接随着Python程序的运行而产生. ...

  • Python可视化.1

    https://matplotlib.org/stable/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usag ...

  • Numpy:利用Numpy库建立可视化输入的二次函数数据点集np.linspace+np.random.shuffle+np.random.normal

    Numpy:利用Numpy库建立可视化输入的二次函数数据点集np.linspace+np.random.shuffle+np.random.normal 输出结果 代码设计 import numpy ...

  • [数据可视化]Seaborn简单介绍

    什么是SeabornSeaborn是基于matplotlib的图形可视化python包.它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表.Seaborn是在matplotlib的基础 ...

  • 基于OpenCV的图像强度操作

    重磅干货,第一时间送达 01. 什么是图像强度操作 更改任何通道中的像素值 对图像的数学运算 亮度变化 对比度变化 伽玛操纵 直方图均衡 图像预处理中的滤波等增强 使用OpenCV加载图像 impor ...

  • 纯干货:手把手教你用Python做数据可视化(附代码)

    作者:Wes McKinney本文摘编自<利用Python进行数据分析>第2版matplotlib是一个用于生成出版级质量图表(通常是二维的)的桌面绘图包.该项目由John Hunter于 ...

  • 手把手教你设置北上资金数据指标

    上一周介绍了如何在通达信使用跳空高开选股,发现了很多让卡尔哭笑不得的问题,文中的几个图已经把最终的界面展现出来,按部就班的抄都抄错,要么没有设置参数N,要么少了个冒号,或者分号写成冒号等等,大家照着葫 ...

  • 手把手教你EEG脑电数据预处理-原理篇

    更多技术干货第一时间送达 感谢简书ID:亚内士多德 授权分享 EEG脑电数据预处理-原理篇 本文不涉及具体的操作步骤,而是对脑电数据预处理中的每一步进行解说,根据我自己的经验来解释为什么要这么做,希望 ...

  • 手把手教你EEG脑电数据预处理-操作篇

    更多技术干货第一时间送达 感谢简书ID:亚内士多德 授权分享 EEG脑电数据预处理-操作篇 关于EEG数据预处理的原理,前面已经介绍过了,大家可以查看<手把手教你EEG脑电数据预处理-原理篇&g ...

  • 手把手教你学会LDA话题模型可视化pyLDAvis库

    在之前我们学习过lda话题模型,相关的文章我放在这里,大家有兴趣可以看一看. 自然语言处理之LDA主题模型 致敬褚先生:pyLDAvis可视化不认输的一生 对文本分析感兴趣的可以关注下我的直播间内的课 ...

  • [SEER教程02]手把手教你如何获取 SEER数据下载权限

    欢迎来到医科研,这里是白介素2的读书笔记,跟我一起聊临床与科研的故事, 生物医学数据挖掘,R语言,TCGA.GEO, SEER数据挖掘. 只有获得了SEER数据库的下载权限之后呢,就可以自由的下载SE ...

  • 从轮廓到制图,手把手教你打造酷炫的可视化地图

    一期一会,表哥又带着新鲜的干货来了!在上篇分享中,表哥和大家分享了12个常用的可视化工具网站,不知道大家有没有好好地学习和使用,也欢迎大家在后台和我分享你的"作业". 这一期,表哥 ...

  • 【手把手教你】Python获取财经数据和可视化分析

    [手把手]教你用Python获取财经数据和可视化分析 "巧妇难为无米之炊",找不到数据,量化分析也就无从谈起.对于金融分析者来说,获取数据是量化分析的第一步.Python的一个强大 ...

  • CSDN:手把手教你如何利用【百度统计工具】实现CSDN博客【文章访问流量】的数据统计图表可视化

    CSDN:手把手教你如何利用百度统计工具实现CSDN博客文章流量的数据统计的图表可视化 实现结果 1.本博客访问的年龄属性 2.本博客访问的地理位置属性 国内第一大IT社区-CSDN让博主们得到的权益 ...