以下方法如何:"axes.yaxis.set_major_formatter(FuncFormatter(f))"工作,因为 yaxis 应该是 AXIS 的属性,而不是 AXES 对象的属性?



作为一个Python新手练习可视化,我遇到了这样一个概念问题,它让我思考,事实上,我设法改变了箱线图y轴上的价格格式,从科学符号改为更清晰的格式。这里是y轴格式化前后的输出在

boxy=sns.boxplot(x="waterfront", y="price", data=df)
# my experiments success
from matplotlib.ticker import FuncFormatter
f = lambda x, pos: f'{x:.0f}'
boxy.yaxis.set_major_formatter(FuncFormatter(f))

问题是,我意识到属性yaxis应该引用一个AXIS对象,同时这里我称之为'boxy'是一个AXIS对象(至少从seaborn文档)

有人能解释一下吗?

您说seaborn boxplot返回一个matplotlib Axes对象是对的。参照这个答案,我们看到Axes和Axis对象是不同的。

代码检查不需要…但是在底层,seaborn使用了matplotlib,它在GitHub中被标注为boxplots。

当你调用sns.boxplot部分绘制你的绘图创建轴对象…它们是matplotlib的对象。轴模块。

y轴实际上是boxy.yaxis.set_major_formatter(FuncFormatter(f))的第一部分通过boxy.yaxis接入。您正在调用函数.set_major_formatter(FuncFormatter(f))

要看到这一点,yaxis = boxy.get_yaxis()将返回xy轴对象的y轴。

编辑回复评论:你的评论是正确的,从我能找到的来看,这并没有记录在案……但是如果我们查看这里的matplotlib GitHub,我们可以看到YAxis类声明:

class YAxis(Axis):
__name__ = 'yaxis'

它只是'YAxis'重命名。类将在声明行中使用它们的名称,除非您在这里使用__name__重新指定!

它存在! !

boxy的yaxis从它的基类'Axis'类继承了set_major_formatter方法。为了确认这个层次结构,请尝试查看方法解析顺序:

print(type(boxy.get_yaxis()).__mro__)

应该显示:

(<class 'matplotlib.axis.YAxis'>, <class 'matplotlib.axis.Axis'>, <class 'matplotlib.artist.Artist'>, <class 'object'>)

最新更新