Matplotlib X轴显示特殊的标签

前面我们学习过坐标轴显示数字、显示弧度、显示角度、显示日期,如果还想自己搞一些特殊的标签显示,又需要怎么办呢?本文将通过例子来演示怎么样实现这样的功能。另外,也需要考虑坐标轴上显示刻度的数量,有时候数据比较大,如果自动显示会显示很多刻度,导致坐标轴比较拥挤,又或者想多显示一些刻度。如果你有这样的需求,就继续看本文。

首先来解决第一个问题,就是怎么样个性地显示刻度上的标签。如果你学习前面的文章,会发现弧度显示的代码,就是一种个性化显示,当时没有深入地去解释,现在才有机会来说明这个问题。我们知道坐标轴上刻度的标签,默认定义就是数值显示,这是大多数情况下的适用的,但是有时候我们需要显示的不是数值,而是一种阶段性的提示文本。沿着这个方向去思考,那么我们只要寻找到一个方法,能把数值转换为文本字符串,那么问题就可以解决了。比如坐标显示的是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里放置不同的字符串,就可以达到个性化地显示标签,到这里就解决了个性化的问题。

整个例子显示的结果图如下:

Matplotlib X轴显示特殊的标签

完整的代码如下:

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

这时结果只显示三个刻度:

Matplotlib X轴显示特殊的标签

因此,通过修改MaxNLocator()函数的第一个参数就可以控制刻度数量。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程