四.Matplotlib

5440 Views

Matplotlib

1.Matplotlib 基础介绍

1.1 简介

Matplotlib 是一个用于 Python 编程语言和其数值数学扩展 NumPy 的绘图库。它提供了一个面向对象的 API,用于嵌入到应用程序中的图形,并且可以生成多种硬拷贝格式和交云平台的交互式环境。Matplotlib 可以用于 Python 脚本、Python 和 IPython shell、Jupyter notebook、Web 应用服务器以及多种图形用户界面工具包。

Matplotlib 是数据科学和人工智能领域中使用最广泛的 Python 数据可视化库之一。它的设计哲学是能够用简单易懂的命令生成复杂的图表。其他数据可视化库,如 Pandas 和 Seaborn,也是基于 Matplotlib 的 API 构建的,这使得 Matplotlib 成为学习数据可视化的基础。

在本教程中,我们将从 Matplotlib 的基础知识开始,逐步深入到更高级的绘图技巧。

1.2 安装 Matplotlib

如果你还没有安装 Matplotlib,可以通过以下命令进行安装:

pip install matplotlib

1.3 基础绘图

在 Matplotlib 中,最基本的对象是 Figure 和 Axes。Figure 对象是顶层的容器,它包含了页面上所有的绘图元素。Axes 是位于 Figure 中的独立图表,我们通常在 Axes 上绘制各种图形。

创建第一个图表

让我们从一个简单的线图开始,这是学习 Matplotlib 的第一步。

import matplotlib.pyplot as plt

import numpy as np

# 创建数据

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

y = np.sin(x)

# 创建一个图形和轴

fig, ax = plt.subplots()

# 在轴上画线

ax.plot(x, y)

# 显示图形

plt.show()

## 这段代码首先导入必要的模块,然后创建一组 x 和 y 值,用于绘制正弦波。subplots() 函数创建一个图形和一个轴对象,然后我们在轴上调用 .plot() 方法绘制数据。最后,使用 plt.show() 显示图形。

1.4 使用 Pyplot 的简化接口

对于更简单的图表,我们可以使用 pyplot 接口,这是一种更加简洁的方式来生成图表。

plt.plot(x, y)

plt.show()

## 这段代码做了同样的事情,但是更加简洁。`pyplot` 自动为你创建图形和轴,并且在调用 `show()` 时显示结果。

1.5 图形的组成

一个完整的 Matplotlib 图形通常包含以下几个层级:

Figure:容器,包含所有图表元素Axes:代表了图形中的单个图表Axis:轴线和标签Artist:图形的所有元素,包括 Text 对象、Line2D 对象等

2.绘图接口

Matplotlib 提供了两种主要的绘图接口:

面向对象的接口:显式创建图形和轴,并调用它们的方法。pyplot 接口:依赖于 pyplot 自动创建和管理图形和轴,并且提供了类似于 MATLAB 的接口。

面向对象的接口更适合于复杂的图表,因为它提供了更高的灵活性和易用性。pyplot 接口则更适合于交互式使用,例如在 Jupyter notebook 中快速绘图

示例:多行图

让我们通过一个示例来比较两种接口。我们将绘制一个包含线性、二次和三次函数的图。

2.1 使用面向对象的接口

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()

2.2 使用 pyplot 接口

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

# 使用 pyplot 绘制三个函数

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()

2.3 通用绘图模板

在实际工作中,我们通常会遇到更复杂的绘图需求。为此,我们可以使用一个通用的绘图模板,以便快速开始绘图,并根据需要进行定制。

# 准备数据

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

y = x**2

# 创建图形和轴

fig, ax = plt.subplots()

# 设置图形的样式(可选)

plt.rc('lines', linewidth=2, linestyle='--')

# 绘制数据

ax.plot(x, y, label='quadratic')

# 添加标签、标题和图例

ax.set_xlabel('x label')

ax.set_ylabel('y label')

ax.set_title("Simple Plot")

ax.legend()

# 显示图形

plt.show()

3.Matplotlib 基本元素

Matplotlib 是一个用于在 Python 中创建数据可视化的强大库。Jupyter Notebook 的交互式环境使得 Matplotlib 成为展示和分析数据的理想工具。在本教程中,我们将深入探讨 Matplotlib 的基础知识,包括如何创建和自定义各种类型的图表。

首先,让我们导入 Matplotlib 以及其他我们将会用到的库:

import numpy as np

import pandas as pd

import re

import matplotlib.pyplot as plt

from matplotlib.lines import Line2D

from matplotlib.patches import Circle, Wedge, Rectangle, Polygon

from matplotlib.collections import PatchCollection

3.1 基本元素

在 Matplotlib 中,所有的图形都是由基本元素(primitives)和容器(containers)组成。基本元素包括了诸如线条(Line2D)、矩形(Rectangle)、多边形(Polygon)和图像(image)等,而容器则包括了图(Figure)和子图(Axes)。接下来,我们将逐一介绍这些基本元素。

3.2 2DLines

线条是 Matplotlib 中的基本元素之一,用于绘制图表中的线。在 Matplotlib 中,线条可以是实线、虚线或由各种不同标记(markers)构成的点线。

创建 Line2D

创建线条的一种方法是使用 Line2D 类。这个类的构造函数允许我们详细地自定义线条的外观:

Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, marker=None, ...)

xdata, ydata: 确定线条上点的位置。linewidth: 线条的宽度。linestyle: 线条的样式,例如实线、虚线等。color: 线条的颜色。marker: 点的标记样式。

设置 Line2D 属性

您可以通过多种方式设置线条的属性:

在 plot() 函数中直接设置。获取线条对象后,调用其方法设置。使用 setp() 函数设置。

以下是一些示例:

# 1) 在 plot() 函数中直接设置

x = range(0, 5)

y = [2, 5, 7, 8, 10]

plt.plot(x, y, linewidth=2, linestyle='--', color='g', marker='o')

plt.show()

# 2) 获取线条对象后,调用其方法设置

line, = plt.plot(x, y)

line.set_linewidth(2)

line.set_linestyle('--')

line.set_color('g')

line.set_marker('o')

plt.show()

# 3) 使用 setp() 函数设置

line, = plt.plot(x, y)

