Python 如何使用格式化程序在matplotlib中进行自定义标记?

Python 如何使用格式化程序在matplotlib中进行自定义标记?,python,matplotlib,Python,Matplotlib,如何使用默认的tickformatters(我喜欢并且不想重新创建)来创建自己的自定义tickmarks?我试图解决的问题是,我想对y轴上的所有数字应用一个函数 例如,假设我想将所有y轴刻度标签平方。我不想更改它们的位置或更改基础数据,我只想更改标签。我知道我可以从头开始编写自己的格式化程序,但我更愿意在现有格式化程序的基础上编写一个包装器。我试过: import matplotlib.pyplot as plt from matplotlib.ticker import ScalarForma

如何使用默认的tickformatters(我喜欢并且不想重新创建)来创建自己的自定义tickmarks?我试图解决的问题是,我想对y轴上的所有数字应用一个函数

例如,假设我想将所有y轴刻度标签平方。我不想更改它们的位置或更改基础数据,我只想更改标签。我知道我可以从头开始编写自己的格式化程序,但我更愿意在现有格式化程序的基础上编写一个包装器。我试过:

import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter

def my_formatter(x,pos):
     return ScalarFormatter(x**2,pos)
    
x = np.arange(10)
y = x
fig, ax = plt.subplots()
plt.plot(x,y)
ax.yaxis.set_major_formatter(plt.FuncFormatter(my_formatter))
plt.show()
但这不起作用:


我理解它为什么不起作用,我正在试图弄清楚如何实际调用ScalarFormatter,以便获得它将生成的字符串。

我认为您可以尝试设置:
ax.setxticklabels()
,而不必定义函数来传递它

定义标签:

labels = x**2  # x is a np.array
ax.set_yticklabels(labels)
使用它可以使用函数修改记号的值(而不是位置)

我更喜欢这样装饰格式化程序:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.ticker导入FuncFormatter
@函数格式化程序
def my_格式化程序(x,位置):
返回“{}”。格式(x**2)
x=np.arange(10)
y=x
图,ax=plt.子批次()
轴图(x,y)
#当我们装饰功能时,我们可以使用
#函数名作为格式化程序参数
ax.yaxis.set\u major\u格式化程序(my\u格式化程序)
plt.show()
您应该从格式化程序返回一个字符串,matplotlib将处理定位


找到了这个非常好的答案:

class MyFormatter(ScalarFormatter):
    def __call__(self, x, pos=None):
        return super().__call__(x ** 2, pos=pos)

ax.yaxis.set_major_formatter(MyFormatter())