百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

使用Matplotlib可视化数据的5个强大技巧

liuian 2025-03-12 16:44 7 浏览

数据可视化用于以更直接的表示方式显示数据,并且更易于理解。它可以用柱状图、散点图、折线图、饼图等形式形成。许多人仍然使用Matplotlib作为后端模块来可视化他们的图形。在这个故事中,我将给你一些技巧,使用Matplotlib创建一个优秀图表的5个强大技巧。

1. 使用Latex字体

默认情况下,我们可以使用Matplotlib提供的一些不错的字体。但是,有些符号不够好,不能由Matplotlib创建。例如,符号phi(φ),如图1所示。

正如你在y-label中看到的,它仍然是phi(φ)的符号,但是对于某些人来说,它还不足以作为绘图标签。为了使它更漂亮,你可以使用Latex字体。如何使用它?答案就在这里。

plt.rcParams['text.usetex'] = True
plt.rcParams['font.size'] = 18

你可以在python代码的开头添加上面的代码。第1行定义绘图中使用的LaTeX字体。你还需要定义大于默认大小的字体大小。如果你不换,我想它会给你一个小标签。我选了18。应用上述代码后的结果如图2所示。

你需要在符号的开头和结尾写上双美元符号,像这样(\$…\$)

plt.xlabel('x')
plt.ylabel('$\phi$ (phi)')

如果你有一些错误或没有安装使用LaTeX字体所需的库,则需要通过在Jupyter notebook中运行以下代码来安装这些库。

!apt install texlive-fonts-recommended texlive-fonts-extra cm-super dvipng

如果你想通过终端安装,可以输入

apt install texlive-fonts-recommended texlive-fonts-extra cm-super dvipng

当然,你可以使用一些不同的字体系列,如serif、sans-serif(上面的示例)等。要更改字体系列,可以使用以下代码。

plt.rcParams['font.family'] = "serif"

如果你将上面的代码添加到代码中,它将给你一个图,如图3所示。

你能理解图3和图2之间的区别吗?是的,如果你仔细分析,区别在于字体的尾部。后一个图形使用serif,而前者使用sans-serif。简而言之,serif表示尾,sans表示没有。如果你想了解更多有关字体系列或字体的信息,我建议你使用此链接。

https://en.wikipedia.org/wiki/Typeface

你还可以使用Jupyter themes库设置字体系列/字体。我已经做了使用它的教程。只需单击以下链接。Jupyter主题也可以改变你的Jupyter主题,例如暗模式主题:https://medium.com/@
rizman18/how-can-i-customize-jupyter-notebook-into-dark-mode-7985ce780f38

我们希望插入复杂文本,如图4的标题所示。

如果你想创建图4,可以使用这个完整的代码

# 导入库
import numpy as np
import matplotlib.pyplot as plt

# 调整matplotlib参数
plt.rcParams.update(plt.rcParamsDefault)
plt.rcParams['text.usetex'] = True
plt.rcParams['font.size'] = 18
plt.rcParams['font.family'] = "serif"

# 创建模拟数据
r = 15
theta = 5
rw = 12
gamma = 0.1

err = np.arange(0., r, .1)
z = np.where(err < rw, 0, gamma * (err-rw)**2 * np.sin(np.deg2rad(theta)))

# 可视化数据
plt.scatter(err, z, s = 10)
plt.title(r'$\Sigma(x) = \gamma x^2 \sin(\theta)
, pad = 20) plt.xlabel('x') plt.ylabel('$\phi
) # 保存图表 plt.savefig('latex.png', dpi = 300, pad_inches = .1, bbox_inches = 'tight')

2.创建缩放效果

在这个技巧中,我将给你一个生成绘图的代码,如图5所示。

首先,你需要了解plt.axes()和plt.figure() 你可以在下面的链接中查看它。代码plt.figure() 覆盖单个容器中的所有对象,包括轴、图形、文本和标签。代码plt.axes()只包含特定的部分。我想,图6可以给你一个简单的理解。

黑盒子使用plt.figure(),红色和蓝色的盒子使用plt.axes(). 在图6中,有两个轴,红色和蓝色。你可以查看此链接以获取基本参考:
https://medium.com/datadriveninvestor/python-data-visualization-with-matplotlib-for-absolute-beginner-python-part-ii-65818b4d96ce

理解之后,你可以分析如何创建图5。是的,简单地说,图5中有两个轴。第一个轴是一个大的绘图,放大版本从580到650,第二个是缩小版本。下面是创建图5的代码。

# 创建主容器
fig = plt.figure()

# 设置随机种子
np.random.seed(100)

# 创建模拟数据
x = np.random.normal(400, 50, 10_000)
y = np.random.normal(300, 50, 10_000)
c = np.random.rand(10_000)

