【Python进阶】带你使用Matplotlib进行可视化

欢迎来到专栏《Python进阶》。在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件、数据的处理,Python各种好用的库如NumPy、Scipy、Matplotlib、Pandas的使用等等。我们的初心就是带大家更好的掌握Python这门语言,让它能为我所用。

今天是《Python进阶》专栏的第五期,在本期中,我们将主要介绍如何使用Matplotlib这个第三方库进行数据可视化。

作者&编辑 | 汤兴旺

“美丽的可视化可反映出所描述数据的品质,显式地揭示出源数据中内在和隐式的属性和关系,读者了解了这些属性和关系之后,可以因此而获取新的知识、洞察力和乐趣。”

以上是书籍《数据可视化之美》对可视化的解读。说的很有道理,相信大家听说过“一图胜千言”这句话,当看到一堆数据时,若你对数字不够敏感,肯定会费劲半天找不到规律,但若用一张图来表达时,相信你一定会一目了然。下面我就大家使用Matplotlib对数据进行美丽的可视化。

Matplotlib 的基本操作

在Matplotlib中有三个基本概念,分别是Figure、axes和axis。

下面我来详细解释下这三个基本概念。在Matplotlib中,figure你可以理解成一个画布或者一个窗口,axes是指画布上的一个区域,你画的图就在这个区域上。你可以把figure看成一张白纸,在纸上的任何区域画图,确定画图区域并确定作图的一些方式的东西的就是axes,即坐标对象(坐标系)。

由于在一张白纸上可以有几个区域进行画图,另外画图区域必须存在于白纸上才有意义。因此在figure上可有多个axes,axes必在figure上,要画图必有axes。

另外axis就是我们平时常见的坐标轴,如x轴、y轴等。

对于上面的概念我们可以用下图进行直观理解。

通过上面的讲解,我们知道在Matplotlib中的图像都位于figure画布中,因此可以使用plt.figure创建一个新画布。如果要在一个图表中绘制多个子图,可使用subplot。

话不多说,我们直接看下面代码:

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import randn
fig = plt.figure() # 创建一个新的 Figure
ax1 = fig.add_subplot(2, 2, 1)  # 不能通过空 Figure 绘图,必须用 add_subplot 创建一个或多个 subplot 才行
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)

ax4 = fig.add_subplot(2, 2, 4)
plt.plot(randn(50).cumsum(),'k--') # 这条没有指定具体 subplot 的绘图命令会在最后一个用过的 subplot 上进行绘制
_ = ax1.hist(randn(100), bins=20, color='k', alpha=0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3*randn(30))

首先,创建了一个figure,然后在这个figure上画了四个区域,即四个子图,分别是直方图、三点图、折线图,还有一个是只有坐标轴的图。

如果我想要画多个figure应该怎么办呢?实际上如果要同时绘制多个图表,可以给figure()传递一个整数参数指定figure对象的序号。如下例所示:

import matplotlib.pyplot as plt

import numpy as np

plt.figure(1)  # 创建图表1

plt.figure(2)  # 创建图表2

ax1 = plt.subplot(211)  # 在图表2中创建子图1

ax2 = plt.subplot(212)  # 在图表2中创建子图2

x = np.linspace(0, 3, 100)

for i in range(5):

plt.figure(1)  # 选择图表1

plt.plot(x, np.exp(i * x / 3))

plt.sca(ax1)  # 选择图表2的子图1

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

plt.sca(ax2)  # 选择图表2的子图2

plt.plot(x, np.cos(i * x))

plt.show()

执行完上面代码后,如下图。

2 Matplotlib的进阶操作

在1中的两个示例中,我们会发现手动创建figure,都使用了plt.figure()。如果没有plt.figure()可以吗?请看下面的示例:

import matplotlib.pyplot as plt

import numpy as np

x = np.linspace(-np.pi, 5*np.pi, num = 100)

y = np.sin(x)

plt.plot(x,y)

plt.show()

我们会发现这段代码中,没有plt.figure()也画出了图,WHY?难道前面误导了大家?我在前面说过,若没有figure就没有axes!

当然这个锅我不背,实际上这里plt.plot()是通过plt.gca()获得当前axes对象的ax,如果没有会自动创建一个,可以理解为就是figure。然后再调用ax.plot方法实现真正的绘图。

