Matplotlib精品学习笔记001-图形绘制常见的组分有哪些?

news2025/7/12 11:21:30

简介

从头学习,逐步精美

学习蓝本

学习资料是Quick start

内容

所有绘图的起始步骤

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

通过一个简单的例子认识Matplotlib绘图的过程,见代码注释

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

fig, ax = plt.subplots() # 创建包含一个轴区(ax)的fig(图形)
ax.plot([1,2,3,4], [2, 3,1,4]) # 在ax中绘制散点图(plot)

plt.show() # 显示图形

散点图

matplotlib图形的组成了解

在这里插入图片描述

Figure(图形)

即图形整体。图形包含着所有的轴区(即axes),其余的都是特殊的艺术组件,包括标题(titles)、figure legends(图例)、colorbars(色带)甚至嵌套的子图形(subfigures)等等。

创建图形的方法有3种,各有所好

fig = plt.figure()  # 创建没有ax的空白图形
fig, ax = plt.subplots()  # 创建含有一个ax的空白图形
fig, axs = plt.subplots(2, 2)  # 创建含有2x2排列的ax的空白图形
axes(轴区)

轴区(axes)是图形(figure)里占据一定面积的区域,通常有2条轴线(axis)(或者3D里有3条)。轴线(axis)的刻度(ticks)和刻度标签(ticks labels)为在轴区中利用数据绘制提供标尺。

每个轴区(axes)都有单独的标题(set_title()),X轴标签(set_xlabel())和Y轴标签(set_ylabel())。

轴区是应用大部分绘图方法的对象。

axis(轴线)

轴线可以设置标尺(scale)、标尺范围(limits),还可以生成刻度(ticks,轴线上的标记)和刻度标签(ticklabels,刻度的文字标签)。刻度的位置是由定位器(Locator)决定的,刻度标签由格式器(Formatter)进行格式化。定位器和格式器的精确联合能精准控制刻度的位置和标签。

artist(艺术器)

图形上任何可视的元素都是艺术器(artist),包括前文介绍的三种。还包括文本(Text)、线形2D(line2D)、收集器(collections)、修补器(pathc)等等。绘制图形就是将各个艺术器展现在画布(canvas)上。大多数艺术器都应用在一个轴区上,不能共享或转移。

绘图的输入数据类型

绘图时最好输入numpy.array或numpy.ma.masked_array类型数据,或者能转换成numpy.asarray的数据。类似的数据类型,比如pandas数据类型和numpy.matrix都不接受。通常在绘图前要把不接受的数据类型转换未numpy.array。以numpy.matrix为例:

b = np.matrix([[1, 2], [3, 4]])
b_asarray = np.asarray(b)

大部分的绘图方法会尝试解析例如numpy.recarray和pandas.DataFrame的字典数据。Matplotlib可以通过data关键字参数传参,并通过x和y位置的键值(key)查找data传参的对值(value)。

