Python实现数据可视化(Matplotlib)

文章目录

1.Matplotlib 常用技巧

1.1 导入 Matplotlib

pyplot 是最常用的接口

import matplotlib as mpl
import matplotlib.pyplot as plt

1.2 设置绘图样式

使用 plt.style.use 来选择图形的绘图风格。现在选择经典(classic)风格,这样画出的图就是经典的风格。

plt.style.use("classic")

打印出可选的风格。

print(plt.style.available)

[‘Solarize_Light2’, ‘_classic_test_patch’, ‘bmh’, ‘classic’, ‘dark_background’, ‘fast’, ‘fivethirtyeight’, ‘ggplot’, ‘grayscale’, ‘seaborn’, ‘seaborn-bright’, ‘seaborn-colorblind’, ‘seaborn-dark’, ‘seaborn-dark-palette’, ‘seaborn-darkgrid’, ‘seaborn-deep’, ‘seaborn-muted’, ‘seaborn-notebook’, ‘seaborn-paper’, ‘seaborn-pastel’, ‘seaborn-poster’, ‘seaborn-talk’, ‘seaborn-ticks’, ‘seaborn-white’, ‘seaborn-whitegrid’, ‘tableau-colorblind10’]

1.3 显示图形

  1. 在脚本中画图:如果在一个脚本文件中使用 Matplotlib,那么显示图形的时候必须使用 plt.show()。plt. show() 会启动一个事件循环(event loop),并找到所有当前可用的图形对象,然后打开一 个或多个交互式窗口显示图形。一个 Python 会话(session)中只能使用一次 plt.show(),因此通常 都把它放在脚本的最后。多个 plt.show() 命令会导致难以预料的显示异常,应该尽量避免。
import numpy as np
x = np.arange(0, 20, 2)
print(x)
plt.plot(x, np.sin(x)) 
plt.plot(x, np.cos(x)) 
 
plt.show()

在这里插入图片描述

  1. 在IPython shell中画图:要在启动 ipython 后 使用 %matplotlib 魔法命令:在这里插入图片描述
    此后的任何 plt 命令都会自动打开一个图形窗口,增加新的命令,图形就会更新。有一 些变化(例如改变已经画好的线条属性)不会自动及时更新;对于这些变化,可以使用 plt.draw() 强制更新。在 IPython shell 中启动 Matplotlib 模式之后,就不需要使用 plt. show() 了。在这里插入图片描述

  2. 在IPython Notebook中画图:使用 %matplotlib 命令。可以将图形直接嵌在 IPython Notebook 页面中,有两种展现形式。
    • %matplotlib notebook 会在 Notebook 中启动交互式图形。
    • %matplotlib inline 会在 Notebook 中启动静态图形。在这里插入图片描述

1.4 将图形保存为文件

Matplotlib能够将图形保存为各种不同的数据格式。可以用 savefig() 命令将图形保存为文件。
在这里插入图片描述

2.两种画图接口

两种画图接口:一个是便捷的 MATLAB 风格接口,另一个是功能更强大的面向对象接口。

2.1 MATLAB风格接口

这种接口最重要的特性是有状态的(stateful):它会持续跟踪“当前的”图形和坐标轴, 所有 plt 命令都可以应用。你可以用 plt.gcf()(获取当前图形)和 plt.gca()(获取当前 坐标轴)来查看具体信息。

#创建图形
plt.figure()
#创建两个子图中的第一个,设置坐标轴 
#(行、列、子图编号)
plt.subplot(1, 2, 1)
plt.plot(x, np.sin(x), "*")

#创建两个子图中的第二个,设置坐标轴 
plt.subplot(1, 2, 2)
plt.plot(x, np.cos(x), "+")

在这里插入图片描述

2.2 面向对象接口

面向对象接口可以适应更复杂的场景,更好地控制图形。在面向对象接口中,画图函数不再受到当前“活动”图形或坐标轴的限制,而变成了显式的 Figure 和 Axes 的方法。
在这里插入图片描述
画比较复杂的图形时, 面向对象方法会更方便。

