作为一个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'>)