30000字 Matplotlib 实操干货,38个案例带你从入门到进阶!

本文是一篇关于Matplotlib数据可视化的教程,涵盖了散点图、线图、直方图和条形图的创建与自定义。通过38个实例,从基础到进阶,详细讲解了Matplotlib的各种图表用法,包括颜色、线条样式、误差线、填充区域等的调整。此外,还介绍了如何在图表中插入水平线、垂直线以及创建二维直方图和边际图。适合已经有一定Matplotlib基础的读者深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

译文出品:Python数据之道

原文作者:Rizky Maulana Nurhidayat

翻译:Lemon

Matplotlib 实操干货,

38个案例带你从入门到进阶!

「Python数据之道」注:本文完整内容的pdf版可以在文末获取。

数据可视化旨在将数据呈现为更直接的表示形式,例如散点图,密度图,条形图等。通过可视化数据,可以检测到潜在的异常值。在 Python 中,可以使用各种模块或库来可视化数据。Matplotlib 是主流模块之一。可以使用 Matplotlib 以各种绘图样式来可视化数据。但是,Matplotlib 无法显示动态图。如果要创建一个巨大的动态图,则可以从 plotly 中使用 Dash

本文将介绍如何使用 Matplotlib 以各种方式可视化数据。完整的文章可能有 90 个示例,可以从不同的角度创建绘图。这不是使用 Matplotlib 进行数据可视化的最完整的教程,但是我相信本文内容可以满足许多人的需求,并可以应用到许多领域。

如前所述,本文将创建 90 个不同的绘图示例。这些示例分布在 11 种不同的样式图中:散点图,折线图,一维直方图,二维直方图,边际图,条形图,箱形图,小提琴图,饼图,极坐标图,地理投影,3D图和轮廓图。可以通过 图1 大致了解本文的内容。

图1. Matplotlib 中生成的各种图

本文将专注于创建和定制各种图表。因此,文章中假设读者已经了解 Matplotlib 的一些基础知识,例如,在 Matplotlib 中创建多个子图和自定义颜色图。

在开始撰写本文时,本来打算只写一篇文章。但是,我认为由于阅读时间的缘故,需要将其分为几部分。如果我将所有内容写成一篇文章,则将花费很多时间。因此,我将完整的内容分为 2 或 3 部分。

本文是第一部分,共有 38个 案例,让我们开始吧。

Matplotlib 介绍

要安装 Matplotlib,可以使用以下代码通过 pip 安装它:

pip install matplotlib

或者通过 conda 来安装:

conda install -c anaconda matplotlib

本文中,安装了 Matplotlib 3.3.2 版本。可以通过下面的代码检查所安装的版本号:

pip show matplotlib

如果要在 Jupyter Notebook(以下称为 Jupyter)中进行检查,则可以通过下面的代码来进行检查,如图2所示。

图2. 在 Jupyter 中检查 Matplotlib 的版本

如果你想更新 Matplotlib 的版本,可以使用下面的代码:

pip install matplotlib --upgrade

在继续进行第一部分之前,需要告知下,我已经自定义了 Matplotlib 绘图样式,例如使用 LaTeX 字体作为默认样式,更改字体大小和字体,更改 xtick 和 ytick 方向和大小,以及在  x 轴和 y 轴。要将 LaTeX 字体用作 Matplotlib 中的默认字体,可以使用下面的代码:

plt.rcParams['text.usetex'] = True

如果遇到一些错误,则需要阅读下面文章中的内容。我已经解释了在 Matplotlib 中处理 LaTeX 字体的详细过程。

https://towardsdatascience.com/5-powerful-tricks-to-visualize-your-data-with-matplotlib-16bc33747e05

要自定义其他参数(字体大小,字体系列和刻度参数),只需在代码开头编写以下代码:

plt.rcParams['font.size'] = 15
plt.rcParams['font.family'] = "serif"tdir = 'in'
major = 5.0
minor = 3.0
plt.rcParams['xtick.direction'] = tdir
plt.rcParams['ytick.direction'] = tdirplt.rcParams['xtick.major.size'] = major
plt.rcParams['xtick.minor.size'] = minor
plt.rcParams['ytick.major.size'] = major
plt.rcParams['ytick.minor.size'] = minor

如果需要更详细地了解,可以访问下面的内容:

https://towardsdatascience.com/create-professional-plots-using-matplotlib-63a6863b7363

01. 散点图(Scatter plot)

在本部分,有八个散点图的示例。在创建散点图之前,需要使用下面的代码生成模拟数据:

import numpy as np
import matplotlib.pyplot as plt

N = 50

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

变量 x 是从 0 到 10 的 50 个数据的数组。变量 y 是 sin(x)cos(x) 的平方之和。可以使用以下代码以散点图的形式可视化 x 轴上的变量 x 和 y 轴上的变量 y :

plt.figure()
plt.scatter(x, y)

上面的内容很简单,结果如图3所示:

图3. Matplotlib中的默认散点图

为了使其更美观,可以减少每个数据的大小并给标签添加下面的代码:

