玩转Matplotlib的10个高级技巧

news2024/11/9 9:51:12

Matplotlib是Python中流行的数据可视化库,仅使用简单的几行代码就可以生成图表。但是默认的方法是生成的图表很简单,如果想增强数据演示的影响和清晰度,可以试试本文总结的10个高级技巧,这些技巧可以将可视化提升到一个新的水平:

1、rcParams

rcParams字典。它包含了用于创建图形的默认样式的所有Matplotlib设置。你可以直接从matplotlib命名空间导入它:

 from matplotlib import rcParams
 >>> rcParams
 ...
 'axes.grid': False,
 'axes.grid.axis': 'both',
 'axes.grid.which': 'major',
 'axes.labelcolor': 'black',
 'axes.labelpad': 4.0,
 'axes.labelsize': 'medium',
 'axes.labelweight': 'normal',
 'axes.linewidth': 0.8,
 ...
 
 rcParams['figure.figsize'] = 8, 6
 rcParams['legend.fontsize'] = "large"
 rcParams['xtick.major.size'] = 4
 rcParams['xtick.minor.size'] = 1

这时所有的Matplotlib设置,如果你想修改任何的Matplotlib参数,直接修改这个字典就可以了,你甚至可以将他序列化到本地,然后在其他项目中直接加载,这样你的每一个Matplotlib实例使用的都是相同的配置了。

还可以调用PyPlot的rcdefaults函数,它会将所有参数重置成默认值。

 plt.rcdefaults()

2、get_* functions

在底层,Matplotlib是完全面向对象的。

上图中看到的每个单独的组件都是作为一个单独的类实现的。它们都继承自基类Matplotlib Artist。

但是类太多,并且每个类的参数都不一样这会给使用带来很大的不方便,所以Matplotlib定制了有许多以get_前缀开头的函数,可以直接创建图形中的组件。下面是一个例子:

 fig, ax = plt.subplots()
 
 >>> [func for func in dir(ax) if func.startswith("get")]
 
 ['get_adjustable',
  'get_label',
  'get_legend',
  'get_legend_handles_labels',
  'get_lines',
  'get_navigate',
  'get_title',
  'get_transform',
  'get_xmajorticklabels',
  'get_xminorticklabels',
  'get_xscale',
  'get_xticklabels',
  'get_zorder']

假设我们想自定义一个图形的坐标:

 x = np.linspace(0, 2, 100)
 
 fig, ax = plt.subplots()  # Create a figure and an axes.
 
 l1 = ax.plot(x, x, label="linear")
 l2 = ax.plot(x, x ** 2, label="quadratic")
 l3 = ax.plot(x, x ** 3, label="cubic")
 
 ax.set_title("Simple Plot")
 
 plt.show()

这很简单,只需在axes对象上调用get_xticklabels,就可以得到Matplotlib Text实例的列表:

 >>> ax.get_xticklabels()
 
 [Text(0, 0, 'Ideal'),
  Text(1, 0, 'Premium'),
  Text(2, 0, 'Very Good'),
  Text(3, 0, 'Good'),
  Text(4, 0, 'Fair')]

还可以使用get_xticklines调整刻度线,或者使用get_xticks调整刻度的位置。

已经获得了对象,下面就可以进行调整了

3、get / setp

调用plt.getp函数,可以查看它当前具有的参数。例如,假设我们想要样式化下面图的l2:

 x = np.linspace(0, 2, 100)
 
 fig, ax = plt.subplots()  # Create a figure and an axes.
 
 l1 = ax.plot(x, x, label="linear")
 l2 = ax.plot(x, x ** 2, label="quadratic")
 l3 = ax.plot(x, x ** 3, label="cubic")
 
 ax.set_title("Simple Plot")
 
 plt.show()

这个方法返回了图表的所有属性

 >>> plt.getp(l2)
     ...
     drawstyle or ds = default
     figure = Figure(640x480)
     linestyle or ls = -
     linewidth or lw = 1.5
     marker = None
     markeredgecolor or mec = #ff7f0e
     markeredgewidth or mew = 1.0
     markerfacecolor or mfc = #ff7f0e
     markerfacecoloralt or mfcalt = none
     zorder = 2
     ...