Matplotlib实际上是一套面向对象的绘图库,它所绘制的图表中每个图表元素,如线条 Line2D、文字Text、刻度等在内存中都有一个对象与之对应。为将面向对象的绘图库包装成只使用函数的调用接口,pyplot模块内部保存了当前图表以及当前子图等信息。当前的图表和子图可以使用plt.gcf()plt.gca()获得,分别表示"Get Current Figure"和"Get Current Axes"。在pyplot模块中,许多函数都是对当前的figure或axes对象进行处理,比如说:

plt.plot()实际上会通过plt.gca()获得当前的axes对象ax,然后再调用ax.plot()方法实现真正绘图。

2.1 对图进行装扮

上面3个示例中均没有展示图例、标注等,下面我们通过下面的示例来分享如何对一个图进行装扮。

import matplotlib.pyplot as plt

import numpy as np

fig, ax1 = plt.subplots(figsize=(8, 4))

r = np.linspace(0, 10, 100)

a = 4 * np.pi * r ** 2  # area

v = (4 * np.pi / 3) * r ** 3  # volume

ax1.set_title("surface area and volume of a sphere", fontsize=16)

ax1.set_xlabel("radius [m]", fontsize=16)

ax1.plot(r, a, lw=2, color="blue")

ax1.set_ylabel(r"surface area ($m^2$)", fontsize=16, color="blue")

for label in ax1.get_yticklabels():

label.set_color("blue")

ax2 = ax1.twinx()

ax2.plot(r, v, lw=2, color="red")

ax2.set_ylabel(r"volume ($m^3$)", fontsize=16, color="red")

for label in ax2.get_yticklabels():

label.set_color("red")

fig.tight_layout()

plt.show()

在上面的示例中我们通过set.title()设置了图的标题,通过set_xlabel和set_ylabel设置了y轴的标签,另外也通过get_yticklabels()和get_xticklabels()设置了坐标轴上刻度的不同的属性。

2.2、对图的某个细节进行放大

平时我们在处理图的时候,有时候需要对图的局部细节进行查看,这时候就需要对细节进行放大,对于这个问题该怎么解决呢?请看下面的案例:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

fig = plt.figure(figsize=(8, 4))
def f(x):
   return 1 / (1 + x ** 2) + 0.1 / (1 + ((3 - x) / 0.1) ** 2)
def plot_and_format_axes(ax, x, f, fontsize):
   ax.plot(x, f(x), linewidth=2)
   ax.xaxis.set_major_locator(mpl.ticker.MaxNLocator(5))
   ax.yaxis.set_major_locator(mpl.ticker.MaxNLocator(4))
   ax.set_xlabel(r"$x$", fontsize=fontsize)
   ax.set_ylabel(r"$f(x)$", fontsize=fontsize)

ax = fig.add_axes([0.1, 0.15, 0.8, 0.8], facecolor="#f5f5f5")
x = np.linspace(-4, 14, 1000)
plot_and_format_axes(ax, x, f, 18)
plt.show()

如果我想要对上图的横纵标在4附近的局部峰值进行放大查看,即下图圈红部分进行放大查看,应该如何操作呢?

代码如下:

import matplotlib.pyplot as plt

import numpy as np

import matplotlib as mpl

fig = plt.figure(figsize=(8, 4))

def f(x):

return 1 / (1 + x ** 2) + 0.1 / (1 + ((3 - x) / 0.1) ** 2)

def plot_and_format_axes(ax, x, f, fontsize):

ax.plot(x, f(x), linewidth=2)

ax.xaxis.set_major_locator(mpl.ticker.MaxNLocator(5))

ax.yaxis.set_major_locator(mpl.ticker.MaxNLocator(4))

ax.set_xlabel(r"$x$", fontsize=fontsize)

ax.set_ylabel(r"$f(x)$", fontsize=fontsize)

ax = fig.add_axes([0.1, 0.15, 0.8, 0.8], facecolor="#f5f5f5")

x = np.linspace(-4, 14, 1000)

plot_and_format_axes(ax, x, f, 18)

x0, x1 = 2.5, 3.5

ax = fig.add_axes([0.5, 0.5, 0.38, 0.42], facecolor='none')

x = np.linspace(x0, x1, 1000)

plot_and_format_axes(ax, x, f, 14)

plt.show()

代码区红色部分即实现放大部分的代码。实际是添加了另外一个axes,只不过这个axes包含在主图的axes中。

总结

本期我们介绍了Matplotlib中的一些应用,希望您能借助这个工具画出精美的图表。