3.线形图

画一个简单的一阶线性函数y = f (x) 的可视化
在这里插入图片描述
figure(plt.Figure 类的一个实例)可以被看成是一个能够容纳各种坐 标轴、图形、文字和标签的容器。就像在图中看到的那样,axes (plt.Axes 类的一个实 例)是一个带有刻度和标签的矩形,最终会包含所有可视化的图形元素。
在这里插入图片描述

3.1 线条的颜色与风格

plt.plot() 函数可以通过相应的参 数设置颜色与风格。要修改颜色,就可以使用 color 参数,它支持各种颜色值的字符串。
在这里插入图片描述
也可以用 linestyle 调整线条的风格
在这里插入图片描述
也可以将 linestyle 和 color 编码组合起来,作为 plt. plot() 函数的一个非关键字参数使用。
在这里插入图片描述

3.2 坐标轴上下限

Matplotlib 会自动为图形选择最合适的坐标轴上下限,但是有时自定义坐标轴上下限可能会更好。调整坐标轴上下限最基础的方法是 plt.xlim() 和 plt.ylim()
在这里插入图片描述
如果想要让坐标轴逆序显示,那么也可以逆序设置坐标轴刻度值
在这里插入图片描述
还有一个方法是plt.axis()(注意不要搞混axes 和 axis)。通过传入[xmin, xmax, ymin, ymax] 对应的值x(0,10)。
在这里插入图片描述
还可以按照图形的内容自动收紧坐标轴,不留空白区域 。
在这里插入图片描述
让屏幕上显示的图形分辨率为 1:1,x 轴单位长度与 y 轴 单位长度相等。
在这里插入图片描述

3.3 设置图形标签

set (x, y, title)
在这里插入图片描述
在单个坐标轴上显示多条线时,创建图例显示每条线是很有效的方法。Matplotlib 内置了 一个简单快速的方法,可以用来创建图例,plt.legend()。虽然有不少用来设置图例的办法,但是在 plt.plot 函数中用 label 参数为每条线设置一个标签最简单
在这里插入图片描述
ax.set() 方法一次性设置所有的属性

4.散点图

4.1 plt.plot画散点图

在这里插入图片描述
函数的第三个参数是一个字符,表示图形符号的类型。与你之前用 ‘-’ 和 ‘–’ 设置线条属 性类似,对应的图形标记也有缩写形式。
在这里插入图片描述
还可以与线条、颜色代码组合起来,画出一条连接散点的线
在这里插入图片描述
更多的组合
在这里插入图片描述

4.2 用plt.scatter画散点图

其用法与 plt.plot() 函数类似
在这里插入图片描述
plt.scatter 与 plt.plot 的主要差别在于,前者在创建散点图时具有更高的灵活性,可以单独控制每个散点与数据匹配,也可以让每个散点具有不同的属性(大小、表面颜色、边 框颜色等)。
在这里插入图片描述

4.3 两者效率对比

在数据量较小的时候,两者在效率上的差异不大。但是当数据变大到几千个散点时,plt.plot 的效率将大大高于 plt.scatter。

5.可视化异常处理

5.1 基本误差线

基本误差线(errorbar)可以通过一个 Matplotlib 函数来创建
在这里插入图片描述
还可以设置水平方向的误差线(xerr)、单侧误差线(one-sided errorbar),以及其他形式的误差线。

5.2 连续误差

在这里插入图片描述

们将 fill_between 函数设置为:首先传入 x 轴坐标值,然后传入 y 轴下边界以 及 y 轴上边界,这样整个区域就被误差线填充了。

6.密度图与等高线图

在二维图上用等高线图或者彩色图来表示三维数据是个不错的方法。Matplotlib 提供 了三个函数来解决这个问题:用 plt.contour 画等高线图、用 plt.contourf 画带有填充色 的等高线图(filled contour plot)的色彩、用 plt.imshow 显示图形。

6.1 三维函数的可视化

