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

相关文章

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::