而plt.setp可以更改属性在没有任何参数的对象上调用this会打印出该对象可以接受的属性值:

 >>> plt.setp(l2)
   ...
   linestyle or ls: {'-', '--', '-.', ':', '', (offset, on-off-seq), ...}
   linewidth or lw: float
   sketch_params: (scale: float, length: float, randomness: float)
   snap: bool or None
   zorder: float
   ...

要打印单个属性的可能值,可以将属性的名称作为字符串输入setp:

 >>> plt.setp(l2, "linestyle")
 linestyle: {'-', '--', '-.', ':', '', (offset, on-off-seq), ...}

修改属性的方法如下:

 >>> plt.setp(l2, linestyle="-.", lw=5, color="red", alpha=0.5)
 [None, None, None, None]

要查看更改后的当前图形,只需在图形对象上调用get_figure:

 fig.get_figure()

第二行的样式已经变了

4、Legends

Legends可以方便的告诉我们图中每个组件的含义,默认是这样显示的:

 x = np.linspace(0, 2, 100)
 
 fig, ax = plt.subplots()  # Create a figure and an axes.
 
 l1 = ax.plot(x, x, label="linear")
 l2 = ax.plot(x, x ** 2, label="quadratic")
 l3 = ax.plot(x, x ** 3, label="cubic")
 
 ax.set_title("Simple Plot")
 
 ax.legend()
 
 plt.show()

我们可以调整他的参数,例如:

图例的位置、字体属性、大小,颜色,样式、图例中的列数,等等

可以在创建前设置,也可以在创建后使用get_legend提取,并使用getp、setp函数。

5、cycler

你有没有想过Matplotlib是如何自己改变颜色或循环不同风格的?

在底层,Matplotlib使用名为Cyclers的Python内置对象:

 from cycler import cycler
 
 c1 = cycler(arg1=[1, 2, 3, 4])
 >>> c1

这个循环函数接受任何键值参数并创建一个字典列表:

 c2 = cycler(arg2=list("rgba"))
 
 for i in c2:
     print(i)
 
 ------------------------------
 
 {'arg2': 'r'}
 {'arg2': 'g'}
 {'arg2': 'b'}
 {'arg2': 'a'}

还可以将多个循环器与“plus”和“multiply”操作符组合起来,这样可以获得索引到索引或穷举的参数组合:

 for i in c1 + c2:
     print(i)
 
 --------------------------------
 
 {'arg1': 1, 'arg2': 'r'}
 {'arg1': 2, 'arg2': 'g'}
 {'arg1': 3, 'arg2': 'b'}
 {'arg1': 4, 'arg2': 'a'}

将这个自定义循环器并将其传递给Matplotlib,就可以定制样式。下面,我们创建四种不同的线条样式,允许Matplotlib循环使用不同的线条颜色,样式和大小:

 line_prop_cycler = (
     cycler(color=list("rgcy"))
     + cycler(ls=["-", "--", "-.", ":"])
     + cycler(lw=[3, 6, 9, 12])
 )

可以使用axes对象的set_prop_cycle函数将这个自定义循环器传递给绘图:

 x = np.linspace(0, 2 * np.pi, 50)
 offsets = np.linspace(0, 2 * np.pi, 4, endpoint=False)
 yy = np.transpose([np.sin(x + phi) for phi in offsets])
 
 fig, ax = plt.subplots(figsize=(8, 4))
 
 ax.set_prop_cycle(line_prop_cycler)  # Set propcycle before plotting
 ax.plot(x, yy)
 
 plt.show();

rcParams字典中默认设置如下:

 rcParams["axes.prop_cycle"]

我们可以直接修改

6、tick_params

轴刻度应该准确地传达数据点及其单位的最小值和最大值,并显示几个关键的检查点,以便在不同的绘图部分之间进行比较。