首先用函数 z = f (x, y) 演示一个等高线图,按照下面的方式生成函数 f 样本数据:

 def f(x, y):            
 	return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
等高线图

可以用 plt.contour 函数来创建。它需要三个参数:x 轴、y 轴、z 轴,三个坐标轴的网格数据。x 轴与y 轴表示图形中的位置,而z 轴将通过等高线的等级来表示。用 np.meshgrid 函数来准备这些数据可能是最简单的方法,它可以从一维数组构建二维网格数据:
在这里插入图片描述

不同的颜色表示

当图形中只使用一种颜色时,默认使用虚线表示负数,使用实线表示正 数。另外,你可以用 cmap 参数设置一个线条配色方案来自定义颜色。还可以让更多的线 条显示不同的颜色,可以将数据范围等分为 20 份,然后用不同的颜色表示。
在这里插入图片描述

可以通过 plt.contourf() 函数来填充等高线图.

在这里插入图片描述

渲染成渐变图

是由于颜色的改变是一个离散而非连续的过程,图形还有一点不尽如人意,可以通过将等高线的数量设置得非常多来解决这个问题,但是最终获得的图形性能会很不好, 因为 Matplotlib 必须渲染每一级的等高线。其实有更好的做法,那就是通过 plt.imshow() 函数来处理,它可以将二维数组渲染成渐变图。
在这里插入图片描述

将等高线图与彩色图组合起来

需要用一幅背景色半透明的彩色图(可以通过 alpha 参数设置透 明度),与另一幅坐标轴相同、带数据标签的等高线图叠放在一起(用 plt.clabel() 函数 实现):
在这里插入图片描述

7.频次直方图、数据区间划分和分布密度

创建一个简易的频次直方图

在这里插入图片描述

个性化:

在这里插入图片描述

自定义:

在这里插入图片描述
如果只需要简单地计算频次直方图(就是计算每段区间的样本数),而并不想画图显示,那么可以直接用 np.histogram():

counts, bin_edges = np.histogram(x, bins=8)
print(counts)
print(bin_edges)

OUTPUT:
[  5  42 172 325 304 127  22   3]
[-3.46763628 -2.58006676 -1.69249724 -0.80492773  0.08264179  0.97021131
  1.85778083  2.74535035  3.63291987]

7.1二维频次直方图与数据区间划分

可以将二维数组按照二维区 间进行切分,来创建二维频次直方图。
首先,用一个多元高斯分布(multivariate Gaussian distribution)生成 x 轴与 y 轴的样本 数据:

mean = [0, 0]
cov = [[1, 1], [1, 2]]
x, y = np.random.multivariate_normal(mean, cov, 10000).T
plt.hist2d:二维频次直方图 :

在这里插入图片描述

plt.hist2d 有一个类似的函数 np.histogram2d

在这里插入图片描述

plt.hexbin:六边形区间划分

二维频次直方图是由与坐标轴正交的方块分割而成的,还有一种常用的方式是用正六边形分割。
在这里插入图片描述

核密度估计

KDE 方法通过不同的平滑带宽长度(smoothing length)在拟合函数的准确性与平滑性之 间作出权衡。想找到恰当的平滑带宽长度是件很困难的事,gaussian_kde 通过一种经验方法试图找到输入数据平滑长度的近似 最优解。

from scipy.stats import gaussian_kde 
 
# 拟合数组维度[Ndim, Nsamples]         
data = np.vstack([x, y])         
kde = gaussian_kde(data) 
 
# 用一对规则的网格数据进行拟合         
xgrid = np.linspace(-3.5, 3.5, 40)         
ygrid = np.linspace(-6, 6, 40)         
Xgrid, Ygrid = np.meshgrid(xgrid, ygrid)         
Z = kde.evaluate(np.vstack([Xgrid.ravel(), Ygrid.ravel()])) 
 
# 画出结果图         
plt.imshow(Z.reshape(Xgrid.shape),                    
origin='lower', aspect='auto',                    
extent=[-3.5, 3.5, -6, 6],                    
cmap='Blues')         
cb = plt.colorbar()         
cb.set_label("density")

