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

2023-10-08 04:20

本文主要是介绍Matplotlib精品学习笔记001-图形绘制常见的组分有哪些?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

从头学习,逐步精美

学习蓝本

学习资料是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 mplfig, 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']) * 100fig, 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 outdata1, 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')

在这里插入图片描述

这篇关于Matplotlib精品学习笔记001-图形绘制常见的组分有哪些?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

MySQL ORDER BY 语句常见用法、示例详解

《MySQLORDERBY语句常见用法、示例详解》ORDERBY是结构化查询语言(SQL)中的关键字,隶属于SELECT语句的子句结构,用于对查询结果集按指定列进行排序,本文给大家介绍MySQL... 目录mysql ORDER BY 语句详细说明1.基本语法2.排序方向详解3.多列排序4.常见用法示例5.

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I