【基本工具】S02E21 matplotlib数据可视化之坐标轴与主次刻度用法详解

0.本集概览

1.剖析plt和坐标轴对象ax的关系
2.主刻度与次刻度的概念
3.格式生成器与定位器的概念
4.数值型主次刻度与自定义格式生成器函数举例
5.日期型主次刻度举例

这一集,我们专门来谈谈坐标轴的有关内容。

1.plt和坐标轴对象ax的关系

先看以下两段代码,他们实现的是同样的功能:绘制正余弦两个子图:

代码一:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10,1000)
plt.subplot(2, 1, 1)     
plt.plot(x, np.sin(x))   #用plt绘制第一个子图
plt.subplot(2,1,2)       
plt.plot(x,np.cos(x))    #用plt绘制第二个子图
plt.show()

代码二:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10,1000)
fig, ax = plt.subplots(2,1)
ax[0].plot(x, np.sin(x)) #用对应的坐标轴对象画第一个子图
ax[1].plot(x, np.cos(x)) #用对应的坐标轴对象画第二个子图
plt.show()

可以看出,这两段代码所达到的效果是一样的。代码段一采用的是MATLAB风格的接口,这是由于Matplotlib最初是作为MATLAB替代品的历史缘故。MATLAB风格的工具位于pyplot 即plt接口中,因此我们可以采用plt.plot函数来进行绘图。这种接口最重要的特征就是“有状态”:他表征当前所位于的子图状态,并持续跟踪当前的图形和坐标轴。并可以通过plt.gcf()获取当前的活动Figure对象,利用plt.gca()获取当前活动的axes坐标轴对象。

代码段二所采用的是完全不同的第二种模式,即面向对象接口,他在绘图的过程之中不再受到当前所谓“活动”图形及坐标轴的限制,因为他一次性就从subplots函数中获取了表征所有坐标轴的ax数组和Figure对象。

补充一点,坐标轴对象ax包含了横轴、纵轴所包围的区域内的一切(各坐标轴、刻度、标签、图形等)

我最后来说说plt和ax二者的联系,plt的绝大多数方法都有ax的对应版本,有的一模一样,有的稍作改变:

plt.plot() = ax.plot()
plt.legend() = ax.legend()
plt.xlabel()/ylabel()/xlim()/ylim()/title() = 
ax.setxlabel()/setylabel()/setxlim()/set_ylim()/set_title()

当然,如果用ax来设置这些参数的话,可以放在一个函数中,用多个关键字进行表征和设置

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10,1000)
ax = plt.axes()
ax.plot(x,np.sin(x))
ax.set(xlim=(0,10), ylim=(-2,2), xlabel='x', ylabel='sin(x)',title='plot sin(x)')
plt.show()

值得一提的是,在代码段一中我们还可以通过ax = plt.subplot(2, 1, 1)或ax = plt.gca()这两种方法来获得当前的坐标轴对象ax。

2.主刻度与次刻度的概念

强化了坐标轴ax的概念之后,我们再进入今天另一个重要的话题,坐标轴的主次刻度。

每一个坐标轴都有主要刻度线与次要刻度线。主要刻度更大更显著,而次要刻度往往更小。主刻度都显示为一个较大的刻度线和标签,而次要刻度都显示为一个较小的刻度线,而不显示标签。主次刻度这件事儿,大家想想我们用过的尺子就知道了,厘米的地方刻度要长而明显,并且有数字标识,而毫米的地方刻度则要短,并且没有数字标识。这么做既能满足刻度线的完整性,又能突出刻度标识的重点。

我们先举一个例子:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

fig = plt.figure()

xmajorLocator = MultipleLocator(20)  # 将x主刻度标签设置为20的倍数
xmajorFormatter = FormatStrFormatter('%1.1f')  # 设置x轴标签文本的格式
xminorLocator = MultipleLocator(5)  # 将x轴次刻度标签设置为5的倍数

ymajorLocator = MultipleLocator(0.5)  # 将y轴主刻度标签设置为0.5的倍数
ymajorFormatter = FormatStrFormatter('%1.1f')  # 设置y轴标签文本的格式
yminorLocator = MultipleLocator(0.1)  # 将此y轴次刻度标签设置为0.1的倍数

ax = plt.subplot(111)
ax.xaxis.set_major_locator(xmajorLocator)
ax.xaxis.set_major_formatter(xmajorFormatter)

ax.yaxis.set_major_locator(ymajorLocator)
ax.yaxis.set_major_formatter(ymajorFormatter)

# 显示次刻度标签的位置,没有标签文本
ax.xaxis.set_minor_locator(xminorLocator)
ax.yaxis.set_minor_locator(yminorLocator)

ax.xaxis.grid(True, which='major')  # x坐标轴的网格使用主刻度
ax.yaxis.grid(True, which='minor')  # y坐标轴的网格使用次刻度

t = np.arange(100)
s = np.sin(0.1*np.pi*t)*np.exp(-t*0.01)
plt.plot(t,s,'--r*')

plt.show()

这个例子中,我们设置了主刻度线和次刻度线,其中x轴主刻度线是20的整数倍,并且标明了刻度值,而次要刻度线是5的整数倍,省去了刻度值。y轴同理。

3.格式生成器与定位器

这里的核心是定位器和格式生成器两个概念,我们先分别生成X轴的主定位器、主格式生成器,再生成X轴的次定位器(由于X轴次要坐标没有刻度值,所以省去了次要格式生成器)

然后再利用坐标轴ax的xaxis.set_major_locator、xaxis.set_major_formatter和xaxis.set_minor_locator方法,分别对定位器和格式生成器进行赋值。

总结一下:我们就是通过定义每个坐标轴的locator和formatter对象,来完成刻线位置和标签这些属性的设置。

top Created with Sketch.