大多数tick属性可以使用axes对象的tick_params函数来控制。以下是文档中的例子:

 >>> ax.tick_params()
 
 Parameters
 ----------
 axis : {'x', 'y', 'both'}, default: 'both'
     The axis to which the parameters are applied.
 which : {'major', 'minor', 'both'}, default: 'major'
     The group of ticks to which the parameters are applied.
 reset : bool, default: False
     Whether to reset the ticks to defaults before updating them.
 
 Other Parameters
 ----------------
 direction : {'in', 'out', 'inout'}
     Puts ticks inside the axes, outside the axes, or both.
 length : float
     Tick length in points.
 width : float
     Tick width in points.
 color : color
     Tick color.

首先应该指定的两个参数是axis和which。这些参数将应用于X或Y轴刻度,以及最小和最大刻度。

大多数时候,在Matplotlib中不会看到小刻度。如果需要可以使用axes对象上的minortics_on函数:

 fig, ax = plt.subplots(figsize=(3, 2))
 
 >>> ax.minorticks_on()

7、Tickers

如果不像自定义tick参数(因为很麻烦)。可以使用许多内置的Matplotlib的“主题”集合(称为tickers)。

 from matplotlib import ticker
 dir(ticker)
 ['AutoLocator',
  'AutoMinorLocator',
  'EngFormatter',
  'FixedFormatter',
  'FixedLocator',
  'FormatStrFormatter',
  'Formatter',
  'FuncFormatter',
  'IndexFormatter',
  'IndexLocator',
  'Integral',
  'LinearLocator',
 ]

在ticker模块下有许多这样的子模块。一般情况下标题中带有Locator的控件控制刻度的位置。而Formatters 则表示标签的样式。选择好后可以使用下面的方式进行设置:

 from matplotlib.ticker import EngFormatter
 
 ax.xaxis.set_major_formatter(EngFormatter())

使用axes对象的xaxis或yaxis属性,调用set_major(minor)_formatter(locator)函数,并传入类名。

8、grid

自定义网格线可以突出数据范围。在Matplotlib中,可以使用轴线对象的网格函数创建和自定义网格。下面是一个垂直网格的例子:

 fig, ax = plt.subplots()
 
 ax.grid(axis="x", linestyle=":", lw=3, color="r")

9、bar_label

条形图在数据分析中很常见。它们最重要的地方就是每个条的高度,条形标签可以突出每个条的显示。

bar_label函数接受一个BarContainer对象作为参数,并自动标注每个bar的高度。

下面是Seaborn的一个简单的计数图:

 import seaborn as sns
 
 diamonds = sns.load_dataset("diamonds")
 
 ax = sns.countplot(diamonds["cut"])

每次使用Seaborn或ax.bar等函数创建barplot时,BarContainer对象都会被添加到图中。可以使用axes对象的containers属性来检索这个容器对象:

 ax.containers
 [<BarContainer object of 5 artists>]

在上面的列表中有一个BarContainer对象有5个bar。我们只需在创建了plot之后将这个对象传递给bar_label:

 ax = sns.countplot(diamonds["cut"])
 ax.bar_label(ax.containers[0], padding=1)
 ax.set_ylim(0, 25000)
 plt.show();

10、zorder

当有很多图的时候,显示顺序是非常重要的。你需要确保在画布上以适当的顺序绘制每个图形,就需要zorder参数。

下面,我们用不同的zorders创建了三行:

 x = np.linspace(0, 7.5, 100)
 
 plt.plot(x, np.sin(x), label="zorder=2", zorder=2)  # bottom
 plt.plot(x, np.sin(x + 0.5), label="zorder=3", zorder=3)
 plt.axhline(0, label="zorder=2.5", color="lightgrey", zorder=2.5)
 
 plt.title("Custom order of elements")
 
 l = plt.legend(loc="upper right")
 l.set_zorder(2.5)  # legend between blue and orange line
 
 plt.show()

可以看到zorder越大,就会在最上方显示,覆盖掉小的组件。

总结