# 创建放大图
ax = plt.scatter(x, y, s = 5, c = c)
plt.xlim(400, 500)
plt.ylim(350, 400)
plt.xlabel('x', labelpad = 15)
plt.ylabel('y', labelpad = 15)

# 创建放大图
ax_new = fig.add_axes([0.6, 0.6, 0.2, 0.2]) # 放大图的位置与放大图的比例比较
plt.scatter(x, y, s = 1, c = c)

# 保存图形,留好边距
plt.savefig('zoom.png', dpi = 300, bbox_inches = 'tight', pad_inches = .1)

如果你需要代码的解释,可以访问此链接
:https://medium.com/datadriveninvestor/data-visualization-with-matplotlib-for-absolute-beginner-part-i-655275855ec8

我还提供了另一个版本的缩放效果,你可以使用Matplotlib。如图7所示。

要创建图7,你需要在Matplotlib中使用add_subblot或其他语法(subblot)创建三个轴。为了更容易使用,我在这里加上。要创建它们,可以使用以下代码。

fig = plt.figure(figsize=(6, 5))
plt.subplots_adjust(bottom = 0., left = 0, top = 1., right = 1)

# 创建第一个轴,左上角的图用绿色的图
sub1 = fig.add_subplot(2,2,1) # 两行两列,第一单元格

# 创建第二个轴,即左上角的橙色轴
sub2 = fig.add_subplot(2,2,2) # 两行两列,第二个单元格

# 创建第三个轴,第三和第四个单元格的组合
sub3 = fig.add_subplot(2,2,(3,4)) # 两行两列,合并第三和第四单元格

代码将生成一个图,如图8所示。它告诉我们它将生成2行2列。轴sub1(2,2,1)是子图(第一行,第一列)中的第一个轴。顺序从左上侧到右开始。轴sub2(2,2,2)被放置在第一行第二列中。轴sub3(2,2,(3,4)),是第二行第一列和第二行第二列之间的合并轴。

当然,我们需要定义一个模拟数据,以便在绘图中可视化。在这里,我定义了线性函数和正弦函数的简单组合,如下面的代码所示。

# 使用lambda定义函数
stock = lambda A, amp, angle, phase: A * angle + amp * np.sin(angle + phase)

# 定义参数
theta = np.linspace(0., 2 * np.pi, 250) # x轴
np.random.seed(100)
noise = 0.2 * np.random.random(250)
y = stock(.1, .2, theta, 1.2) + noise # y轴

如果你将代码应用到前面的代码中,你将得到一个图,如图9所示。

下一步是限制第一个和第二个轴(sub1和sub2)的x轴和y轴,为sub3中的两个轴创建阻塞区域,并创建代表缩放效果的ConnectionPatch。可以使用以下完整的代码来完成(记住,为了简单起见,我没有使用循环)。

# 使用lambda定义函数
stock = lambda A, amp, angle, phase: A * angle + amp * np.sin(angle + phase)

# 定义参数
theta = np.linspace(0., 2 * np.pi, 250) # x轴
np.random.seed(100)
noise = 0.2 * np.random.random(250)
y = stock(.1, .2, theta, 1.2) + noise # y轴

# 创建大小为6x5的主容器
fig = plt.figure(figsize=(6, 5))
plt.subplots_adjust(bottom = 0., left = 0, top = 1., right = 1)

# 创建第一个轴,左上角的图用绿色的图
sub1 = fig.add_subplot(2,2,1) # 两行两列,第一单元格
sub1.plot(theta, y, color = 'green')
sub1.set_xlim(1, 2)
sub1.set_ylim(0.2, .5)
sub1.set_ylabel('y', labelpad = 15)

# 创建第二个轴,即左上角的橙色轴
sub2 = fig.add_subplot(2,2,2) # 两行两列,第二个单元格
sub2.plot(theta, y, color = 'orange')
sub2.set_xlim(5, 6)
sub2.set_ylim(.4, 1)

# 创建第三个轴,第三和第四个单元格的组合
sub3 = fig.add_subplot(2,2,(3,4)) # 两行两列,合并第三和第四单元格
sub3.plot(theta, y, color = 'darkorchid', alpha = .7)
sub3.set_xlim(0, 6.5)
sub3.set_ylim(0, 1)
sub3.set_xlabel(r'$\theta$ (rad)', labelpad = 15)
sub3.set_ylabel('y', labelpad = 15)

# 在第三个轴中创建阻塞区域
sub3.fill_between((1,2), 0, 1, facecolor='green', alpha=0.2) # 第一个轴的阻塞区域
sub3.fill_between((5,6), 0, 1, facecolor='orange', alpha=0.2) # 第二轴的阻塞区域

# 在左侧创建第一个轴的ConnectionPatch
con1 = ConnectionPatch(xyA=(1, .2), coordsA=sub1.transData, 
                       xyB=(1, .3), coordsB=sub3.transData, color = 'green')