np.random.seed(19680801)  # 随机数
data = {'a': np.arange(50),
        'c': np.random.randint(0, 50, 50),
        'd': np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100

fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
ax.scatter('a', 'b', c='c', s='d', data=data)
ax.set_xlabel('entry a')
ax.set_ylabel('entry b')

编码类型

显式和隐式接口
  • 直接创建图形(fig)和轴区(axes),然后对其调用函数(面向对象风格
  • 通过pyplot间接创建和控制图形(fig)和轴区(axes),使用pyplot功能绘图

更多详细信息请阅读Matplotlib显式与隐式接口有何不同?

面向对象风格的例子:

x = np.linspace(0, 2, 100)  # 创建简单的数据

# 注意,即使在面向对象风格中,也是采用.pyplot.figure创建图形
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
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')  # 向轴区添加X轴标签
ax.set_ylabel('y label')  # 向轴区添加Y轴标签
ax.set_title("Simple Plot")  # 向轴区添加标题
ax.legend()  # 添加图例

pyplot风格:

x = np.linspace(0, 2, 100)  # Sample data.

plt.figure(figsize=(5, 2.7), layout='constrained')
plt.plot(x, x, label='linear')  # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic')  # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()

还有第三种使用方法,当Matplotlib被嵌入GUI时,就要完全抛弃pyplot甚至figure的建立。详解matplotlib嵌入tkinter

辅助函数

如果你要用不同的数据在同一块区域绘图,或者希望能更简便地调用Matplotlib方法,可以采用下面的方法:

def my_plotter(ax, data1, data2, param_dict):
    """
   通过辅助函数绘图
    """
    out = ax.plot(data1, data2, **param_dict)
    return out

data1, data2, data3, data4 = np.random.randn(4, 100)  #创建4个随机数组
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(5, 2.7))
my_plotter(ax1, data1, data2, {'marker': 'x'}) # 利用辅助函数绘图
my_plotter(ax2, data3, data4, {'marker': 'o'}) # 利用辅助函数绘图

为艺术器选择样式

为艺术器选择样式,既可以在调用绘图函数时,也可以通过艺术器的设值函数(setter)。请看例子:

fig, ax = plt.subplots(figsize=(5, 2.7))
x = np.arange(len(data1))
ax.plot(x, np.cumsum(data1), color='blue', linewidth=3, linestyle='--') # 调用绘图(plot)函数时直接配置color、linewidth和linestyle样式
l, = ax.plot(x, np.cumsum(data2), color='orange', linewidth=2)
l.set_linestyle(':') # 在绘图后,通过设值函数set_linestyle选择样式

颜色(color)

绝大多数艺术器(artist)都有颜色属性。一些艺术器接受多个颜色,比如散点图(scatter)可以为标记点边缘和内部配置不同的颜色:

fig, ax = plt.subplots(figsize=(5, 2.7))
ax.scatter(data1, data2, s=50, facecolor='C0', edgecolor='k')

线宽,线样式,标记点大小(Linewidths,linestyles和markersizes)

线宽的基本单位是印刷点(1 pt = 1/72 inch) , 所有可以绘线的艺术器都能配置线宽,进而也可以配置线样式。详情可以参考matplotlib线样式

标记点大小取决于绘图方法。plot函数通常用印刷点表示标记的直径或宽度。scatter函数则是通过倍数来控制标记大小。

fig, ax = plt.subplots(figsize=(5, 2.7))
ax.plot(data1, 'o', label='data1')
ax.plot(data2, 'd', label='data2')
ax.plot(data3, 'v', label='data3')
ax.plot(data4, 's', label='data4')
ax.legend()

绘制标签

轴区(Axes)标签和文本

set_xlabel, set_ylabel, set_title分别用于配置X轴标签,Y轴标签和标题。通过text()可以直接向图中增添文本。

mu, sigma = 115, 15
x = mu + sigma * np.random.randn(10000)
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
# the histogram of the data
n, bins, patches = ax.hist(x, 50, density=True, facecolor='C0', alpha=0.75)

ax.set_xlabel('Length [cm]')
ax.set_ylabel('Probability')
ax.set_title('Aardvark lengths\n (not really)')
ax.text(75, .025, r'$\mu=115,\ \sigma=15$')
ax.axis([55, 175, 0, 0.03])
ax.grid(True)

添加注释(Annotations)

注释一般由注释文本和指向某处的箭头组成。

fig, ax = plt.subplots(figsize=(5, 2.7))

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2 * np.pi * t)
line, = ax.plot(t, s, lw=2)

ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
            arrowprops=dict(facecolor='black', shrink=0.05))

ax.set_ylim(-2, 2)

添加图例(Legends)

fig, ax = plt.subplots(figsize=(5, 2.7))
ax.plot(np.arange(len(data1)), data1, label='data1')
ax.plot(np.arange(len(data2)), data2, label='data2')
ax.plot(np.arange(len(data3)), data3, 'd', label='data3')
ax.legend()

轴的标尺和刻度(axis scales and ticks)

每个轴区都有两个轴对象(axis objects),分别表示x轴和y轴。它们控制着轴的标尺,刻度的位置和刻度的格式。

标尺(scales)

matplotlib除了线形标尺外,还有非线性标尺,比如对数标尺(log-scale)。

fig, axs = plt.subplots(1, 2, figsize=(5, 2.7), layout='constrained')
xdata = np.arange(len(data1))  # make an ordinal for this
data = 10**data1
axs[0].plot(xdata, data)