plt.setp(line, linewidth=2, linestyle='--', color='g', marker='o')

plt.show()

绘制线条

在 Matplotlib 中,最常见的绘制线条的方法是使用 plot 方法

x = range(0, 5)

y1 = [2, 5, 7, 8, 10]

y2 = [3, 6, 8, 9, 11]

plt.plot(x, y1, label='Line 1')

plt.plot(x, y2, label='Line 2', linestyle='--')

plt.legend()

plt.show()

绘制误差线

errorbar() 函数允许我们在数据点周围绘制误差线,表示数据的不确定性:

x = np.arange(10)

y = 2.5 * np.sin(x / 20 * np.pi)

yerr = np.linspace(0.1, 0.2, 10)

plt.errorbar(x, y, yerr=yerr, fmt='-o', ecolor='red', elinewidth=1)

plt.show()

3.3 Patch

在matplotlib库中,patches模块提供了一系列用于绘制多种二维图形的类,这些类可以用于在图表中添加形状。matplotlib.patches.Patch类是所有这些二维图形类的基类,它提供了一些共通的属性和方法。下面是Patch类的构造函数:

Patch(edgecolor=None, facecolor=None, color=None, linewidth=None, linestyle=None, antialiased=None, hatch=None, fill=True, capstyle=None, joinstyle=None, **kwargs)

在这个基础上,matplotlib.patches模块中定义了多种具体的形状类,如矩形(Rectangle)、多边形(Polygon)、楔形(Wedge)等。在本节中,我们将重点介绍这三种最常用的子类。args)

Rectangle(矩形)

Rectangle类用于绘制矩形,其构造函数如下:

class matplotlib.patches.Rectangle(xy, width, height, angle=0.0, **kwargs)

其中,xy参数指定了矩形左下角的点的坐标,width和height分别指定了矩形的宽度和高度。

1) hist(直方图)

直方图是统计学中常用的数据分布图,matplotlib.pyplot.hist函数可以快速绘制直方

matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar', align='mid', log=False, color=None, label=None, stacked=False, normed=None)

图。下面是hist函数中一些常用参数的含义:

x: 数据集,直方图将对数据集进行统计。bins: 统计的区间分布。range: 显示的区间,range在没有给出bins时生效。density: 布尔值,默认为False。为True时显示频率统计结果。histtype: 直方图类型,可选{'bar', 'barstacked', 'step', 'stepfilled'}。align: 柱状图的对齐方式,可选{'left', 'mid', 'right'}。log: 布尔值,设置y轴的刻度是否为对数刻度。stacked: 布尔值,是否堆叠。

# 生成随机数据集

x = np.random.randint(0, 100, 20)

# 设置分布区间

bins = np.arange(0, 101, 10)

# 绘制直方图

plt.hist(x, bins=bins, color='fuchsia')

plt.xlabel('scores')

plt.ylabel('count')

plt.xlim(0, 100)

plt.show()

2) bar(柱状图)

柱状图是表示数据分布的另一种图表,matplotlib.pyplot.bar函数可以用于绘制柱状

matplotlib.pyplot.bar(left, height, alpha=1, width=0.8, color=, edgecolor=, label=, lw=3)

图。下面是bar函数中一些常用参数的含义:

left: x轴的位置序列。height: y轴的数值序列,即柱形图的高度。alpha: 透明度。width: 柱形图的宽度。color或facecolor: 柱形图填充的颜色。edgecolor: 图形边缘颜色。label: 为每个柱形图提供标签,用于图例说明。

# bar绘制柱状图示例

y = range(1, 17)

plt.bar(np.arange(16), y, alpha=0.5, width=0.5, color='yellow', edgecolor='red', label='The First Bar')

plt.legend()

plt.show()

Polygon(多边形)

Polygon类用于绘制多边形,其构造函数如下:

matplotlib.patches.Polygon类是多边形类。它的构造函数:

class matplotlib.patches.Polygon(xy, closed=True, **kwargs)

xy:这是一个 Nx2 的 numpy 数组或者是 [x, y] 对的序列,代表多边形的顶点。

closed:这是一个布尔值(True 或 False)。如果为 True,则多边形将闭合,即起点和终点是相同的。

**kwargs0:这些是可以用来设置多边形各种属性的额外关键字参数,如:

facecolor:多边形的填充颜色,可以是任何matplotlib颜色。

edgecolor:多边形边缘的颜色,可以是任何matplotlib颜色。

linewidth:边缘线的宽度。

alpha:填充颜色的透明度级别,0 表示完全透明,1 表示完全不透明。

matplotlib.patches.Polygon类中常用的是fill类,它是基于xy绘制一个填充的多边形,它的定义:

class matplotlib.pyplot.fill(*args, data=None, **kwargs)

*args:这些是多边形顶点的 x 和 y 坐标。可以作为分开的序列(例如,x, y)或者 (x, y) 元组的序列传递。data:一个可选参数,允许指定数据的来源。**kwargs:额外的关键字参数,用于指定多边形的属性,与matplotlib.patches.Polygon中使用的类似。一些常见的包括:

color:填充多边形的颜色。edgecolor:多边形边缘的颜色。alpha:填充颜色的不透明度级别。

1) 使用 Polygon

# 1) 使用 Polygon

# 创建一个多边形的顶点数组

polygon_points = np.array([[0, 0], [1, 2], [2, 1], [1, 0]])

# 创建一个Polygon对象

polygon = Polygon(polygon_points, closed=True, facecolor='lightblue', edgecolor='red')

# 创建一个图和一个子图

fig, ax = plt.subplots()

# 将多边形添加到子图上

ax.add_patch(polygon)

# 设置坐标轴的限制

ax.set_xlim(-1, 3)

ax.set_ylim(-1, 3)

# 显示图形

plt.show()

2) 使用fill

# 2) 使用fill

# 定义多边形的顶点

x = [0, 1, 2, 1]

y = [0, 2, 1, 0]

# 使用fill函数绘制多边形并填充颜色

plt.fill(x, y, color='lightgreen',edgecolor='red')

# 设置图表标题和坐标轴标签

plt.title('Polygon Example')

plt.xlabel('x-axis')

plt.ylabel('y-axis')