# 添加到左侧
fig.add_artist(con1)

# 在右侧创建第一个轴的ConnectionPatch
con2 = ConnectionPatch(xyA=(2, .2), coordsA=sub1.transData, 
                       xyB=(2, .3), coordsB=sub3.transData, color = 'green')
# 添加到右侧
fig.add_artist(con2)

# 在左侧创建第二个轴的ConnectionPatch
con3 = ConnectionPatch(xyA=(5, .4), coordsA=sub2.transData, 
                       xyB=(5, .5), coordsB=sub3.transData, color = 'orange')
# 添加到左侧
fig.add_artist(con3)

# 在右侧创建第二个轴的ConnectionPatch
con4 = ConnectionPatch(xyA=(6, .4), coordsA=sub2.transData, 
                       xyB=(6, .9), coordsB=sub3.transData, color = 'orange')
# 添加到右侧
fig.add_artist(con4)

# 保存图形,留好边距
plt.savefig('zoom_effect_2.png', dpi = 300, bbox_inches = 'tight', pad_inches = .1)

代码将为你提供一个出色的缩放效果图,如图7所示。

3.创建图例

你的图中是否有许多图例要显示?如果是,则需要将它们放置在主轴之外。

要将图例放置在主容器之外,需要使用此代码调整位置

plt.legend(bbox_to_anchor=(1.05, 1.04)) # 图例的位置

值1.05和1.04位于朝向主容器的x和y轴坐标中。你可以改变它。现在,把上面的代码应用到我们的代码中,

# 使用lambda创建wave函数
wave = lambda amp, angle, phase: amp * np.sin(angle + phase)

# 设置参数值
theta = np.linspace(0., 2 * np.pi, 100)
amp = np.linspace(0, .5, 5)
phase = np.linspace(0, .5, 5)

# 创建主容器及其标题
plt.figure()
plt.title(r'Wave Function $y = \gamma \sin(\theta + \phi_0) 
, pad = 15) # 为每个放大器和阶段创建绘图 for i in range(len(amp)): lgd1 = str(amp[i]) lgd2 = str(phase[i]) plt.plot(theta, wave(amp[i], theta, phase[i]), label = (r'$\gamma =
+lgd1+', $\phi =
+lgd2)) plt.xlabel(r'$\theta$ (rad)', labelpad = 15) plt.ylabel('y', labelpad = 15) # 调整图例 plt.legend(bbox_to_anchor=(1.05, 1.04)) # 保存图形,留好边距 plt.savefig('outbox_legend.png', dpi = 300, bbox_inches = 'tight', pad_inches = .1)

运行代码后,它将给出一个图,如图11所示。

如果要使图例框更漂亮,可以使用以下代码添加阴影效果。它将显示一个图,如图12所示。

plt.legend(bbox_to_anchor=(1.05, 1.04), shadow=True)

4.创建连续误差图

在过去的十年里,数据可视化的风格被转移到一个干净的绘图主题上。通过阅读国际期刊或网页上的一些新论文,我们可以看到这种转变。最流行的方法之一是用连续的误差可视化数据,而不是使用误差条。你可以在图13中看到它。

图13是通过使用fill_between生成的。在fill_between语法中,你需要定义上限和下限,如图14所示。

要应用它,可以使用以下代码。

plt.fill_between(x, upper_limit, lower_limit)

参数上限和下限可以互换。这是完整的代码。

N = 9
x = np.linspace(0, 6*np.pi, N)

mean_stock = (stock(.1, .2, x, 1.2))
np.random.seed(100)
upper_stock = mean_stock + np.random.randint(N) * 0.02
lower_stock = mean_stock - np.random.randint(N) * 0.015

plt.plot(x, mean_stock, color = 'darkorchid', label = r'$y = \gamma \sin(\theta + \phi_0)
) plt.fill_between(x, upper_stock, lower_stock, alpha = .1, color = 'darkorchid') plt.grid(alpha = .2) plt.xlabel(r'$\theta$ (rad)', labelpad = 15) plt.ylabel('y', labelpad = 15) plt.legend() plt.savefig('fill_between.png', dpi = 300, bbox_inches = 'tight', pad_inches = .1)

5.调整边距

如果你分析上面的每一行代码,plt.savefig()后面会是一个复杂的参数:bbox_inches和pad_inches。当你在撰写一篇期刊或文章时,它们会为你提供边距。如果不包括它们,则保存后,绘图的边距将更大。图15展示了有bbox_inches和pad_inches以及没有它们的不同绘图。

我想你看不出图15中两个图之间的区别。我将尝试用不同的背景色来显示它,如图16所示。

同样,当你在一篇论文或一篇文章中插入你的图表时,这个技巧会帮助你。你不需要裁剪它来节省空间。

结论

