前面我们学习过坐标轴显示数字、显示弧度、显示角度、显示日期,如果还想自己搞一些特殊的标签显示,又需要怎么办呢?本文将通过例子来演示怎么样实现这样的功能。另外,也需要考虑坐标轴上显示刻度的数量,有时候数据比较大,如果自动显示会显示很多刻度,导致坐标轴比较拥挤,又或者想多显示一些刻度。如果你有这样的需求,就继续看本文。
首先来解决第一个问题,就是怎么样个性地显示刻度上的标签。如果你学习前面的文章,会发现弧度显示的代码,就是一种个性化显示,当时没有深入地去解释,现在才有机会来说明这个问题。我们知道坐标轴上刻度的标签,默认定义就是数值显示,这是大多数情况下的适用的,但是有时候我们需要显示的不是数值,而是一种阶段性的提示文本。沿着这个方向去思考,那么我们只要寻找到一个方法,能把数值转换为文本字符串,那么问题就可以解决了。比如坐标显示的是1、2、3,只要修改为s1、s2、s3,就可以解决问题了。之前已经学习过使用函数ax.xaxis.set_major_formatter()来设置格式化字符串,就可以日期显示的问题,现在再按这样的方式行吗?可以肯定说:不行。还是使用这个函数,但是需要使用另外一种方式,就是设置格式化函数,而不是格式化字符串,因为这个函数定义有两种方式:
Axis.set_major_formatter(self, formatter)
formatter参数是可以一个格式化字符串,或者一个格式化函数。
格式化字符串在前面已经学习过了,现在来学习怎么样设置格式化函数,这个格式化函数有一定的要求的,不是什么函数都可以放进去,要求定义的函数如下:
The function should take in two inputs (a tick value ``x`` and a
position ``pos``), and return a string containing the corresponding
tick label.
"""
意思就是说这个函数需要接收两个参数,第一个参数x是刻度位置所表示的数值,第二个参数pos是刻度所在位置的坐标值。大体就是这样:
def rad_fn(x, pos=None):
定义函数名称rad_fn,x是表示数据的值,pos是位置所在的内部画图的坐标值。
学习到这点知识之后,我们就可以解决格式化函数的问题,因此定义一个格式化函数如下:
def tick_c(v, p):
if int(v) in x:
return tl_list[int(v)]
else:
return " "
定义函数的名称为tick_c,第一个参数v,用来接收表示值,第二个参数p,用来接收坐标位置值。在这个函数,主要根据表示值来判断,如果表示值是一个整数,并且在列表x里,那么就返回列表tl_list里的名称。否则就返回一个空的字符串,相当于不显示任何字符。
这里通过列表tl_list里放置不同的字符串,就可以达到个性化地显示标签,到这里就解决了个性化的问题。
整个例子显示的结果图如下:
完整的代码如下:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter, MaxNLocator
#
fig, ax = plt.subplots() #创建子图
#
tlabels = "s1 s2 s3 s4 s5"
tl_list = tlabels.split(" ")
#
x = np.linspace(0, len(tl_list) - 1, len(tl_list))
print(x)
y = np.exp(-x)
#
ax.plot(x, y, lw = 3, color = 'b', marker = 's', mfc = 'r', mec = 'r')
#
def tick_c(v, p):
if int(v) in x:
return tl_list[int(v)]
else:
return " "
ax.xaxis.set_major_formatter(FuncFormatter(tick_c))
ax.xaxis.set_major_locator(MaxNLocator('auto', integer = True))
ax.margins(0.25)
plt.show()
接着下来解决第二个问题,就是解决控制刻度数量的问题。比如只想显示三个刻度,可以通过函数xaxis.set_major_locator()解决,前面的例子代码里是如下使用:
ax.xaxis.set_major_locator(MaxNLocator('auto', integer = True))
这里调用MaxNLocator()函数时使用auto的方式,其它的第一个参数就是控制多少个刻度。如果只想要三个刻度显示,可以把代码修改如下:
ax.xaxis.set_major_locator(MaxNLocator(3, integer = True))
这时结果只显示三个刻度:
因此,通过修改MaxNLocator()函数的第一个参数就可以控制刻度数量。