MatplotLib 3.0.1中ax.set_xlabel()和ax.xaxis.set_label()之间的区别

smw*_*dia 6 python matplotlib python-3.x mplot3d

(这可能是一个天真的问题.请原谅我.)

我使用的是Python 3.7.1和M​​atplotLib 3.0.1.

在下面的简单代码中,我使用不同的方法为轴分配标签.从OO的角度来看,它们似乎是等同的.但只有x axis标签显示.为什么?

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.linspace(-2,2,60)
y = np.linspace(-2,2,60)

xx, yy = np.meshgrid(x,y)

z = xx**2 + yy**3

surf = ax.plot_surface(xx, yy, z, cmap="viridis")

ax.set_xlabel('x axis')      # <====== This works
ax.yaxis.set_label('y axis') # <====== This doesn't work
ax.zaxis.set_label('z axis') # <====== This doesn't work
Run Code Online (Sandbox Code Playgroud)

在下图中,您只能看到x axis显示的标签.

在此输入图像描述

添加1

根据这里,似乎该matplotlib.axis.XAxis.set_label()方法应该工作.

在我的情况下,ax.xaxis是类型mpl_toolkits.mplot3d.axis3d.XAxis.这是一个有点不同的类型.但我认为它也应该有效.

Dav*_*idG 5

查看您显示的文档,matplotlib.axis.XAxis.set_label()这似乎与为轴本身分配标签以用于图例中的潜在用途有关(有关更多解释,请参阅@ImportanceOfBeingErnest 的回答)

在任何情况下,等同于ax.set_xlabelISmatplotlib.axis.Axis.set_label_text

因此将代码更改为:

ax.set_xlabel('x axis')     
ax.yaxis.set_label_text('y axis')
ax.zaxis.set_label_text('z axis')
Run Code Online (Sandbox Code Playgroud)

给出所需的输出:

在此处输入图片说明


Imp*_*est 5

在 matplotlib 中有几个叫做“标签”的东西。例如有轴标签,通过 设置set_xlabel,有刻度标签,通过 设置set_ticklabels,还有艺术家标签,通过 设置set_label

matplotlib 中的每个艺术家都有一个 label 属性。您通常在设置要在图例中显示的标签时遇到它,

plt.plot(..., label="my label")
Run Code Online (Sandbox Code Playgroud)

但它可能对其他情况也有帮助。以上等价于

line, = plt.plot(...)
line.set_label("mylabel")
Run Code Online (Sandbox Code Playgroud)

因此,不仅Line2D创建的对象plot具有标签,而且同样matplotlib.axis.XAxis具有标签。这是您设置的那个ax.yaxis.set_label。但是,在生成图例时默认情况下不会考虑这一点,因此对于最终用户而言,它的实用性值得怀疑。

对于轴的标签,set_ylabel实际上是用于设置 ylabel 的方法。在内部,这将调用yaxis.set_label_text,从而正确地@DavidG指出的那样,你可以替换ax.set_ylabel(..)ax.yaxis.set_label_text(..)(除了一个额外的参数labelpad被采取set_ylabel,但不是set_label_text