Matplotlib是一个多平台库,可以在许多操作系统使用。它是将数据可视化的老库之一,但它仍然很强大。因为开发人员总是根据数据可视化的趋势进行一些更新。上面提到的一些技巧就是更新的例子。

相关推荐

GANs为何引爆机器学习?这篇基于TensorFlow的实例教程为你解惑!

「机器人圈导览」:生成对抗网络无疑是机器学习领域近三年来最火爆的研究领域,相关论文层出不求,各种领域的应用层出不穷。那么,GAN到底如何实践?本文编译自Medium,该文作者以一朵玫瑰花为例,详细阐...

高丽大学等机构联合发布StarGAN:可自定义表情和面部特征

原文来源:arXiv、GitHub作者:YunjeyChoi、MinjeChoi、MunyoungKim、Jung-WooHa、SungKim、JaegulChoo「雷克世界」编译:嗯~...

TensorFlow和PyTorch相继发布最新版,有何变化

原文来源:GitHub「机器人圈」编译:嗯~阿童木呀、多啦A亮Tensorflow主要特征和改进在Tensorflow库中添加封装评估量。所添加的评估量列表如下:1.深度神经网络分类器(DNNCl...

「2022 年」崔庆才 Python3 爬虫教程 - 深度学习识别滑动验证码缺口

上一节我们使用OpenCV识别了图形验证码躯壳欧。这时候就有朋友可能会说了,现在深度学习不是对图像识别很准吗?那深度学习可以用在识别滑动验证码缺口位置吗?当然也是可以的,本节我们就来了解下使用深度...

20K star!搞定 LLM 微调的开源利器

LLM(大语言模型)微调一直都是老大难问题,不仅因为微调需要大量的计算资源,而且微调的方法也很多,要去尝试每种方法的效果,需要安装大量的第三方库和依赖,甚至要接入一些框架,可能在还没开始微调就已经因为...

大模型DeepSeek本地部署后如何进行自定义调整?

1.理解模型架构a)查看深度求索官方文档或提供的源代码文件,了解模型的结构、输入输出格式以及支持的功能。模型是否为预训练权重?如果是,可以在预训练的基础上进行微调(Fine-tuning)。是否需要...

因配置不当,约5000个AI模型与数据集在公网暴露

除了可访问机器学习模型外,暴露的数据还可能包括训练数据集、超参数,甚至是用于构建模型的原始数据。前情回顾·人工智能安全动态向ChatGPT植入恶意“长期记忆”,持续窃取用户输入数据多模态大语言模型的致...

基于pytorch的深度学习人员重识别

基于pytorch的深度学习人员重识别Torchreid是一个库。基于pytorch的深度学习人员重识别。特点:支持多GPU训练支持图像的人员重识别与视频的人员重识别端到端的训练与评估简单的re...

DeepSeek本地部署:轻松训练你的AI模型

引言:为什么选择本地部署?在AI技术飞速发展的今天,越来越多的企业和个人希望将AI技术应用于实际场景中。然而,对于一些对数据隐私和计算资源有特殊需求的用户来说,云端部署可能并不是最佳选择。此时,本地部...

谷歌今天又开源了,这次是Sketch-RNN

前不久,谷歌公布了一项最新技术,可以教机器画画。今天,谷歌开源了代码。在我们研究其代码之前,首先先按要求设置Magenta环境。(https://github.com/tensorflow/magen...

Tensorflow 使用预训练模型训练的完整流程

前面已经介绍了深度学习框架Tensorflow的图像的标注和训练数据的准备工作,本文介绍一下使用预训练模型完成训练并导出训练的模型。1.选择预训练模型1.1下载预训练模型首先需要在Tensorf...

30天大模型调优学习计划(30分钟训练大模型)

30天大模型调优学习计划,结合Unsloth和Lora进行大模型微调,掌握大模型基础知识和调优方法,熟练应用。第1周:基础入门目标:了解大模型基础并熟悉Unsloth等工具的基本使用。Day1:大模...

python爬取喜马拉雅音频,json参数解析

一.抓包分析json,获取加密方式1.抓包获取音频界面f12打开抓包工具,播放一个(非vip)视频,点击“媒体”单击打开可以复制URL,发现就是我们要的音频。复制“CKwRIJEEXn-cABa0Tg...

五、JSONPath使用(Python)(json数据python)

1.安装方法pipinstalljsonpath2.jsonpath与Xpath下面表格是jsonpath语法与Xpath的完整概述和比较。Xpathjsonpath概述/$根节点.@当前节点...

Python网络爬虫的时候json=就是让你少写个json.dumps()

大家好,我是皮皮。一、前言前几天在Python白银交流群【空翼】问了一个Python网络爬虫的问题,提问截图如下:登录请求地址是这个:二、实现过程这里【甯同学】给了一个提示,如下所示:估计很多小伙伴和...