# 设置坐标轴的范围

plt.xlim(-1, 3)

plt.ylim(-1, 3)

# 显示图形

plt.show()

Wedge(楔形)

Wedge类用于绘制楔形,其构造函数如下:

class matplotlib.patches.Wedge(center, r, theta1, theta2, width=None, **kwargs)

其中主要参数含义如下:

center: 扇区的中心坐标。可以是一个包含两个元素的元组或列表,表示扇区的中心点的 x 和 y 坐标。r: 扇区的半径。可以是一个标量值,表示扇区的半径长度。theta1: 扇区的起始角度。可以是一个标量值,表示扇区的起始角度(以度为单位)。theta2: 扇区的终止角度。可以是一个标量值,表示扇区的终止角度(以度为单位)。width: 扇区的宽度。可以是一个标量值,表示扇区的宽度(以半径的比例表示)。默认为None,表示绘制一个完整的扇区。**kwargs: 其他可选参数,用于进一步控制扇区的绘制。

饼状图(Pie Chart)

饼状图是一种常见的表示比例的图表,matplotlib.pyplot.pie函数可以用于绘制饼状图。

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)

下面是pie函数中一些常用参数的含义:

x: 饼图的数据。可以是一维数组或标量值。数组中的每个元素表示一个扇区的大小。explode: 控制每个扇区与饼图中心的偏移量。可以是一维数组或标量值。默认为None,表示不偏移任何扇区。labels: 每个扇区的标签。可以是一维数组或标量值。默认为None,表示不显示标签。colors: 每个扇区的颜色。可以是一维数组或标量值。默认为None,表示使用默认的颜色。autopct: 扇区上显示的百分比格式。可以是字符串或函数。默认为None,表示不显示百分比。pctdistance: 百分比标签与圆心的距离。默认为0.6,表示距离为扇区半径的0.6倍。shadow: 是否显示阴影效果。默认为False,表示不显示阴影。labeldistance: 标签与圆心的距离。默认为1.1,表示距离为扇区半径的1.1倍。startangle: 起始角度。默认为0,表示从正上方开始绘制饼图。radius: 饼图的半径。默认为1,表示半径为1。counterclock: 扇区绘制的方向。默认为True,表示逆时针方向绘制扇区。wedgeprops: 扇区的属性设置。可以是字典或关键字参数。默认为None,表示使用默认的扇区属性。textprops: 文本标签的属性设置。可以是字典或关键字参数。默认为None,表示使用默认的文本属性。center: 饼图的中心坐标。默认为(0, 0),表示中心在坐标原点。frame: 是否显示饼图的边框。默认为False,表示不显示边框。rotatelabels: 是否旋转标签。默认为False,表示不旋转标签。normalize: 是否对数据进行归一化。默认为None,表示不进行归一化。data: 饼图的数据。默认为None,表示没有数据。

# pie绘制饼状图示例

labels = ['Frogs', 'Hogs', 'Dogs', 'Logs']

x = [15, 30, 45, 10]

explode = (0,0.1,0,0)

fig1, ax1 = plt.subplots()

ax1.pie(x, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)

# axis('equal') 方法会将该 Axes 对象的 x 轴和 y 轴上的刻度设置为相同的比例,从而保证图形在这两个方向上的比例一致

ax1.axis('equal')

plt.show()

3.4 Collections

Collections 是用于绘制一组对象的容器,例如散点图就是由一组点的集合构成。

绘制散点图

Axes.scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)

其中最主要的参数如下:

x、y: 散点的 x 坐标和 y 坐标。可以是一维数组或标量值。s: 散点的大小。可以是标量值或与 x、y 相同长度的一维数组。默认为None,表示使用默认的散点大小。c: 散点的颜色。可以是标量值、一维数组或与 x、y 相同长度的一维数组。默认为None,表示使用默认的散点颜色。marker: 散点的标记样式。默认为None,表示使用默认的标记样式。常用的标记样式有’.‘(小圆点)、‘s’(正方形)、’^'(上三角形)等。cmap: 颜色映射(colormap)用于将数据值映射到颜色。默认为None,表示使用默认的颜色映射。常用的颜色映射有’viridis’、‘gray’、'jet’等。norm: 归一化对象,用于将数据值映射到[0, 1]区间。默认为None,表示不进行归一化。vmin、vmax: 数据值的最小值和最大值,用于控制颜色映射的范围。默认为None,表示使用数据的最小值和最大值。alpha: 散点的透明度。默认为None,表示不透明。linewidths: 散点边界线的宽度。可以是标量值或与 x、y 相同长度的一维数组。默认为None,表示使用默认的边界线宽度。verts: 自定义散点的顶点坐标。默认为None,表示不使用自定义顶点坐标。edgecolors: 散点边界线的颜色。可以是标量值、一维数组或与 x、y 相同长度的一维数组。默认为None,表示使用默认的边界线颜色。plotnonfinite: 控制是否绘制非有限数值的散点。默认为False,表示不绘制非有限数值的散点。data: 散点的数据。默认为None,表示没有数据。**kwargs: 其他可选参数,用于进一步控制散点的绘制。

散点图是数据点的集合,可以通过 scatter() 方法轻松创建:

x = np.random.rand(50)

y = np.random.rand(50)

colors = np.random.rand(50)

sizes = 1000 * np.random.rand(50)

plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')

plt.colorbar() # 显示颜色条

plt.show()

3.5 Images

imshow() 函数可以根据二维数组创建图像,这在处理图像数据时非常有用。

matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=, filternorm=1, filterrad=4.0, imlim=, resample=None, url=None, *, data=None, **kwargs)

主要参数含义如下:

