第一回:Matplotlib初相识

2023-11-19

第一回:Matplotlib初相识

一、认识matplotlib

Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态,动态,交互式的图表。

Matplotlib可用于Python脚本,Python和IPython Shell、Jupyter notebook,Web应用程序服务器和各种图形用户界面工具包等。

Matplotlib是Python数据可视化库中的泰斗,它已经成为python中公认的数据可视化工具,我们所熟知的pandas和seaborn的绘图接口其实也是基于matplotlib所作的高级封装。

为了对matplotlib有更好的理解,让我们从一些最基本的概念开始认识它,再逐渐过渡到一些高级技巧中。

二、一个最简单的绘图例子

Matplotlib的图像是画在figure(如windows,jupyter窗体)上的,每一个figure又包含了一个或多个axes(一个可以指定坐标系的子区域)。最简单的创建figure以及axes的方式是通过pyplot.subplots命令,创建axes以后,可以使用Axes.plot绘制最简易的折线图。

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
fig, ax = plt.subplots()  # 创建一个包含一个axes的figure
ax.plot([1, 2, 3, 4], [1, 4, 2, 3]);  # 绘制图像

Trick
在jupyter notebook中使用matplotlib时会发现,代码运行后自动打印出类似<matplotlib.lines.Line2D at 0x23155916dc0>这样一段话,这是因为matplotlib的绘图代码默认打印出最后一个对象。如果不想显示这句话,有以下三种方法,在本章节的代码示例中你能找到这三种方法的使用。

  1. 在代码块最后加一个分号;
  2. 在代码块最后加一句plt.show()
  3. 在绘图时将绘图对象显式赋值给一个变量,如将plt.plot([1, 2, 3, 4]) 改成line =plt.plot([1, 2, 3, 4])

和MATLAB命令类似,你还可以通过一种更简单的方式绘制图像,matplotlib.pyplot方法能够直接在当前axes上绘制图像,如果用户未指定axes,matplotlib会帮你自动创建一个。所以上面的例子也可以简化为以下这一行代码。

line =plt.plot([1, 2, 3, 4], [1, 4, 2, 3]) 

三、Figure的组成

现在我们来深入看一下figure的组成。通过一张figure解剖图,我们可以看到一个完整的matplotlib图像通常会包括以下四个层级,这些层级也被称为容器(container),下一节会详细介绍。在matplotlib的世界中,我们将通过各种命令方法来操纵图像中的每一个部分,从而达到数据可视化的最终效果,一副完整的图像实际上是各类子元素的集合。

  • Figure:顶层级,用来容纳所有绘图元素

  • Axes:matplotlib宇宙的核心,容纳了大量元素用来构造一幅幅子图,一个figure可以由一个或多个子图组成

  • Axis:axes的下属层级,用于处理所有和坐标轴,网格有关的元素

  • Tick:axis的下属层级,用来处理所有和刻度有关的元素

四、两种绘图接口

matplotlib提供了两种最常用的绘图接口

  1. 显式创建figure和axes,在上面调用绘图方法,也被称为OO模式(object-oriented style)

  2. 依赖pyplot自动创建figure和axes,并绘图

使用第一种绘图接口,是这样的:

x = np.linspace(0, 2, 100)

fig, ax = plt.subplots()  
ax.plot(x, x, label='linear')  
ax.plot(x, x**2, label='quadratic')  
ax.plot(x, x**3, label='cubic')  
ax.set_xlabel('x label') 
ax.set_ylabel('y label') 
ax.set_title("Simple Plot")  
ax.legend() 
plt.show()

而如果采用第二种绘图接口,绘制同样的图,代码是这样的:

x = np.linspace(0, 2, 100)

plt.plot(x, x, label='linear') 
plt.plot(x, x**2, label='quadratic')  
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
plt.show()

五、通用绘图模板

由于matplotlib的知识点非常繁杂,在实际使用过程中也不可能将全部API都记住,很多时候都是边用边查。因此这里提供一个通用的绘图基础模板,任何复杂的图表几乎都可以基于这个模板骨架填充内容而成。初学者刚开始学习时只需要牢记这一模板就足以应对大部分简单图表的绘制,在学习过程中可以将这个模板模块化,了解每个模块在做什么,在绘制复杂图表时如何修改,填充对应的模块。