下期预告:Python库Pandas的高级应用

知识星球推荐

有三AI编程与开源框架知识星球由我亲自维护,内设caffe实战,Python实战,Python每日一练,Pytorch实战、C++每一一练等板块。近期我重点更新caffe的实战教程,包括模型定义、数据处理、源码解读、定制自己的caffe等等,欢迎大家了解加入,我们一起攻破编程与开源框架。

转载文章请后台联系

侵权必究

(0)

相关推荐

  • Python中的Matplotlib绘图

    Matplotlib是Python的绘图工具,用Matplotlib可以绘制出我们想要的各类2D图.Matplotlib可用于python脚本.jupyter notebook.web等.个人认为在J ...

  • Python可视化.1

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

  • 六种数据分析的基本可视化

    Matplotlib实用指南 数据可视化是数据科学中非常重要的一部分.在探索和理解数据时非常有用.在某些情况下,可视化在传达信息方面比普通数字要好得多. 使用数据可视化技术可以轻松发现变量之间的关系, ...

  • Matplotlib使用(2)

    pyplot简介 matplotlib.pyplot是使matplotlib像MATLAB一样工作的命令样式函数的集合.每个pyplot功能都会对图形进行一些更改:例如,创建图形,在图形中创建绘图区域 ...

  • Python可视化 | 子图中(subplot)的几种设置方法

    好奇心Log 今天 以下文章来源于阿宗的科研备忘 ,作者阿宗的科研备忘 阿宗的科研备忘科研备忘录 我们初学Python的时候,想画张图出来还是不难的,导入matplotlib之后,直接选择相应的绘图函 ...

  • Python Matplotlib简易教程

    详情请见:Matplotlib python 数据可视化神器 简单演示 import matplotlib.pyplot as pltimport numpy as np# 从[-1,1]中等距去50 ...

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

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

  • 5 种快速易用的 Python Matplotlib 数据可视化方法

    Python编程学习圈 2021-09-26 数据可视化是数据科学家工作的重要部分.在项目的早期阶段,我们通常需要进行探索性数据分析来获得对数据的洞察.通过数据可视化可以让该过程变得更加清晰易懂,尤其 ...

  • Python进阶系列:Python遍历的秘密

    前言 可迭代对象,迭代器,生成器,相信许多学习Python的小伙伴或多或少都听说过,但你真的知道他们的区别吗?真的知道为什么需要这些概念吗? 本文带你深入了解一系列相关机制,不仅告诉你概念,还告诉你为 ...

  • 【视频课】8大真实金融工程案例,20多小时Python进阶课推荐给你学习!

    Python是金融行业的重要工具,本次我们联合<王的机器>公众号号主一起推出Python金融案例进阶课程,并且基于8大金融行业的实际案例进行实践,下面请听介绍. 作者介绍 首先来介绍一下视 ...

  • 课件4——Python进阶

    Python猜数小游戏[游戏规则]生成一个指定范围的随机数(如:1-100),然后玩家输入数值猜答案,屏幕会根据玩家输入的数字给出大小提示,一直到玩家猜出准确答案则游戏胜利并结束.import  ra ...

  • Python进阶:探秘描述符的工作原理

    作者:Magic Kaito 来源:水滴与银弹 在 Python 开发中,你可能听说过「描述符」这个概念,由于我们很少直接使用它,所以大部分开发人员并不了解它的原理. 但作为熟练使用 Python,想 ...

  • 用 Python 实现带音乐的雪花飘落雪景图

    来源:Python 技术「ID: pythonall」 这几天很多地方陆续出现了降雪的天气,对于年内的第一场雪,大家的热情显然是比较高涨的,比如很多人顶着雪花到各种景点打卡,再比如一位东北大哥要直播卖 ...

  • 数智零售拥抱数据可视化,宝多多带你读懂数据可视化的价值(一)

    读:在"数智化"时代背景下,零售业转型晋级势在必行,数智零售也已经成为职业风口.但是,什么是数智零售?数智零售与传统零售的本质区别安在?数智零售的底层支撑是什么?本文针对上述内容打 ...

  • 一篇文章浅析Python自带的线程池和进程池

    前言 大家好,我是星期八. 我们都知道,不管是Java,还是C++,还是Go,还是Python,都是有线程这个概念的. 但是我们知道,线程是不能随便创建的,就像每招一个员工一样,是有代价的,无限制招人 ...