axs[1].set_yscale('log')
axs[1].plot(xdata, data)

刻度的定位器和格式器

每个轴对象都有的刻度定位器和格式器决定着刻度标记在轴上的位置。set_xticks()就是决定X轴刻度的简单接口。

fig, axs = plt.subplots(2, 1, layout='constrained')
axs[0].plot(xdata, data1)
axs[0].set_title('Automatic ticks')

axs[1].plot(xdata, data1)
axs[1].set_xticks(np.arange(0, 100, 30), ['zero', '30', 'sixty', '90'])
axs[1].set_yticks([-1.5, 0, 1.5])  # note that we don't need to specify labels
axs[1].set_title('Manual ticks')

添加日期和字符串

Matplotlib可以利用日期数组或字符串数组进行绘图,期间会生成合适的定位器和格式器。例如日期:

fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
dates = np.arange(np.datetime64('2021-11-15'), np.datetime64('2021-12-25'),
                  np.timedelta64(1, 'h'))
data = np.cumsum(np.random.randn(len(dates)))
ax.plot(dates, data)
cdf = mpl.dates.ConciseDateFormatter(ax.xaxis.get_major_locator())
ax.xaxis.set_major_formatter(cdf)

还有字符串:

fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
categories = ['turnips', 'rutabaga', 'cucumber', 'pumpkins']

ax.bar(categories, np.random.rand(len(categories)))

操作多个Figures和Axes

可以通过多次调用fig = plt.figure() 或 fig2, ax = plt.subplots()来创建多个Figures。之后可以向每个Figures中增加Artist。

创建多个Axes的方法很多,最常用的就是plt.subplots()。可以通过subplot_mosaic按行列来创建复杂的Axe对象。

fig, axd = plt.subplot_mosaic([['upleft', 'right'],
                               ['lowleft', 'right']], layout='constrained')
axd['upleft'].set_title('upleft')
axd['lowleft'].set_title('lowleft')
axd['right'].set_title('right')

在这里插入图片描述

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

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

相关文章

重温Python基础知识点,又来重新巩固一遍

前言 最近有很多朋友刚接触python学的还是有点模糊 还有的朋友就是想重温一下基础内容,毕竟基础不牢地动山摇 行吧,就总结了以下的一些知识点,可以都看看哈 一、开发环境搭建 更多学习资料.点击领取即可 1.1 Python解释器的安装 Python解…

ctfshow 代码审计专题

文章目录web 301web 302web 303web 304web 305web 306web 307web 308web 309web 310web 301 简单看一下,在checklogin.php中发现了sql语句,且没过滤,直接sql注入。 –form测试,–batch绕过waf.–dump列出所有库和表。 得到账号密码&#xf…

MySQL数据库————MVCC

MySQL的脏读、幻读、不可重复读 脏读 现在有两个事务在操作table表,事务B修改了id2的name字段为李老四,但是没有提交,事务A查询id2的数据,得到name为李老四;事务B发生回滚,id2的数据的name又变回李四&…

Linux 防火墙配置(iptables和firewalld)

目录 防火墙基本概念 Iptables讲解 Iptables表 Iptables规则链 Iptables控制类型 Iptables命令配置 firewalld讲解 Firewalld区域概念 Firewalld两种配置方法 firewall-cmd命令行基础配置 firewall-config图形化配置 防火墙基本概念 防火墙就是根据系统管理员设定的…

用 tensorflow.js 做了一个动漫分类的功能(二)

前言:前面已经通过采集拿到了图片,并且也手动对图片做了标注。接下来就要通过 Tensorflow.js 基于 mobileNet 训练模型,最后就可以实现在采集中对图片进行自动分类了。这种功能在应用场景里就比较多了,比如图标素材站点&#xff0…

java集成redis简单存储

这里主要将数据存redis并设置过期时间、通过key删除redis、通过key更新redis(续期) 将数据存redis并设置过期时间 引入redis依赖 import org.springframework.data.redis.core.StringRedisTemplate;AutowiredStringRedisTemplate stringRedisTemplate…

【基础教程】Appium自动化测试,太详细了!

