Matplotlib 坐标轴变换技术

Beginner

This tutorial is from open-source community. Access the source code

简介

Matplotlib 是一个用于数据可视化的 Python 库。它允许用户创建各种各样的图表、绘图和图形。Matplotlib 的一个关键特性是它能够对坐标轴应用比例变换。这在呈现数据时提供了更大的灵活性,特别是在处理非常大或非常小的数字时。在本实验中,我们将学习如何使用 Matplotlib 对坐标轴应用各种比例变换。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库并生成数据

首先,我们需要导入必要的库并生成一些要绘制的数据。在这个例子中,我们将使用正态分布来生成 y 轴的数据。

import matplotlib.pyplot as plt
import numpy as np

## Fixing random state for reproducibility
np.random.seed(19680801)

## make up some data in the interval ]0, 1[
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))

创建线性比例图

我们要探索的第一种比例变换类型是线性比例。这是 Matplotlib 中使用的默认比例。要创建线性比例图,我们使用 set_yscale() 方法并传入字符串 'linear'。我们还会给图添加标题和网格。

## linear
plt.plot(x, y)
plt.yscale('linear')
plt.title('Linear Scale')
plt.grid(True)

创建对数比例图

我们接下来要探索的比例变换类型是对数比例。要创建对数比例图,我们使用 set_yscale() 方法并传入字符串 'log'。我们同样会给图添加标题和网格。

## log
plt.plot(x, y)
plt.yscale('log')
plt.title('Logarithmic Scale')
plt.grid(True)

创建对称对数比例图

我们要探索的第三种比例变换类型是对称对数比例。当处理包含正值和负值的数据时,这种比例类型很有用。要创建对称对数比例图,我们使用 set_yscale() 方法并传入字符串 'symlog'。我们还将 linthresh 参数设置为 0.02,以指定零值附近将进行线性缩放的值范围。我们同样会给图添加标题和网格。

## symmetric log
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthresh=0.02)
plt.title('Symmetrical Logarithmic Scale')
plt.grid(True)

创建对数几率比例图

我们要探索的第四种比例变换类型是对数几率(logit)比例。当处理取值范围在 0 到 1 之间的数据时,这种比例类型很有用。要创建对数几率比例图,我们使用 set_yscale() 方法并传入字符串 'logit'。我们还会给图添加标题和网格。

## logit
plt.plot(x, y)
plt.yscale('logit')
plt.title('Logit Scale')
plt.grid(True)

创建自定义比例图

我们要探索的最后一种比例变换类型是自定义比例。这使我们能够为比例变换定义自己的正向和反向函数。在这个例子中,我们将定义一个自定义函数来对数据取平方根。要创建自定义比例图,我们使用 set_yscale() 方法并传入字符串 'function'。我们还定义 forward()inverse() 函数,并将它们作为参数传递给 functions 参数。我们同样会给图添加标题和网格。

## Function x**(1/2)
def forward(x):
    return x**(1/2)

def inverse(x):
    return x**2

plt.plot(x, y)
plt.yscale('function', functions=(forward, inverse))
plt.title('Custom Scale')
plt.grid(True)

创建墨卡托变换比例图

作为额外内容,我们还将使用墨卡托变换函数创建一个图。这不是 Matplotlib 中的内置函数,但我们可以定义自己的正向和反向函数来创建墨卡托变换比例图。在这个例子中,我们将为墨卡托变换定义 forward()inverse() 函数。我们还会给图添加标题和网格。

## Function Mercator transform
def forward(a):
    a = np.deg2rad(a)
    return np.rad2deg(np.log(np.abs(np.tan(a) + 1.0 / np.cos(a))))

def inverse(a):
    a = np.deg2rad(a)
    return np.rad2deg(np.arctan(np.sinh(a)))

t = np.arange(0, 170.0, 0.1)
s = t / 2.

plt.plot(t, s, '-', lw=2)
plt.yscale('function', functions=(forward, inverse))
plt.title('Mercator Transform Scale')
plt.grid(True)
plt.xlim([0, 180])

总结

在本实验中,我们学习了如何使用 Matplotlib 对坐标轴应用各种比例变换。我们探索了线性、对数、对称对数、对数几率、自定义和墨卡托变换比例变换。通过应用这些比例变换,我们可以更好地可视化包含非常大或非常小数字的数据,以及包含正值和负值的数据。