matplotlib绘图基础--笔记

2024-08-31 06:18

本文主要是介绍matplotlib绘图基础--笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

matplotlib 是python可视化著名的2D绘图库,类似于matlab的绘图工具。在其官网中也提供了非常多的例子,照猫画虎基本能完成所需的作图。本文主要介绍下matplotlib作图的一些基础知识。

利用matplotlib库作图,在程序中先要引入pyplot作图模块:

import matplotlib.pyplot as plt

结合例子作介绍:
例子1.

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as pltx = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)
# use attribute figure to create a figure object
plt.figure(figsize=(8,4))
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()
plt.savefig('fig1.png')
plt.show()

这里写图片描述
这里plt.figure(figsize=(8, 4)) 创建了一个绘图对象,图片尺寸长8英寸,宽4英寸,dpi可以指定每英寸多少像素,默认80.
plot函数的调用,将x,y数组传递给plot,用关键字参数指定曲线的各种属性
绘图对象的其他属性(坐标轴等)的设置:
- xlabel:设置x轴的标注
- ylabel:设置y轴的标注
- title: 设置图表的标题
- xlim,ylim:设置x,y轴的坐标范围
- legend:显示曲线标注
最后用plt.savefig(name)plt.show() 保存、显示创建的所有绘图对象。


1. 配置属性

matplotlib所绘制的每个组成部分都有对应一个对象,我们可以通过调用这些对象的属性设置方法set_* 或者pyplot的属性设置函数setp设置其属性值。例如plot函数返回一个matplotlib.lines.Line2D对象的列表,下面的例子显示如何设置Line2D对象的属性:

In [1]: import numpy as npIn [2]: import matplotlib.pyplot as pltIn [3]: x = np.arange(0, 5, 0.1)In [4]: line, = plt.plot(x, x*x)In [5]: line
Out[5]: <matplotlib.lines.Line2D at 0x7fce780c74e0>In [6]: lines = plt.plot(x, x*x)In [7]: lines
Out[7]: [<matplotlib.lines.Line2D at 0x7fce780e2588>]

plot函数返回的是一个列表,lines说明了这一点;通过line, = plt.plot(x, x*x) 获取的是这个列表中的第一个元素。

In [8]: line.set_antialiased(False)In [9]: lines = plt.plot(x, np.sin(x),  x, np.cos(x))In [10]: lines
Out[10]: 
[<matplotlib.lines.Line2D at 0x7fce7808b518>,<matplotlib.lines.Line2D at 0x7fce7808bd30>]In [11]: plt.setp(lines, color='r', lw=2)

调用Line2D对象line的set_antialiased方法,关闭对象的反锯齿效果。或者通过调用plt.setp函数配置多个Line2D对象的颜色和先款属性。同样可以通过调用Line2D对象的get_*, 或者plt.getp函数获取对象的属性。
matplotlib的整个图表为一个Figure对象,此对象在调用plt.figure函数时返回,也可以通过plt.gcf函数获取当前的绘图对象。

f =plt.gcf()

2. 绘制多轴图

一个绘图对象(figure)可以包含多个轴(axis),在matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的例子1中,绘图对象只包含一个轴,因此只显示了一个轴(子图)。我们可以用subplot函数快速绘制多个轴的图表。

subplot(numRows, numCols, plotNum)

subplot将整个绘图区域等分为numRows行 * numCols列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。如果numRows,numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。

for idx, color in enumerate("rgbyck"):plt.subplot(320+idx+1, facecolor=color)
plt.show()

这里写图片描述

如果希望某个轴占据整个行或者列的话,可以如下调用:

plt.subplot(221) # 分成2*2,画在第一
plt.subplot(222) # 分成2*2,画在第二
plt.subplot(212) # 分成2*1,画在第二
plt.show()

这里写图片描述

当绘图对象中有多个轴的时候,可以调用subplots_adjust 函数,它有left, right, bottom, top, wspace, hspace等几个关键字参数,值都是0,1之间的小数,它们是以绘图区域的宽高为1进行正规化之后的坐标或者长度:

f = plt.gcf()
f.subplots_adjust(hspace=0.3, wspace=0.5)
plt.show()

这里写图片描述


3. Artist 对象