Appium简介Appium是一款开源的Appium自动化工具, 基于Webdriver协议, 主要有以下3个特点:全能: 支持iOS/Andorid/H5/混合App/WinApp通用: 支持Win/Linux/Mac, 支持Java/Python/Ruby/Js/PHP等各种语言开源: 免费App自动化测试工具对比iOS官方:Uiautomation/XCUITest: 白盒, UI测…

(二十)、完成个人中心页面的数据统计+设置详情页点赞用户的头像组【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1,个人中心页面的数据统计 数据统计包括两项内容:1.当前登录用户的点赞总数量。2.当前登录用户发布文章的总数量 1.1,在self页面data中定义对象 data() {return {totalObj:{artNum:0,likeNum:0}};},1.2,获取总数量的方法&#x…

多线程(初识线程)

线程的诞生 了解进程存在的意义 实现了并发编程的效果(并发编程:有可能是并发执行,也有可能是并行执行) 并发编程的目的:充分利用上多核CPU资源,提升运行效率 了解进程创建和销毁的过程带来的问题 进程是…

系列二、函数

一、定义 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码MySQL中 已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。二、字符串函数 2.1、案例 2.1.1、concat 字符串拼接 s…

js中?.、??的具体用法

1、?. (可选链运算符) 在javascript中如果一个值为null、undefined,直接访问下面的属性,会报 Uncaught TypeError: Cannot read properties of undefined 异常错误。而在真实的项目中是会出现这种情况,有这个值就读这…

泛型擦除(Generic erase)(内含教学视频+源代码)

泛型擦除(Generic erase)(内含教学视频源代码) 教学视频源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87473560 源代码中使用的泛型,在经过编辑后,代码中就看不到泛…

PX4之飞行控制框架

PX4的飞行控制程序通过模块来实现,与飞控相关的模块主要有commander,navigator,pos_control,att_control这几个,分别可以在src/modules目录中找到。 commander - 指令/事件处理模块,处理指令、遥控器输入和…

新C++(9):谈谈,翻转那些事儿

"相信羁绊,相信微光,相信一切无常。"一、AVL树翻转那些事儿(1)什么是AVL树?在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。…

网上插画教学哪家质量好,汇总5大插画培训班

网上插画教学哪家质量好?给大家梳理了国内5家专业的插画师培训班,最新五大插画班排行榜,各有优势和特色! 一:国内知名插画培训机构排名 1、轻微课(五颗星) 主打课程有日系插画、游戏原画、古风插…

Tencent OS下逻辑卷(LVM)创建和扩容

测试环境是一个虚拟机,原配置1个虚拟盘。 创建4个虚拟盘,每盘2G并挂载在虚拟主机上,启动虚拟主机开始测试。 LVM英文是Logical Volume Manager,直接翻译为逻辑卷管理。 这种磁盘管理模式比较灵活,在磁盘空间不足的时…

深入浅出C++ ——容器适配器

文章目录一、容器适配器二、deque类简介1. deque的原理2. deque迭代器3. deque的优点和缺陷4. 为什么选择deque作为stack和queue的底层默认容器一、容器适配器 适配器的概念 适配器是STL六大核心组件之一,它是一种设计模式,该种模式是将一个类的接口转换…

大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s 📚️Reference: IoT 边缘计算系列文章 HashiCorp 解决方案 - Nomad Docker 简介 Nomad: 一个简单而灵活的调度器和编排器,…

网络工程课(二)

ensp配置vlan 一、配置计算机ip地址和子网掩码 二、配置交换机LSW1 system-view [Huawei]sysname SW1 [SW1]vlan batch 10 20 [SW1]interface Ethernet0/0/1 [SW1-Ethernet0/0/1]port link-type access 将接口设为access接口 [SW1-Ethernet0/0/1]port default vlan 10 [SW1-E…

【MyBatis】源码学习 04 - 从 MapperMethod 简单分析一条 SQL 的映射操作流程

文章目录前言参考目录学习笔记1、测试代码说明2、binding 包的主要功能3、获取 Mapper 接口实例过程4、SQL 语句执行流程4.1、方法调用器4.2、MapperMethod 绑定方法4.2.1、SqlCommand4.2.2、MethodSignature4.3、MapperMethod#execute前言 本文内容对应的是书本第 13 章的内容…