X: 要显示的图像数据。可以是一个二维数组(灰度图像)或三维数组(彩色图像),也可以是PIL图像对象。cmap: 颜色映射(colormap)用于将数据值映射到颜色。默认为None,表示使用默认的颜色映射。常用的颜色映射有’viridis’、‘gray’、'jet’等。norm: 归一化对象,用于将数据值映射到[0, 1]区间。默认为None,表示不进行归一化。aspect: 图像的宽高比(宽度除以高度)。默认为None,表示使用默认的宽高比。interpolation: 插值方法,用于控制图像的显示效果。常用的插值方法有’nearest’(最近邻插值)、‘bilinear’(双线性插值)、‘bicubic’(双三次插值)等。alpha: 图像的透明度。默认为None,表示不透明。vmin、vmax: 数据值的最小值和最大值,用于控制颜色映射的范围。默认为None,表示使用数据的最小值和最大值。origin: 图像的原点位置。默认为None,表示原点在左上角。可选值为’upper’(原点在左上角)或’lower’(原点在左下角)。extent: 图像的坐标范围。默认为None,表示使用默认的坐标范围。shape: 图像的形状。默认为None,表示使用图像数据的形状。filternorm、filterrad: 控制图像的滤波器参数。默认的滤波器参数为1和4.0。imlim: 图像的显示限制。默认为None,表示使用默认的显示限制。resample: 图像的重采样方法。默认为None,表示使用默认的重采样方法。url: 图像的URL地址。默认为None,表示没有URL地址。data: 图像的数据。默认为None,表示没有数据。**kwargs: 其他可选参数,用于进一步控制图像的显示。

下面是一个简单的示例,展示如何使用 imshow() 显示一个随机矩阵:

# 创建一个随机矩阵并显示它

matrix_data = np.random.rand(100, 100)

plt.imshow(matrix_data, cmap='viridis', interpolation='nearest')

plt.colorbar()

plt.show()

4. Matplotlib 中的对象容器

Matplotlib 是一个 Python 2D 绘图库,可以生成发布质量级别的各种硬拷贝格式和交互式环境下的图形。通过 Matplotlib,我们可以生成条形图、散点图、直方图、饼图等。

本教程将介绍 Matplotlib 中对象容器相关的概念。

import matplotlib

import matplotlib.pyplot as plt

import numpy as np

4.1 对象容器 - Object Container

Matplotlib 使用一种对象容器层次结构来构建图表:Figure 对象是顶层容器,它包含了图表中的所有元素。在一个 Figure 对象中,可以包含一个或多个 Axes 对象。每个 Axes 对象又可以包含其他的对象如 Line2D、Text 等来绘制图表。

4.1.1 Figure 容器

Figure 是最顶层的容器,它包含了图表中的所有元素。在 Figure 中,我们可以创建一个或多个 Axes 对象。当我们向图表添加Figure.add_subplot()或者Figure.add_axes()元素时,这些都会被添加到Figure.axes列表中

# 创建一个 Figure 对象

fig = plt.figure()

# 添加 Axes 对象,占 Figure 的一定比例

# [left, bottom, width, height] 以 Figure 的比例定义

ax1 = fig.add_subplot(211) # 作一幅2*1的图,选择第1个子图

ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3]) # 位置参数,四个数分别代表了(left,bottom,width,height)

# 显示 Axes 对象,确保它们被添加进 Figure

print(fig.axes) # 输出:[, ]

## 由于Figure维持了current axes,因此你不应该手动的从Figure.axes列表中添加删除元素,而是要通过Figure.add_subplot()、Figure.add_axes()来添加元素,通过Figure.delaxes()来删除元素。但是你可以迭代或者访问Figure.axes中的Axes,然后修改这个Axes的属性。

## 比如下面的遍历axes里的内容,并且添加网格线:

fig = plt.figure()

ax1 = fig.add_subplot(311)

ax2 = fig.add_subplot(312)

ax3 = fig.add_subplot(313)

for ax in fig.axes:

ax.grid(True)

ax.plot(np.arange(100), np.random.randint(0,10,100))

ax.set_ylim(0, 10)

4.1.2 Axes 容器

Axes 是图表的主要部分,几乎所有的图形元素都是在它的基础上创建的。Axes 包含了许多辅助方法来创建和添加图形元素(Artist 对象)。

# 创建一个包含 Axes 的 Figure

fig, ax = plt.subplots()

# 设置 Axes 的背景颜色

ax.set_facecolor('lightgray')

# 在 Axes 上绘制简单的线条图

ax.plot([1, 2, 3, 4], [1, 4, 2, 3])

plt.show()

Subplot就是一个特殊的Axes,其实例是位于网格中某个区域的Subplot实例。其实你也可以在任意区域创建Axes,通过Figure.add_axes([left,bottom,width,height])来创建一个任意区域的Axes,其中left,bottom,width,height都是[0—1]之间的浮点数,他们代表了相对于Figure的坐标。

另外Axes还包含两个最重要的Artist container:

ax.xaxis:XAxis对象的实例,用于处理x轴tick以及label的绘制 ax.yaxis:YAxis对象的实例,用于处理y轴tick以及label的说明。

4.1.3 Axis 容器

Axis 对象处理图表的轴,包括刻度线、刻度标签、网格线等。每个 Axes 对象都有两个 Axis 对象:xaxis 和 yaxis。

# 创建一个包含 Axes 的 Figure

fig, ax = plt.subplots()

# 获取 Axes 对象的 xaxis 属性

xaxis = ax.xaxis

# 设置刻度标签的格式

xaxis.set_major_formatter(matplotlib.ticker.FormatStrFormatter('%0.1f'))

# 开启网格线

ax.grid(True)

ax.plot([1, 2, 3, 4], [1, 4, 2, 3])

plt.show()

axis = ax.xaxis # axis为X轴对象

print(axis.get_ticklocs()) # 获取刻度线位置

print(axis.get_ticklabels()) # 获取刻度label列表(一个Text实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick label。

print(axis.get_ticklines()) # 获取刻度线列表(一个Line2D实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick line。

print(axis.get_data_interval())# 获取轴刻度间隔

fig = plt.figure() # 创建一个新图表

ax1 = fig.add_axes([0.1, 0.3, 0.4, 0.4]) # 创一个axes对象,从(0.1,0.3)的位置开始,宽和高都为0.4,

for label in ax1.xaxis.get_ticklabels():

# 调用x轴刻度标签实例,是一个text实例

label.set_color('red') # 颜色

label.set_rotation(45) # 旋转角度

label.set_fontsize(16) # 字体大小

for line in ax1.yaxis.get_ticklines():

# 调用y轴刻度线条实例, 是一个Line2D实例

line.set_markeredgecolor('green') # 颜色