matplotlib API包含三层:
- backend_bases.FigureCanvas: 图表的绘制领域
- backend_bases.Renderer: 知道如何在FigureCanvas上绘图
- artist.Artist: 知道如何使用Renderer在FigureCanvas上绘图

FigureCanvas和Renderer需要处理底层的绘图操作,例如使用wxPython在界面上绘图,或者使用PostScript绘制PDF。Artist则处理所有的高层结构,例如处理图表、文字和曲线等的绘制和布局。通常我们只和Artist打交道,而不需要关心底层的绘制细节。

Artists分为简单类型和容器类型两种。简单类型的Artists为标准的绘图元件,例如Line2D、 Rectangle、 Text、AxesImage 等等。而容器类型则可以包含许多简单类型的Artists,使它们组织成一个整体,例如Axis、 Axes、Figure等。

直接使用Artists创建图表的标准流程:
- 创建Figure对象
- 用Figure对象创建一个或多个Axes或Subplot对象
- 调用Axes等对象的方法创建各种简单类型的Artists

下面首先调用pyplot.figure辅助函数创建Figure对象,然后调用Figure对象的add_axes方法在其中创建一个Axes对象,add_axes的参数是一个形如[left, bottom, width, height]的列表,这些数值分别指定所创建的Axes对象相对于fig的位置和大小,取值范围都在0到1之间:

fig = plt.figure()
ax = fig.add_axes([0.15, 0.1, 0.7, 0.3])

然后我们调用ax的plot方法绘图,创建一条曲线,并且返回此曲线对象(Line2D)。

In [32]: line, = ax.plot([1,2,3],[1,2,1])In [33]: ax.lines
Out[33]: [<matplotlib.lines.Line2D at 0x7fce6e145470>]In [34]: line
Out[34]: <matplotlib.lines.Line2D at 0x7fce6e145470>

ax.lines是一个为包含ax的所有曲线的列表,后续的ax.plot调用会往此列表中添加新的曲线。如果想删除某条曲线的话,直接从此列表中删除即可。

Axes对象还包括许多其它的Artists对象,例如我们可以通过调用set_xlabel设置其X轴上的标题:

ax.set_xlabel("time")

4. Artist的属性

图表中的每个元素都用一个matplotlib的Artist对象表示,而每个Artist对象都有一大堆属性控制其显示效果。例如Figure对象和Axes对象都有patch属性作为其背景,它的值是一个Rectangle对象。通过设置此它的一些属性可以修改Figrue图表的背景颜色或者透明度等属性,下面的例子将图表的背景颜色设置为绿色:

fig = plt.figure()
fig.show()
fig.patch.set_color("g")
fig.canvas.draw()

patch的color属性通过set_color函数进行设置,属性修改之后并不会立即反映到图表的显示上,还需要调用fig.canvas.draw()函数才能够更新显示。

下面是Artist对象都具有的一些属性:
- alpha : 透明度,值在0到1之间,0为完全透明,1为完全不透明
- animated: 布尔值,在绘制动画效果时使用
- axes: 此Artist对象所在的Axes对象,可能为None
- clip_box: 对象的裁剪框
- clip_on: 是否裁剪
- clip_path: 裁剪的路径
- contains: 判断指定点是否在对象上的函数
- figure: 所在的Figure对象,可能为None
- label: 文本标签
- picker: 制Artist对象选取
- transform: 控制偏移旋转
- visible: 是否可见
- zorder: 控制绘图顺序

Artist对象的所有属性都通过相应的 get_* set_* 函数进行读写。
如果你想用一条语句设置多个属性的话,可以使用set函数:

fig.set(alpha=0.5, zorder=2)

5. Figure容器

现在我们知道如何观察和修改已知的某个Artist对象的属性,接下来要解决如何找到指定的Artist对象。前面我们介绍过Artist对象有容器类型和简单类型两种,这一节让我们来详细看看容器类型的内容。

最大的Artist容器是matplotlib.figure.Figure,它包括组成图表的所有元素。图表的背景是一个Rectangle对象,用Figure.patch属性表示。当你通过调用add_subplot或者add_axes方法往图表中添加轴(子图时),这些子图都将添加到Figure.axes属性中,同时这两个方法也返回添加进axes属性的对象,注意返回值的类型有所不同,实际上AxesSubplot是Axes的子类。