在这里插入图片描述

8.配置图例

在可视化图形中使用图例,可以为不同的图形元素分配标签。
在这里插入图片描述
设置图例的位置,并取 消外边框
在这里插入图片描述
用 ncol 参数设置图例的标签列数
在这里插入图片描述
还可以为图例定义圆角边框(fancybox)、增加阴影、改变外边框透明度(framealpha 值), 或者改变文字间距
在这里插入图片描述

8.1 选择图例显示的元素

图例会默认显示所有元素的标签。如果不想显示全部,可以通过一些图 形命令来指定显示图例中的哪些元素和标签。plt.plot() 命令可以一次创建多条线,返回 线条实例列表。一种方法是将需要显示的线条传入 plt.legend()
在这里插入图片描述

8.2 在图例中显示不同尺寸的点

,默认的图例仍然不能满足我们的可视化需求。例如,你可能需要用不同尺寸的点来 表示数据的特征,并且希望创建这样的图例来反映这些特征。
在这里插入图片描述

8.3 同时显示多个图例

创建一个新的图例艺术家对象(legend artist),然后用底层的(lower-level) ax.add_artist() 方法在图上添加第二个图例
在这里插入图片描述

9.配置颜色条

图例通过离散的标签表示离散的图形元素。然而,对于图形中由彩色的点、线、面构成的连续标签,用颜色条来表示的效果比较好。
在这里插入图片描述

9.1 配置颜色条

可以通过 cmap 参数为图形设置颜色条的配色方案。
在这里插入图片描述

选择配色方案

一般情况下,只需要重点关注三种不同的配色方案:

  1. 顺序配色方案 由一组连续的颜色构成的配色方案(例如 binary 或 viridis)。
  2. 互逆配色方案 通常由两种互补的颜色构成,表示正反两种含义(例如 RdBu 或 PuOr)。
  3. 定性配色方案 随机顺序的一组颜色(例如 rainbow 或 jet)。
颜色条刻度的限制与扩展功能的设置

颜色条本身仅看作是一个 plt.Axes 实例,因此前面所学的所有关于坐标轴和刻度值的格式配置技巧都可以派上用场。

在这里插入图片描述

离散型颜色条

表示离散数据。最简单的做法就是使用 plt.cm.get_cmap() 函数,将适当的配色方案的名称以及需要的区间数量传进去即可。
在这里插入图片描述

9.2  案例:手写数字的可视化图

# 加载数字0~9的图形,对其进行可视化
from sklearn.datasets import load_digits
digits = load_digits()
fig, ax = plt.subplots(8, 8, figsize=(6, 6))
for i,axi in enumerate(ax.flat):
    axi.imshow(digits.images[i], cmap='binary') 
    axi.set(xticks=[], yticks=[])

# 用IsoMap方法将数字投影到二维空间 
from sklearn.manifold import Isomap
iso = Isomap(n_components=2)
projection = iso.fit_transform(digits.data)

在这里插入图片描述
在这里插入图片描述

10.多子图

10.1 plt.axes:手动创建子图

创建坐标轴最基本的方法就是使用 plt.axes 函数。这个函数的默认配置是创建一个标准的坐标轴,填满整张图。它还有一个可选参数,由图形坐标系统的四个值构成。这四个值分别表示图形坐标系统的 [bottom, left, width, height](底坐标、左坐 标、宽度、高度),数值的取值范围是左下角(原点)为 0,右上角为 1。 如果想要在右上角创建一个画中画,那么可以首先将 x 与 y 设置为 0.65(就是坐标轴原点 位于图形高度 65% 和宽度 65% 的位置),然后将 x 与 y 扩展到 0.2(也就是将坐标轴的宽 度与高度设置为图形的 20%)。 图 4-59 显示了代码的结果:
在这里插入图片描述
面向对象画图接口中类似的命令有 fig.add_axes()。用这个命令创建两个竖直排列的坐标轴。
在这里插入图片描述

10.2 plt.subplot:简易网格子图