line.set_markersize(25) # marker大小

line.set_markeredgewidth(2)# marker粗细

4.1.4 Tick 容器

Tick 对象是 Axis 中的最小单位,包含刻度线、网格线和刻度标签。

fig, ax = plt.subplots()

ax.plot(100*np.random.rand(20))

# 设置ticker的显示格式

formatter = matplotlib.ticker.FormatStrFormatter('$%1.2f')

ax.yaxis.set_major_formatter(formatter)

# 设置ticker的参数,右侧为主轴,颜色为绿色

ax.yaxis.set_tick_params(which='major', labelcolor='green',

labelleft=False, labelright=True);

5. Matplotlib 中的布局

在本教程中,我们将探索 Matplotlib 的一些核心功能,并通过示例来演示如何创建和自定义各种图表。

[!NOTE]

提前安装SimHei字体:https://us-logger1.oss-cn-beijing.aliyuncs.com/SimHei.ttf

安装后删除Matplotlib的字体缓存,matplotlib.get_cachedir() 获取缓存目录

# 导入所需的库

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

# 设置 Matplotlib 参数以支持中文和负号显示

plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体以支持中文显示

plt.rcParams['axes.unicode_minus'] = False # 设置正常显示负号

5.1 子图布局策略

5.1.1 均匀子图布局

使用 plt.subplots 可以快速地创建一个子图网格。这是创建多个子图的便捷方法,每个子图位置都是均匀分布的。

# 创建一个 2x5 的子图网格

fig, axs = plt.subplots(2, 5, figsize=(10, 4), sharex=True, sharey=True)

fig.suptitle('均匀子图布局', size=20)

# 在每个子图上绘制散点图

for i in range(2):

for j in range(5):

axs[i, j].scatter(np.random.randn(10), np.random.randn(10))

axs[i, j].set_title(f'第{i+1}行,第{j+1}列')

axs[i, j].set_xlim(-5, 5)

axs[i, j].set_ylim(-5, 5)

# if i == 1: axs[i, j].set_xlabel('横坐标')

# if j == 0: axs[i, j].set_ylabel('纵坐标')

axs[i, j].set_xlabel('横坐标')

axs[i, j].set_ylabel('纵坐标')

# 调整布局以防止重叠

fig.tight_layout(rect=[0, 0.03, 1, 0.95])

# fig.tight_layout() 方法会自动调整子图参数,使之填充整个图像区域,这样可以避免子图之间的标题和标签重叠。

5.1.2 非均匀子图布局

使用 GridSpec 创建非均匀子图

GridSpec 允许更灵活的子图布局。你可以指定每行和每列的相对大小。

# 使用 GridSpec 创建非均匀子图

fig = plt.figure(figsize=(10, 4))

spec = fig.add_gridspec(nrows=2, ncols=5, width_ratios=[1, 2, 3, 4, 5], height_ratios=[1, 3])

fig.suptitle('非均匀子图布局', size=20)

# 创建并填充子图

for i in range(2):

for j in range(5):

ax = fig.add_subplot(spec[i, j])

ax.scatter(np.random.randn(10), np.random.randn(10))

ax.set_title(f'第{i+1}行,第{j+1}列')

if i == 1: ax.set_xlabel('横坐标')

if j == 0: ax.set_ylabel('纵坐标')

# 调整布局

fig.tight_layout(rect=[0, 0.03, 1, 0.95])

子图合并

GridSpec 也支持子图的合并。通过切片,你可以跨多行或多列合并子图。

# 创建一个新的 figure

fig = plt.figure(figsize=(10, 4))

spec = fig.add_gridspec(nrows=2, ncols=6, width_ratios=[2, 2.5, 3, 1, 1.5, 2], height_ratios=[1, 2])

fig.suptitle('子图合并示例', size=20)

# 创建合并后的子图

ax1 = fig.add_subplot(spec[0, :3])

ax1.scatter(np.random.randn(10), np.random.randn(10))

ax1.set_title('合并前三列')

ax2 = fig.add_subplot(spec[0, 3:5])

ax2.scatter(np.random.randn(10), np.random.randn(10))

ax2.set_title('合并第四和第五列')

ax3 = fig.add_subplot(spec[:, 5])

ax3.scatter(np.random.randn(10), np.random.randn(10))

ax3.set_title('合并行')

ax4 = fig.add_subplot(spec[1, 0])

ax4.scatter(np.random.randn(10), np.random.randn(10))

ax4.set_title('第二行第一列')

ax5 = fig.add_subplot(spec[1, 1:5])

ax5.scatter(np.random.randn(10), np.random.randn(10))

ax5.set_title('合并第二行第二到第五列')

# 调整布局

fig.tight_layout(rect=[0, 0.03, 1, 0.95])

5.1.4 增强子图上的方法

绘制参考线

在子图上绘制参考线可以帮助分析数据。

fig, ax = plt.subplots(figsize=(4, 3))

ax.axhline(y=0.5, xmin=0.2, xmax=0.8, color='red', linestyle='--')

ax.axvline(x=0.5, ymin=0.2, ymax=0.8, color='blue', linestyle='-.')

ax.axline([0.3, 0.3], [0.7, 0.7], color='green', linestyle=':');

ax.set_title('绘制参考线')

添加网格

网格可以帮助我们估计图表中的数值。

fig, ax = plt.subplots(figsize=(4, 3))

ax.grid(True)

ax.set_title('添加网格')

设置坐标轴的规度

改变坐标轴的规度可以更好地展示数据的分布。

fig, axs = plt.subplots(1, 2, figsize=(10, 4))

# 对数坐标轴

axs[0].plot(list('abcd'), [10**i for i in range(4)])

axs[0].set_yscale('log')

axs[0].set_title('对数坐标轴')

# 线性坐标轴

axs[1].plot(list('abcd'), [10**i for i in range(4)])

axs[1].set_title('线性坐标轴')

fig.tight_layout()

6.Matplotlib 中的文字与图例

6.1 Figure 和 Axes 上的文本

在 Matplotlib 中,文本的显示不仅仅局限于基本的标签和标题。Matplotlib 提供了丰富的文本显示功能,包括对数学表达式的支持、TrueType 字体的栅格和矢量输出、可任意旋转的换行文本,以及对 Unicode 字符的支持。