In [38]: fig = plt.figure()...: ax1 = fig.add_subplot(211)...: ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3])...: In [39]: ax1
Out[39]: <matplotlib.axes._subplots.AxesSubplot at 0x7fce6dee7358>In [40]: ax2
Out[40]: <matplotlib.axes._axes.Axes at 0x7fce6e94f828>

不建议直接对Figure.axes属性进行列表操作,而应该使用add_subplot, add_axes, delaxes等方法进行添加和删除操作。

Figure对象有如下属性包含其它的Artist对象:

  • axes : Axes对象列表
  • patch : 作为背景的Rectangle对象
  • images : FigureImage对象列表,用来显示图片
  • legends : Legend对象列表
  • lines : Line2D对象列表
  • patches : patch对象列表
  • texts : Text对象列表,用来显示文字

6. Axes容器

Axes容器是整个matplotlib库的核心,它包含了组成图表的众多Artist对象,并且有许多方法函数帮助我们创建、修改这些对象。和Figure一样,它有一个patch属性作为背景,当它是笛卡尔坐标时,patch属性是一个Rectangle对象,而当它是极坐标时,patch属性则是Circle对象。例如下面的语句设置Axes对象的背景颜色为绿色:

fig = plt.figure()
ax = fig.add_subplot(111)
ax.patch.set_facecolor("green")

当你调用Axes的绘图方法(例如plot),它将创建一组Line2D对象,并将所有的关键字参数传递给这些Line2D对象,并将它们添加进Axes.lines属性中,最后返回所创建的Line2D对象列表:

>>> x, y = np.random.rand(2, 100)
>>> line, = ax.plot(x, y, "-", color="blue", linewidth=2)
>>> line
<matplotlib.lines.Line2D object at 0x03007030>
>>> ax.lines
[<matplotlib.lines.Line2D object at 0x03007030>]

注意plot返回的是一个Line2D对象的列表,因为我们可以传递多组X,Y轴的数据,一次绘制多条曲线。

与plot方法类似,绘制直方图的方法bar和绘制柱状统计图的方法hist将创建一个Patch对象的列表,每个元素实际上都是Patch的子类Rectangle,并且将所创建的Patch对象都添加进Axes.patches属性中

下面详细列出Axes包含各种Artist对象的属性:

  • artists : Artist对象列表
  • patch : 作为Axes背景的Patch对象,可以是Rectangle或者Circle
  • collections : Collection对象列表
  • images : AxesImage对象列表
  • legends : Legend对象列表
  • lines : Line2D对象列表
  • patches : Patch对象列表
  • texts : Text对象列表
  • xaxis : XAxis对象
  • yaxis : YAxis对象

下面列出Axes的创建Artist对象的方法:

Axes的方法所创建的对象添加进的列表
annotateAnnotatetexts
barsRectanglepatches
errorbarLine2D, Rectanglelines,patches
fillPolygonpatches
histRectanglepatches
imshowAxesImageimages
legendLegendlegends
plotLine2Dlines
scatterPolygonCollectionCollections
textTexttexts

下面以绘制散列图(scatter)为例,验证一下:

>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> t = ax.scatter(np.random.rand(20), np.random.rand(20))
>>> t # 返回值为CircleCollection对象
<matplotlib.collections.CircleCollection object at 0x06004230>
>>> ax.collections # 返回的对象已经添加进了collections列表中
[<matplotlib.collections.CircleCollection object at 0x06004230>]
>>> fig.show()
>>> t.get_sizes() # 获得Collection的点数
20

这里写图片描述


7. Axis容器

Axis容器包括坐标轴上的刻度线、刻度文本、坐标网格以及坐标轴标题等内容。刻度包括主刻度和副刻度,分别通过Axis.get_major_ticks和Axis.get_minor_ticks方法获得。每个刻度线都是一个XTick或者YTick对象,它包括实际的刻度线和刻度文本。为了方便访问刻度线和文本,Axis对象提供了get_ticklabels和get_ticklines方法分别直接获得刻度线和刻度文本。

原始网站:
matplotlib-绘制精美图表

这篇关于matplotlib绘图基础--笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123118

相关文章

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个