plt.scatter(x, y, s = 15, label = r'$y  = sin^2(x) + cos(x)$')

要更改颜色,需要在代码中添加 color 参数:

color = 'r' # r means red

如果要使轴比例尺相同,可以使用下面的代码:

plt.axis('equal')

要为 x 轴和 y 轴创建轴标签,可以添加以下代码:

plt.xlabel(r'$x$ (rad)')
plt.ylabel(r'$y$')

要显示图例,可以使用下面的代码:

plt.legend()

要保存图形,可以使用以下代码:

plt.savefig('scatter2.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

完整的代码如下:

N = 50

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

plt.figure()
plt.scatter(x, y, s = 15, label = r'$ y  = sin^2(x) + cos(x)$', color = 'r')
plt.axis('equal')

plt.legend()
plt.xlabel(r'$x$ (rad)')
plt.ylabel(r'$y$')

plt.savefig('scatter2.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

创建的散点图如 图4 所示:

图4. 修改后的散点图

上面可以看到轴内部的 x 轴和 y 轴的刻度方向,并且使用的字体为 LaTeX 格式。如果要更改图形尺寸,可以在 plt.figure() 中添加图形尺寸参数

plt.figure(figsize=(7, 4.5))

更改标记样式

要更改标记样式,例如,要从点更改为十字,可以在 plt.scatter 中添加此参数:

marker = 'x'

图5 是更改为十字后的结果:

图5. 修改样式后的散点图

Matplotlib 中有各种各样的样式,可以通过下面的链接来进行了解:

https://matplotlib.org/api/markers_api.html

如果你已阅读以上文档,则可以意识到可以将字母用作标记样式。下面将展示将字母用作标记的示例,如 图6 所示:

图6. Matplotlib 中使用字母为标记样式

为了生成 图6,这里为 x 轴和 y 轴的参数创建了一个不同的函数。以下是生成它的代码:

np.random.seed(100)

N = 50

randx = np.random.random(N) * 100
randy = np.random.random(N) * 100

为了可视化变量 randx 和 randy ,可以运行以下代码:

plt.figure(figsize=(7, 6))

plt.scatter(randx, randy, marker=r'$\beta$', s = 150, color = 'darkorange')

plt.axis('equal')

plt.xlabel('randx')
plt.ylabel('randy')

plt.tight_layout()

这里使用希腊符号 beta 作为标记样式。也可以使用其他字母来更改它,例如  a,B,C,d 或 ** 1、2、3** 等。

自定义每个数据的大小

这里将展示如何为每个数据创建大小不同的散点图,如 图7 所示。

图7. 自定义散点图中数据点的大小

为了创建它,使用以下代码为变量 randx 和 randy 生成了一个随机数据,从 0 到 100

np.random.seed(100)

N = 30

randx = np.random.random(N) * 100
randy = np.random.random(N) * 100

之后,使用下面的代码为 50 到 200 之间的每个数据生成一个随机整数。

size = np.random.randint(50, 200, size=N)

进行可视化,只需添加下面的参数:

plt.scatter(randx, randy, s = size, color = 'darkorange')

创建 图7 时需要在 x 轴和 y 轴上插入次刻度。要插入它,需要使用以下代码导入子模块 MultipleLocator

from matplotlib.ticker import MultipleLocator

之后,可以添加以下代码,以插入辅助轴:

ax = plt.gca()ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(10))

下面是生成 图7 的完整代码:

np.random.seed(100)

N = 30

plt.figure(figsize=(7, 6))

randx = np.random.random(N) * 100
randy = np.random.random(N) * 100
size = np.random.randint(50, 200, size=N)

plt.scatter(randx, randy, s = size, color = 'darkorange')
plt.axis('equal')

ax = plt.gca()
ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(10))

plt.xlabel('randx')
plt.ylabel('randy')

plt.savefig('scatter5.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

以颜色编码的散点图

可以使用颜色图更改颜色,这意味着具有不同大小的数据将以不同的颜色进行颜色编码。可以像下面这样在 plt.scatter() 中添加颜色参数:

c = size

要嵌入颜色条,可以使用以下代码:

plt.colorbar()

得到的结果如 图8 所示:

图8. 不同颜色标注的散点图

以下是创建 图8 完整的代码:

np.random.seed(100)

N = 30

randx = np.random.random(N) * 100
randy = np.random.random(N) * 100
ranking = np.random.random(N) * 200
size = np.random.randint(50, 200, size=N)

plt.figure(figsize=(7, 5))
plt.scatter(randx, randy, s = size, c = size, alpha = .8)
plt.axis('equal')

ax = plt.gca()
ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(10))

plt.xlabel('randx')
plt.ylabel('randy')

plt.colorbar()

plt.savefig('scatter6.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

自定义颜色图

可以使用以下参数更改颜色图:

cmap = 'inferno'

Matplotlib 官方文档对颜色图进行了详细的讲解,可以通过下面链接来访问:

https://matplotlib.org/3.3.2/tutorials/colors/colormaps.html

在本文中,通过组合蓝色和橙色的颜色图创建了自己的颜色图,如 图9 所示:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值