import matplotlib

import matplotlib.pyplot as plt

import numpy as np

import matplotlib.dates as mdates

import datetime

文本 API 示例

Matplotlib 中创建文本的方式可以通过 pyplot API 或面向对象的 API 来实现。下面我们将介绍这两种方式。

6.1.1 Pyplot API vs. OO API

函数Pyplot APIOO API描述文本添加texttext在子图 Axes 的任意位置添加文本注解添加annotateannotate在子图 Axes 的任意位置添加注解,通常带有箭头X 轴标签xlabelset_xlabel为子图 Axes 添加 X 轴标签Y 轴标签ylabelset_ylabel为子图 Axes 添加 Y 轴标签标题添加titleset_title为子图 Axes 添加标题画布文本figtexttext在整个画布 Figure 的任意位置添加文本画布标题suptitlesuptitle为整个画布 Figure 添加标题

接下来,我们通过一个综合的例子来展示这些 API 如何在一个图像中控制不同部分的文本。在后续的章节中,我们将更详细地分析这些 API 的使用技巧。

fig = plt.figure()

ax = fig.add_subplot()

# 为 Figure 和 Axes 设置标题,注意两者的位置区别

fig.suptitle('Bold Figure Suptitle', fontsize=14, fontweight='bold')

ax.set_title('Axes Title')

# 设置 X 和 Y 轴标签

ax.set_xlabel('X Label')

ax.set_ylabel('Y Label')

# 设置 X 和 Y 轴显示范围

ax.axis([0, 10, 0, 10])

# 在 Axes 上添加文本

ax.text(3, 8, 'Boxed Italics Text in Data Coords', style='italic',

bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})

# 在 Figure 上添加文本,通常更常见的是在 Axes 上添加文本

fig.text(0.4, 0.8, 'Figure Text')

ax.plot([2], [1], 'o')

# 添加注解

ax.annotate('Annotation', xy=(2, 1), xytext=(3, 4),

arrowprops=dict(facecolor='black', shrink=0.05));

6.1.2 text - 在 Axes 上添加文本

text 方法的调用格式为 Axes.text(x, y, s, fontdict=None, **kwargs),其中:

x, y 是文本出现的坐标位置。s 是文本内容。fontdict 是一个可选参数,用于覆盖默认的文本属性。**kwargs 是关键字参数,用于传入文本样式参数。

fontdict 和 **kwargs 都可以用于调整文本样式。这两种方式的最终效果相同,并且这不仅适用于 text 方法,其他文本相关的方法如 set_xlabel, set_title 等也可以使用这两种方式来修改样式。下面的例子演示了如何使用这两种方式。

fig = plt.figure(figsize=(10, 3))

axes = fig.subplots(1, 2)

# 使用关键字参数修改文本样式

axes[0].text(0.3, 0.8, 'Modified by **kwargs', style='italic',

bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})

# 使用 fontdict 参数修改文本样式

font = {'style': 'italic', 'bbox': {'facecolor': 'red', 'alpha': 0.5, 'pad': 10}}

axes[1].text(0.3, 0.8, 'Modified by fontdict', fontdict=font)

Matplotlib 支持的所有文本样式参数可以在官方文档中找到。通常在需要时查询即可。下表列举了一些常用的参数供参考:

属性名描述alpha透明度,值越小越透明,值越大越不透明backgroundcolor文本的背景颜色bbox设置文本周围的边框属性color 或 c字体颜色fontfamily 或 family字体类型,如 ‘serif’, ‘sans-serif’fontsize 或 size字体大小,可以是绝对值或相对大小,如 ‘small’, ‘medium’fontstyle 或 style字体样式,如 ‘normal’, ‘italic’, ‘oblique’fontweight 或 weight字体粗细,如 ‘normal’, ‘bold’, ‘heavy’horizontalalignment 或 ha文本水平对齐方式,如 ‘center’, ‘right’, ‘left’linespacing行间距,为字体大小的倍数rotation文本旋转角度,如 ‘vertical’, ‘horizontal’ 或具体数值verticalalignment 或 va文本垂直对齐方式,如 ‘center’, ‘top’, ‘bottom’

6.1.3 xlabel 和 ylabel - 子图的 X,Y 轴标签

xlabel 和 ylabel 方法分别用于添加 X 轴和 Y 轴标签。这里以 xlabel 为例,其调用方式为 Axes.set_xlabel(xlabel, fontdict=None, labelpad=None, loc=None, **kwargs),其中:

xlabel 是标签内容。fontdict 和 **kwargs 用来修改样式,参考上一小节。labelpad 是标签和坐标轴的距离,默认为 4。loc 为标签位置,可选值为 ‘left’, ‘center’, ‘right’,默认为 ‘center’。

# 观察 labelpad 和 loc 参数的使用效果

fig = plt.figure(figsize=(10, 6))

axes = fig.subplots(1, 2)

axes[0].set_xlabel('X Label', labelpad=20, loc='left')

# loc 参数仅提供粗略的位置调整,如果想要更精确的设置标签位置,可以使用 position 参数配合 horizontalalignment 参数

axes[1].set_xlabel('X Label', position=(0.2, _), horizontalalignment='left')

6.1.4 title 和 suptitle - 子图和画布的标题

title 方法用于为子图 Axes 添加标题,调用方式为 Axes.set_title(label, fontdict=None, loc=None, pad=None, **kwargs),其中:

label 是标题内容。pad 是标题与图表顶部的距离,默认为 6。y 是标题在子图垂直方向上的位置,默认值为 1,即位于子图顶部。

suptitle 方法用于为整个画布 Figure 添加标题,调用方式为 Figure.suptitle(t, **kwargs),其中 t 是标题内容。

# 观察 pad 参数的使用效果

fig = plt.figure(figsize=(10, 3))

fig.suptitle('Figure Title', y=1.2) # 通过参数 y 调整标题高度

axes = fig.subplots(1, 2)

axes[0].set_title('Title with Pad', pad=15)

axes[1].set_title('Title with Default Pad', pad=6)

6.1.5 annotate - 子图的注解