Matplotlib在2023年6月的下载量超过3000万,几乎是其最大竞争对手Plotly的4倍。Matplotlib的成功不仅仅在于它的简单(只需要几行代码就能生成简单的图形),还在于他的功能强大,但是要使用这些强大的功能就需要使用他的高级功能,但是这些高级功能往往需要比较复杂的配置或者参数,需要我们浏览官方的文档。所以才出现了seaborn,他将Matplotlib进行了整合不仅简单而且好看。

但是有时我们需要更深入的定制功能,seaborn也许还达不到我们的目标,我们只能自己定义的参数,本文总结的是个高级技巧可以轻松的帮你完整自定义Matplotlib的任务。

https://avoid.overfit.cn/post/fece2cde8dbd4f899de00f5509385c6c

作者:Bex T

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hyperledger Fabric网络快速启动

目录 1、网络服务配置 2、关联的docker-compose-base.yaml 各Peer节点容器设置如下信息。 3、被关联的Peer-base.yaml 4、启动网络 2、完成通道的创建 2.1将节点加入应用通道 更新锚节点 2.为什么要创建节点并将其加入应用通道中&#xff1f; 1、网络服务配置 由于要启动…

人工智能(pytorch)搭建模型16-基于LSTM+CNN模型的高血压预测的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型16-基于LSTMCNN模型的高血压预测的应用&#xff0c;LSTMCNN模型搭建与训练&#xff0c;本项目将利用pytorch搭建LSTMCNN模型&#xff0c;涉及项目&#xff1a;高血压预测&#xff0c;高血…

鼠标点击切换图片(使用js中的src属性)

使用到的知识点&#xff1a; 模板字符串 js中的src属性 img.src ./images/${i}.jpg 效果展示&#xff1a; 具体代码实现&#xff1a; <body><div class"box" style"width:500px;height:300px;margin:100px auto;"><img src&quo…

Python中获取指定目录下所有文件名的方法

在《Python中文件名和路径的操作》中提到&#xff0c;os模块中的函数可以对文件进行操作。通过递归以及os模块中提供的函数&#xff0c;可以获取指定目录下所有的文件名。 1 基本流程 通过递归获取指定目录下所有文件名的基本流程&#xff0c;如图1所示。 图1 基本流程 2 函…

Web开播系统的技术演进

随着直播SaaS业务的深入发展&#xff0c;Web端开播的诉求变得越来越强烈&#xff0c;对比客户端开播工具如OBS&#xff0c;Web开播与SaaS平台亲和度高&#xff0c;可以让用户快速体验平台全流程&#xff0c;同时易于分享链接&#xff0c;快速连麦。因此&#xff0c;寻求更加稳定…

#10046. 「一本通 2.2 练习 2」OKR-Periods of Words(内附封面)

[POI2006] OKR-Periods of Words 题面翻译 对于一个仅含小写字母的字符串 a a a&#xff0c; p p p 为 a a a 的前缀且 p ≠ a p\ne a pa&#xff0c;那么我们称 p p p 为 a a a 的 proper 前缀。 规定字符串 Q Q Q&#xff08;可以是空串&#xff09;表示 a a a 的…

CMake 变量

目录 cmake普通变量 如何取消变量 cmake环境变量 cmake缓存变量 普通变量使用: 缓存变量使用: cmake变量的作用域 block() block demo: function 函数作用域简单 demo 高级变量 总结: 和其他语言一样,cmake完全可以看做是一种编程语言,他有变量,有函数等. cmake普通…

解决uview-plus组件样式修改不生效

一、问题描述 使用 ::v-deep 、/deep/ 等各种 deep 写法后&#xff0c;修改 uview-plus组件样式依旧不生效 二、解决方案 在子组件中写页面布局&#xff0c;在父组件中写CSS样式 目录结构&#xff1a; 父组件中&#xff1a;引入子组件&#xff0c;使用::v-deep修改样式 子组件…

git配置密钥及提交代码到仓库