若干彼此对齐的行列子图是常见的可视化任务,Matplotlib 拥有一些可以轻松创建它们的简便方法。最底层的方法是用 plt.subplot() 在一个网格中创建一个子图。这个命令有三个整型参数——将要创建的网格子图行数、列数和索引值,索引值从 1 开始,从左上角到 右下角依次增大:
在这里插入图片描述
plt.subplots_adjust 命令可以调整子图之间的间隔。用面向对象接口的命令fig.add_ subplot() 可以取得同样的效果:
在这里插入图片描述

10.3 plt.subplots:用一行代码创建网格

当创建一个大型网格子图时,就没办法使用前面那种方法了,尤其是想隐藏内部子图的 x 轴与 y 轴标题时。plt.subplots() 实现了你想要的功能(需要注意此处 subplots 结尾多了个 s)。这个函数不是用来创建单个子图的, 而是 用一行代码创建多个子图,并返回一个包含子图的 NumPy 数组。关键参数是行数与列数, 以及可选参数 sharex 与 sharey,通过它们可以设置不同子图之间的关联关系。 我们将创建一个 2×3 网格子图,每行的 3 个子图使用相同的y 轴坐标,每列的 2 个子图 使用相同的 x 轴坐标。
在这里插入图片描述
在这里插入图片描述

10.4 plt.GridSpec:实现更复杂的排列方式

如果想实现不规则的多行多列子图网格,plt.GridSpec() 是最好的工具。plt.GridSpec() 对象本身不能直接创建一个图形,它只是 plt.subplot() 命令可以识别的简易接口。
在这里插入图片描述

# 创建一些正态分布数据         
mean = [0, 0]         
cov = [[1, 1], [1, 2]]         
x, y = np.random.multivariate_normal(mean, cov, 3000).T 
        
# 设置坐标轴和网格配置方式         
fig = plt.figure(figsize=(6, 6))         
grid = plt.GridSpec(4, 4, hspace=0.2, wspace=0.2)         
main_ax = fig.add_subplot(grid[:-1, 1:])         
y_hist = fig.add_subplot(grid[:-1, 0], xticklabels=[], sharey=main_ax)         
x_hist = fig.add_subplot(grid[-1, 1:], yticklabels=[], sharex=main_ax) 
        
# 主坐标轴画散点图         
main_ax.plot(x, y, 'ok', markersize=3, alpha=0.2) 
      
# 次坐标轴画频次直方图         
x_hist.hist(x, 40, histtype='stepfilled',  orientation='vertical', color='gray')         
x_hist.invert_yaxis() 
   
y_hist.hist(y, 40, histtype='stepfilled',  orientation='horizontal', color='gray')         
y_hist.invert_xaxis()

在这里插入图片描述

11.文字与注释

11.1 坐标变换与文字位置

需要将文字放在与数据无关的位置上,比如坐标轴或者图形中。在 Matplotlib 中,通过调整坐标变换(transform)来实现。

一共有三种解决这类问题的预定义变换方式:

ax.transData 以数据为基准的坐标变换。
ax.transAxes 以坐标轴为基准的坐标变换(以坐标轴维度为单位)。
fig.transFigure 以图形为基准的坐标变换(以图形维度为单位)。

在这里插入图片描述
假如改变了坐标轴上下限,那么只有 transData 坐标会受影响,其他坐标系都不变.
在这里插入图片描述

11.2 箭头与注释

plt.annotate()函数既可以创建文字,也可以创建箭头,而且它创建的箭头能够进行非常灵活
的配置。
在这里插入图片描述

12.自定义坐标轴刻度

12.1 主要刻度与次要刻度

每一个坐标轴都有主要刻度线与次要刻度线。主要刻度往往更大或更显著,而次要刻度往往更小。一般情况下 Matplotlib 不会使用次要刻度

在这里插入图片描述

12.2 隐藏刻度与标签

最常用的刻度 / 标签格式化操作可能就是隐藏刻度与标签了,可以通过 plt.NullLocator() 与 plt.NullFormatter() 实现
在这里插入图片描述