annotate 方法用于在 Axes 上添加注解,调用方式为 Axes.annotate(text, xy, *args, **kwargs),其中:

text 是注解内容。xy 是注解箭头指向的坐标。xytext 是注解文本的坐标(可选)。xycoords 和 textcoords 分别定义 xy 和 xytext 的坐标系(可选)。arrowprops 定义箭头样式(可选)。

注解的参数非常丰富,这里仅展示一个简单的例子,更多参数可以参考官方文档。

fig = plt.figure()

ax = fig.add_subplot()

ax.annotate("Annotation",

xy=(0.2, 0.2), xycoords='data',

xytext=(0.8, 0.8), textcoords='data',

arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=0.2"))

6.1.6 字体的属性设置

在 Matplotlib 中,字体的设置既可以全局进行,也可以针对局部进行。全局设置会影响所有的图表,而局部设置只影响特定的文本元素。

全局字体设置

全局字体设置可以通过修改 rcParams 来实现,例如:

plt.rcParams['font.sans-serif'] = ['SimSun'] # 设置默认字体为 SimSun。

plt.rcParams['axes.unicode_minus'] = False # 解决负号 '-' 显示为方块的问题。

局部字体设置

局部设置一般在绘制文本时直接指定,例如:

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

plt.plot(x, label='示例图标签')

plt.xlabel('X 轴名称', fontproperties='Microsoft YaHei', fontsize=16) # 设置 X 轴名称,采用微软雅黑字体

plt.ylabel('Y 轴名称', fontproperties='Microsoft YaHei', fontsize=14) # 设置 Y 轴名称

plt.title('坐标系标题', fontproperties='Microsoft YaHei', fontsize=20) # 设置坐标系标题字体

plt.legend(loc='lower right', prop={'family': 'Microsoft YaHei'}, fontsize=10) # 设置图例字体

6.2 Tick 上的文本

设置刻度(tick)和刻度标签(ticklabel)是可视化过程中常见的操作。Matplotlib 提供了多种方式来自定义这些元素,既可以手动设置,也可以使用自动生成的模式。

简单模式

可以使用 set_ticks 方法手动设置刻度位置,使用 set_ticklabels 方法手动设置刻度标签。

x1 = np.linspace(0.0, 5.0, 100)

y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)

# 手动设置刻度位置的例子

fig, axs = plt.subplots(2, 1, figsize=(5, 3), tight_layout=True)

axs[0].plot(x1, y1)

axs[1].plot(x1, y1)

axs[1].xaxis.set_ticks(np.arange(0., 10.1, 2.))

plt.show()

# 手动设置刻度标签的例子

fig, axs = plt.subplots(2, 1, figsize=(5, 3), tight_layout=True)

axs[0].plot(x1, y1)

axs[1].plot(x1, y1)

ticks = np.arange(0., 8.1, 2.)

tick_labels = [f'{tick:1.2f}' for tick in ticks]

axs[1].xaxis.set_ticks(ticks)

axs[1].xaxis.set_ticklabels(tick_labels)

plt.show()

Tick Formatters

除了简单模式,还可以使用 Formatters 来设置刻度位置和格式。这提供了更高的灵活性,尤其是在处理复杂的数据格式时。

# 使用字符串格式设置刻度格式的例子

fig, axs = plt.subplots(2, 2, figsize=(8, 5), tight_layout=True)

for n, ax in enumerate(axs.flat):

ax.plot(x1 * 10., y1)

formatter = matplotlib.ticker.FormatStrFormatter('%1.1f')

axs[0, 1].xaxis.set_major_formatter(formatter)

formatter = matplotlib.ticker.FormatStrFormatter('-%1.1f')

axs[1, 0].xaxis.set_major_formatter(formatter)

formatter = matplotlib.ticker.FormatStrFormatter('%1.5f')

axs[1, 1].xaxis.set_major_formatter(formatter)

plt.show()

# 使用函数设置刻度格式的例子

def format_odd_ticks(x, pos):

"""Format odd tick positions."""

if x % 2:

return f'{x:1.2f}'

else:

return "@"

fig, ax = plt.subplots(figsize=(5, 3), tight_layout=True)

ax.plot(x1, y1)

ax.xaxis.set_major_formatter(format_odd_ticks);

6.3 Legend(图例)

在 Matplotlib 中,图例是用来辨识各种图形元素的关键工具。图例由多个条目组成,每个条目由一个 key(图例键)和一个 label(图例标签)组成。

fig, ax = plt.subplots()

line_up, = ax.plot([1, 2, 3], label='Line Up')

line_down, = ax.plot([3, 2, 1], label='Line Down')

ax.legend(handles=[line_up, line_down], labels=['Line Up', 'Line Down'])

plt.show()

设置图例位置

loc 参数可以是一个字符串或数字,表示图例的位置。

fig, axes = plt.subplots(1, 4, figsize=(10, 4))

for i in range(4):

axes[i].plot([0.5], [0.5])

axes[i].legend(labels='a', loc=i) # 观察 loc 参数传入不同值时图例的位置

fig.tight_layout()

设置图例边框及背景

fig = plt.figure(figsize=(10, 3))

axes = fig.subplots(1, 3)

for i, ax in enumerate(axes):

ax.plot([1, 2, 3], label=f'ax {i}')

axes[0].legend(frameon=False) # 去掉图例边框

axes[1].legend(edgecolor='blue') # 设置图例边框颜色

axes[2].legend(facecolor='gray'); # 设置图例

7.Matplotlib样式教程

在本教程中,我们将探讨如何使用Matplotlib库中的样式和颜色功能来美化我们的图表。一个图表的外观对于传达信息和吸引观众的注意力至关重要。Matplotlib提供了多种方式来自定义图表的样式和颜色。

7.1 Matplotlib绘图样式

Matplotlib提供了多种预定义的样式,它们可以帮助我们快速改变图表的外观。此外,我们还可以自定义样式或直接修改rcParams来调整更细节的样式设置。

7.1.1 使用预定义样式

Matplotlib内置了一系列预定义的样式,我们可以通过简单的命令来使用它们。下面是如何应用默认样式和ggplot样式的例子:

import matplotlib.pyplot as plt

import numpy as np