原文合集地址如下&#xff0c;有需要的朋友可以关注 本文地址 合集地址 一、git下载及安装 Git官网&#xff1a;www.git-scm.com/ 下载安装包进行安装。 点击downloads下载自己需要的安装包。本文基于windows系统。 下载安装包后双击exe文件&#xff0c;如何一系列next操作…

提升文件管理效率:轻松批量归类文件,按名称细分管理

现代生活中&#xff0c;我们每天都面对着大量的电子文件&#xff0c;如文档、照片、音乐和视频等。这么多文件堆积在一起&#xff0c;怎样快速找到需要的文件成了一个挑战。现在有应该方法可以帮助您提升文件管理效率&#xff0c;方法如下&#xff1a; 首先&#xff0c;第一步…

AutoSAR系列讲解(入门篇)4.6-BSW的Watchdog功能

一、架构与术语解释 前面都挺难的吧&#xff1f;实践出真知&#xff0c;后面实践篇的时候&#xff0c;大家应该就能明白了。这一节就来讲个简单的功能------看门狗。看门狗想必大家应该都再熟悉不过了吧&#xff0c;主要就下面三层结构&#xff0c;简单明了&#xff0c;这节确实…

从入门到精通:解锁Linux开发工具和编译器的力量

目录 一.编辑器vim的使用1.vim的基本概念2.vim的使用二.编译器gcc/g1.编译器的使用2.编译器是如何完成的&#xff1f;3.动态库与静态库 一.编辑器vim的使用 1.vim的基本概念 vim是一个方便编程的功能特别丰富的文本编辑器&#xff0c;凭借他简洁的三种模式以及丰富的快捷键操…

Arduino IDE的安装

https://www.arduino.cc/en/software/

AI 绘画 - 建筑绘图辅助设计之 Controlnet

前情提要 2023-06-17 周六 杭州 阴 小记: 早上还是可以听到淅淅沥沥的雨声&#xff0c;或许梅雨季快要来了&#xff0c;潮湿的感觉说不上多讨厌&#xff0c;可是也没有那么喜欢&#xff1b;最近在追动画《飞出个未来》&#xff0c;我是把这个动画当作哲学课来看的&#xff0c…

linux模块的变量与函数导出与引用

在Linux内核中&#xff0c;不同模块之间可以通过导出和引用函数或变量的方式来进行交互。具体而言&#xff0c;Linux内核提供了一些导出和引用符号的机制&#xff0c;这些机制可以使得不同模块之间能够访问并使用彼此的函数或变量。 导出符号的方式一般有两种&#xff1a; 使…

【动态规划算法练习】day12

文章目录 一、978. 最长湍流子数组1.题目简介2.解题思路3.代码4.运行结果 二、413. 等差数列划分1.题目简介2.解题思路3.代码4.运行结果 三、1567. 乘积为正数的最长子数组长度1.题目简介2.解题思路3.代码4.运行结果 总结 一、978. 最长湍流子数组 1.题目简介 978. 最长湍流子…

python输出颜色(终端控制台)

python输出颜色&#xff08;终端控制台&#xff09; 1、终端ANSI2、Python自带的函数库ctypes3、colorama 1、终端ANSI 更多查看 ECHOX.bat输出文本背景和文字颜色 其中特殊字符print("Black :[30m f0 [0m Black :[40m b0 [0m")即是print("Black :\033[30m f0 …

3.设计模式之后七种模式桥接装饰者组合外观享元代理模板

1.桥接模式 bridge(抽象类的实现的子类,通过聚合间接调用接口方法 就是桥) 实现和抽象分开,使他可以独立改变结构型设计模式基于类的最小设计原则(增加功能,增加最少个数的类),通过封装 聚合和继承让不同类实现不同职责 图 23桥接模式原理图 图 26桥接模式传统解决手机操作问题…

(六)Spring源码解析:Spring AOP源码解析

〇、AOP概念 Aspect&#xff1a;切面 给业务方法增加到功能&#xff0c;切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面是通知&#xff08;Advice&#xff09;。实际就是对主业务逻辑的一种增强。 Pointcut&#xff1a;切入点 切入点指声明的…