# step1 准备数据
x = np.linspace(0, 2, 100)
y = x**2

# step2 设置绘图样式,这一模块的扩展参考第五章进一步学习,这一步不是必须的,样式也可以在绘制图像是进行设置
mpl.rc('lines', linewidth=4, linestyle='-.')

# step3 定义布局, 这一模块的扩展参考第三章进一步学习
fig, ax = plt.subplots()  

# step4 绘制图像, 这一模块的扩展参考第二章进一步学习
ax.plot(x, y, label='linear')  

# step5 添加标签,文字和图例,这一模块的扩展参考第四章进一步学习
ax.set_xlabel('x label') 
ax.set_ylabel('y label') 
ax.set_title("Simple Plot")  
ax.legend() ;

思考题

  • 请思考两种绘图模式的优缺点和各自适合的使用场景
  • 在第五节绘图模板中我们是以OO模式作为例子展示的,请思考并写一个pyplot绘图模式的简单模板
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一回:Matplotlib初相识 的相关文章

  • 这段代码中list[:]的含义是什么? [复制]

    这个问题在这里已经有答案了 这段代码来自Python的文档 我有点困惑 words cat window defenestrate for w in words if len w gt 6 words insert 0 w print wo
  • 我是否必须覆盖子类中的所有数学运算符?

    我想在 Python 3 7 程序中创建一个简单的 Point2d 类 仅实现一些功能 我在一个 SO 答案中看到 我现在找不到 创建 Point 类的一种方法是重写complex所以我写了这个 import math class Poin
  • 使用输入按钮处理网站上的分页

    试图使用硒抓取这个网站 我的代码可以工作 但目前它只抓取第一页 该页面使用输入按钮作为浏览页面的一种方式 因此我想逐个单击每个按钮 但它不起作用 有没有人有任何其他方法来处理此类分页的导航 import requests from sele
  • 特定代码行的类似装饰器的语法

    链接主题 但不重复 装饰器对代码的特定行而不是整个方法进行计时 https stackoverflow com questions 30433910 decorator to time specific lines of the code
  • 使用非负约束进行优化

    考虑以下功能 import numpy as np import scipy optimize as opt import math Periodic indexation def pl list i return list i len l
  • Python daysBetweenDate

    我想我可能有一个无限循环 因为每当我运行代码时 我都会收到一条错误消息 它说 程序因使用 13 CPU 秒而关闭 整个代码 应该以日期作为输入并输出第二天 此代码假设所有月份都是 30 天 除了daysBetweenDates功能正常 其他
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • 使用 Pandas 解析时避免 Excel 的科学记数法舍入

    我有一个自动生成的 Excel 文件 其中偶尔包含非常大的数字 例如135061808695 在 Excel 文件中 当您单击单元格时 它会显示完整的数字135061808695然而 在视觉上 使用自动 常规 格式 数字显示为1 35063
  • OpenCV Python 和 SIFT 功能

    我知道有很多关于Python and OpenCV但我没有找到有关这个特殊主题的帮助 我想提取SIFT关键点来自 python OpenCV 中的图像 我最近安装了 OpenCV 2 3 可以访问 SURF 和 MSER 但不能访问 SIF
  • Pandas 将 NULL 读取为 NaN 浮点数而不是 str [重复]

    这个问题在这里已经有答案了 给定文件 cat test csv a b c NULL d e f g h i j k l m n 其中第三列被视为str 当我对列执行字符串函数时 pandas已阅读NULLstr 作为一个NaN float
  • 使用 pybind11 修改 std::array 的默认值

    我的目标是修改在中声明的数组C struct并赋予默认值 我读过了this https pybind11 readthedocs io en stable advanced cast stl html making opaque types
  • QFileDialog 作为 TableView 的编辑器:如何获取结果?

    我正在使用一个QFileDialog作为某些专栏的编辑QTableView 这基本上有效 对一些焦点问题取模 请参阅here https stackoverflow com questions 22854242 qfiledialog as
  • scrapy蜘蛛如何将值返回给另一个蜘蛛

    我正在爬行的网站包含许多玩家 当我点击任何玩家时 我都可以进入他的页面 网站结构是这样的
  • 使用 Click 在 python 中创建命令行应用程序

    我正在使用 Python 创建一个命令行应用程序Click http click pocoo org 接受名称作为输入的库 但如果未输入名称 则返回默认值 这是我到目前为止的代码 hello py import click click ve
  • 如何在 Pandas 中将多列乘以一列

    我想拥有 df income 1 income 2 df mtaz proportion 返回这些列乘以df mtaz proportion 这样我就可以设置 df mtaz income 1 mtaz income 2 df income
  • Python 的最佳实践:assert command() == False [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python,socket.error:[Errno 10049]

    在开发一个简单的聊天客户端的基础上 遇到以下错误 socket error Errno 10049 The requested address is not valid in its context 代码是 from socket impo
  • 在硬件级别模拟按键 - Windows

    我正在寻找一种语言或库 使我能够在最大可能的水平上模拟击键 而无需实际按下按键 我对击键级别的具体衡量标准是 当我的计算机已经运行按键侦听器 例如鼠标键和粘滞键 时 它是否会产生与物理按键相同的输出 我尝试过很多击键模拟的方法 java A
  • Python - 函数无法在新线程中运行

    我正试图杀死notepad exe使用此函数在 Windows 上进行处理 import thread wmi os print CMD Kill command called def kill c wmi WMI Commands not
  • Python记录多个模块记录器在主程序之外不起作用

    我的目标是从多个模块进行日志记录 同时仅在一个位置 主程序中 配置记录器 如图所示这个答案 https stackoverflow com questions 15727420 using python logging in multipl

随机推荐

  • 嵌入式开发linux控制鼠标,嵌入式系统/ARM技术中的linux中如何使用微软鼠标的第4、5键...

    虽说使用linux的人大都对微软没什么好感 但不能否认微软确实也出了不少好东西呀 比如微软鼠标 IE系列 icon smile gif IE 2 0和以上版本都有5个按钮 除了正常的左中右外 两侧还各有一个 在windows中可用来支持浏览
  • 面试题之你对redis的认识

    这里是我自己看书对redis的总结 这次我们目标的Redis在java互联网项目网中的作用 在传统的javaweb项目中 使用数据库进行存储数据 但是有一些致命的弊端 主要来自性能方面 由于数据库持久化数据主要是面向磁盘 而磁盘的读 写比较
  • yarn-container的理解

    不管是MR还是spark 分布式并行计算是肯定的 分布式计算意味着多节点 每个节点必须要并行跑很多task 任务 因为如果一个节点只有一个task 那么节点数量远远不够 让开发者直接操作 cpu和内存显然不合理 要用container抽象
  • 用户在输入不符合格式要求的内容或出现多个小数点时,无法继续输入新内容,但仍然可以使用后退键进行修正

  • 美国大学生数学建模竞赛赛题特点

    美国大学生数学建模竞赛赛题特点 赛题灵活度高 内容广泛 反恐 防灾 环境 健康医疗 交通 新能源等等 开放性大 评价类问题多且复杂 离散型优化问题多 除A题 如 2016B太空碎片的处理 2018D电动车充电桩的优化 2019D卢浮宫疏散路
  • 重要通知:9月1日起,微信小程序须完成备案后才可上架

    微信官方通知 近日 工信部发布了 工业和信息化部关于开展移动互联网应用程序备案工作的通知 8月9日 微信公众平台也发布了 关于开展微信小程序备案的通知 一 备案必要性 在中华人民共和国境内从事互联网信息服务的移动互联网应用程序主办者 应当依
  • ArduCopter调试

    1 ArduPilot main 我们知道 在 C语言中最经典的程序是 Hello World 这应该是我们在 C语言中最早接触的一个程序了 而在单片机中 最经典的一个程序当属 LED了 那么这里我们为什么不去分析 Hello World
  • 使用嵌入式linux完全手册光盘的arm-linux-gcc 遇到问题 自己编译

    Redhat9下重新生成交叉编译器gcc 3 4 5 glibc 2 3 6 看到论坛上有兄弟也遇到 arm linux gcc lib tls libc so 6 version GLIBC 2 4 not found required
  • 鸿蒙手机录音,录音应用的隐藏功能,90%的人不知道?

    录音应用的隐藏功能 90 的人不知道 2019 04 22 16 57 20 1点赞 0收藏 0评论 录音应用其实隐藏着可以自动开始和结束 脱离手用蓝牙耳机录音 只在说话时录音 你使用过吗 这款录音应用可是被苹果App Store推荐过的
  • 从零开始:在腾讯云轻量服务器上安装Docker,实现快速开发和部署!

    本文指导您如何在 零基础轻量应用服务器上安装 Docker 以及使用 Docker 镜像源加速镜像下载 好了 没有废话 让我们开始行动吧 第一步 购买服务器 小编买的是 腾讯的 1年446RMB 下载链接如下 学生云服务器 学生云主机 学生
  • 可靠数据传输的实现

    可靠数据传输协议 我们知道 TCP和UDP都是基于IP网际协议来传输数据的 但是IP网际协议是一种不可靠数据传输协议 它不负责数据丢失等情况 而TCP是一种可靠数据传输 因此我们需要来关注TCP是如何实现可靠数据传输的 经完全可靠信道的可靠
  • wxc-button使用

  • 怎么理解回流跟重绘?什么场景下会触发?

    目录 一 什么是回流 下面这些操作会导致回流 二 什么是重绘 下面这些操作会导致重绘 除此之外还有一些其他引起重绘行为 三 如何避免回流与重绘 减少回流与重绘的措施 一 什么是回流 当渲染树中部分或者全部元素的尺寸 结构或者属性发生变化时
  • 多编程语言代码生成神器 CodeGeeX,编码效率提升十倍!

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网
  • 物理端口UP 协议DOWN 的排错步骤

    端口的物理层Up 但是协议Down 可能的原因有很多种 一般而言 链路层协议从 初始化到Up 起来 都会经过一个协议的 协商 过程 这里所说的协商是广义上的协商 既包括链路层协议本身规定的参数 能力协商 也包括协议所规定的定期性的链路通达性
  • Drupal YAML 反序列化代码执行漏洞(CVE-2017-6920)

    事件背景 框架漏洞收集 老外的CMS框架 比较复杂 数据流向太长 调试需要消耗较多的时间 漏洞说明 1 漏洞原理 2017年6月21日 Drupal官方发布了一个编号为CVE 2017 6920 的漏洞 影响为Critical 这是Drup
  • maven 仓库配置 pom中repositories属性

    什么是Maven仓库 在不用Maven的时候 比如说以前我们用Ant构建项目 在项目目录下 往往会看到一个名为 lib的子目录 那里存放着各类第三方依赖jar文件 如log4j jar junit jar等等 每建立一个项目 你都需要建立这
  • python实现二叉树遍历

    使用python实现二叉树的四种遍历 前序 中序 后序和层次遍历 以遍历下图二叉树为例 1 树的构造 代码如下 coding utf 8 class Node object 节点类 def init self elem 1 lchild N
  • 串的模式匹配算法之KMP与BF

    这几天做手机软件 都不怎么看一些算法小程序了 同学数据结构作业 急需交 帮其做 文件名 KMP BF cpp 描述 实验内容 比较BF算法和KMP算法的优劣 实验基本要求 1 采用定长顺序显示表示串长的结构来存储串 结构定义见课件第17张幻
  • 第一回:Matplotlib初相识

    文章目录 第一回 Matplotlib初相识 一 认识matplotlib 二 一个最简单的绘图例子 三 Figure的组成 四 两种绘图接口 五 通用绘图模板 思考题 第一回 Matplotlib初相识 一 认识matplotlib Ma