import matplotlib as mpl

# 使用默认样式

plt.style.use('default')

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

plt.show()

# 使用ggplot样式

plt.style.use('ggplot')

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

plt.show()

Matplotlib提供了多种样式供我们选择,你可以通过以下代码查看所有可用的样式:

print(plt.style.available)

# ['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-v0_8', 'seaborn-v0_8-bright', 'seaborn-v0_8-colorblind', 'seaborn-v0_8-dark', 'seaborn-v0_8-dark-palette', 'seaborn-v0_8-darkgrid', 'seaborn-v0_8-deep', 'seaborn-v0_8-muted', 'seaborn-v0_8-notebook', 'seaborn-v0_8-paper', 'seaborn-v0_8-pastel', 'seaborn-v0_8-poster', 'seaborn-v0_8-talk', 'seaborn-v0_8-ticks', 'seaborn-v0_8-white', 'seaborn-v0_8-whitegrid', 'tableau-colorblind10']

7.1.2 自定义样式表

我们可以创建一个.mplstyle文件来定义自己的样式规则。例如,创建一个名presentationle.mplstyle的文件,并写入以下样式规则:

axes.titlesize : 24

axes.labelsize : 20

lines.linewidth : 3

lines.markersize : 10

xtick.labelsize : 16

ytick.labelsize : 16

然后,我们可以这样使用自定义的样式:

plt.style.use('presentation.mplstyle')

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

plt.show()

7.1.3 混合样式

Matplotlib允许我们混合多个样式。如果有冲突的设置,后面的样式设置将覆盖前面的。

plt.style.use(['Solarize_Light2', 'presentation.mplstyle'])

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

plt.show()

7.1.4 直接修改rcParams

我们可以通过修改matplotlib.rcParams来直接设置样式参数。这对于临时更改或者编程式的样式调整非常有用:

plt.style.use(['Solarize_Light2', 'presentation.mplstyle'])

mpl.rcParams['lines.linewidth'] = 2

mpl.rcParams['lines.linestyle'] = '--'

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

plt.show()

或者使用mpl.rc函数来一次性修改多个设置:

plt.style.use(['Solarize_Light2', 'presentation.mplstyle'])

mpl.rc('lines', linewidth=4, linestyle='-.')

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

plt.show()

7.2 Matplotlib颜色设置

颜色是可视化中的关键元素之一。合适的颜色选择可以帮助我们更好地传达信息。Matplotlib提供了多种方法来指定颜色。

7.2.1 RGB 或 RGBA

# 使用RGB元组设置颜色,可选地添加alpha值表示透明度

plt.plot([1, 2, 3], [4, 5, 6], color=(0.1, 0.2, 0.5), linestyle='-.', linewidth=4)

plt.plot([4, 5, 6], [1, 2, 3], color=(0.1, 0.2, 0.5, 0.5), linestyle='-.', linewidth=4)

plt.show()

7.2.2 十六进制颜色

# 使用十六进制颜色码,可选地添加透明度

plt.plot([1,2,3],[4,5,6], color='#0f0f0f')

plt.plot([4,5,6],[1,2,3], color='#0f0f0f80')

plt.show()

7.2.3 灰度色阶

# 使用一个0到1之间的浮点数表示灰度值

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

plt.plot(x, x, label='linear', color='0.5')

plt.plot(x, x**2, label='quadratic', color='0')

plt.legend()

plt.show()

7.2.4 基本颜色缩写

# 使用单字符颜色缩写

plt.plot([1,2,3],[4,5,6], color='m') # 'm' 代表洋红色(magenta)

plt.show()

7.2.5 颜色名称

# 使用完整的颜色名称

plt.plot([1,2,3],[4,5,6], color='tan')

plt.show()

7.2.6 使用Colormap

在matplotlib中,Colormap用于为数据点指定一组颜色,colormap共有五种类型:

顺序(Sequential)。通常使用单一色调,逐渐改变亮度和颜色渐渐增加,用于表示有顺序的信息发散(Diverging)。改变两种不同颜色的亮度和饱和度,这些颜色在中间以不饱和的颜色相遇;当绘制的信息具有关键中间值(例如地形)或数据偏离零时,应使用此值。循环(Cyclic)。改变两种不同颜色的亮度,在中间和开始/结束时以不饱和的颜色相遇。用于在端点处环绕的值,例如相角,风向或一天中的时间。定性(Qualitative)。常是杂色,用来表示没有排序或关系的信息。杂色(Miscellaneous)。一些在特定场景使用的杂色组合,如彩虹,海洋,地形等。

# 创建一些数据

x = np.random.randn(100)

y = np.random.randn(100)

z = np.random.rand(100) * 100 # 用于颜色映射的数据

# 创建一个figure,包含5个subplot

fig, ax = plt.subplots(1, 5, figsize=(20, 4))

# 顺序(Sequential)

s_mappable = ax[0].scatter(x, y, c=z, cmap='Blues')

fig.colorbar(s_mappable, ax=ax[0])

ax[0].set_title('Sequential')

# 发散(Diverging)

d_mappable = ax[1].scatter(x, y, c=z, cmap='RdBu')

fig.colorbar(d_mappable, ax=ax[1])

ax[1].set_title('Diverging')

# 循环(Cyclic)

c_mappable = ax[2].scatter(x, y, c=z, cmap='twilight')

fig.colorbar(c_mappable, ax=ax[2])

ax[2].set_title('Cyclic')

# 定性(Qualitative)

# 注意:定性colormap不适合用于连续数据的颜色映射,这里仅作演示

q_mappable = ax[3].scatter(x, y, c=np.random.randint(0, 10, 100), cmap='Set1')

fig.colorbar(q_mappable, ax=ax[3])

ax[3].set_title('Qualitative')

# 杂色(Miscellaneous)

m_mappable = ax[4].scatter(x, y, c=z, cmap='terrain')

fig.colorbar(m_mappable, ax=ax[4])

ax[4].set_title('Miscellaneous')

# 调整子图间距

plt.tight_layout()

plt.show()

Matplotlib提供了多种colormap,可以在Matplotlib官方文档中查看。

身高158标准体重是多少
逆战耐久度解析:计算方式、使用技巧及与永久武器区别