12.3 增减刻度数量

默认刻度标签有一个问题,就是显示较小图形时,通常刻度显得十分拥挤。
在这里插入图片描述

可以用 plt.MaxNLocator()来解决这个问题,通过它可以设置最多需要显示多少刻度。根据设置的最多刻度数量,Matplotlib 会自动为刻度安排恰当的位置
在这里插入图片描述

12.4 花哨的刻度格式

在这里插入图片描述
如果将刻度与网格线画在 π 的倍数上,图形会更加自然。可以通过设置一个 MultipleLocator 来实现,它可以将刻度放在你提供的数值的倍数上。为了更好地测量,在 π/4 的倍数上添加主要刻度和次要刻度
在这里插入图片描述

12.5 格式生成器与定位器小结

前面已经介绍了一些格式生成器与定位器,下面用表格简单地总结一下内置的格式生成器
与定位器选项。
在这里插入图片描述

13.Matplotlib自定义:配置文件与样式表

13.1 手动配置图形

默认:
在这里插入图片描述
改进:

# 用灰色背景
ax = plt.axes(facecolor='#E6E6E6')
ax.set_axisbelow(True)

# 画上白色的网格线
plt.grid(color='w', linestyle='solid') 

# 隐藏坐标轴的线条
for spine in ax.spines.values():
    spine.set_visible(False)

# 隐藏上边与右边的刻度
ax.xaxis.tick_bottom()
ax.yaxis.tick_left() 

# 弱化刻度与标签
ax.tick_params(colors='gray', direction='out')
for tick in ax.get_xticklabels():
    tick.set_color('gray')
for tick in ax.get_yticklabels():
    tick.set_color('gray')

# 设置频次直方图轮廓色与填充色
ax.hist(x, edgecolor='#E6E6E6', color='#EE6666')

在这里插入图片描述

13.2 修改默认配置:rcParams

Matplotlib 每次加载时,都会定义一个运行时配置(rc),其中包含了所有创建的图形元素的默认风格。可以用 plt.rc 简便方法随时修改这个配置。来看看如何调整 rc 参数,用默认图形实现之前手动调整的效果。
在这里插入图片描述
在这里插入图片描述

13.3 样式表

通过 plt.style.available 命令可以看到所有可用的风格
在这里插入图片描述

14.用Matplotlib画三维图

导入 Matplotlib 自带的 mplot3d 工具箱来画三维图

from mpl_toolkits import mplot3d

在这里插入图片描述

14.1 三维数据点与线

最基本的三维图是由 (x , y , z ) 三维坐标点构成的线图与散点图。与前面介绍的普通二维图类似,可以用 ax.plot3D 与 ax.scatter3D 函数来创建它们。由于三维图函数的参数与前面二维图函数的参数基本相同,下面来画一个三角螺旋线(trigonometric spiral),在线上随机分布一些散点
在这里插入图片描述

14.2 三维等高线图

mplot3d 也有用同样的输入数据创建三维晕渲(relief)图的工具。与二维 ax.contour 图形一样,ax.contour3D 要求所有数据都是二维网格数据的形式,并且由函数计算 z 轴数值。下面演示一个用三维正弦函数画的三维等高线图
在这里插入图片描述

默认的初始观察角度有时不是最优的,view_init 可以调整观察角度与方位角(azimuthal angle)。把俯仰角调整为 60 度(这里的 60 度是 x-y 平面的旋转角度),方位角调整为 35 度(就是绕 z 轴顺时针旋转 35 度):
在这里插入图片描述

14.3 线框图和曲面图

在这里插入图片描述
在这里插入图片描述
画曲面图需要二维数据,但可以不是直角坐标系(也可以用极坐标)。下面的示例创建了一个局部的极坐标网格(polar grid),当把它画成 surface3D 图形时,可以获得一种使用了切片的可视化效果:
在这里插入图片描述

14.4 曲面三角剖分

在这里插入图片描述
在这里插入图片描述
莫比乌斯带
在这里插入图片描述

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值