MatplotLib 3.0.1 中 ax.set_xlabel() 和 ax.xaxis.set_label() 的区别
Difference between ax.set_xlabel() and ax.xaxis.set_label() in MatplotLib 3.0.1
(这可能是一个幼稚的问题。请原谅。)
我正在使用 Python 3.7.1 和 MatplotLib 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
在下图中,您可以看到仅显示标签 x axis
。
加 1
根据 here,matplotlib.axis.XAxis.set_label()
方法似乎应该有效。
在我的例子中,ax.xaxis
是 mpl_toolkits.mplot3d.axis3d.XAxis
类型。这是一个有点不同的类型。但我认为它应该也能工作。
查看您为 matplotlib.axis.XAxis.set_label()
显示的文档,这似乎与为轴本身分配标签以在图例中潜在使用有关(有关更多解释,请参阅@ImportanceOfBeingErnest 的回答)
在任何情况下,等同于 ax.set_xlabel
的是 matplotlib.axis.Axis.set_label_text
因此将代码更改为:
ax.set_xlabel('x axis')
ax.yaxis.set_label_text('y axis')
ax.zaxis.set_label_text('z axis')
给出所需的输出:
matplotlib 中有几个东西叫做"labels"。有例如轴标签,通过 set_xlabel
设置,有刻度标签,通过 set_ticklabels
设置,还有艺术家标签,通过 set_label
设置。
matplotlib 中的每个艺术家都有一个标签属性。一般在设置标签显示在图例中时会遇到,
plt.plot(..., label="my label")
但它也可能对其他情况有帮助。以上相当于
line, = plt.plot(...)
line.set_label("mylabel")
因此,不仅 plot
创建的 Line2D
对象有标签,matplotlib.axis.XAxis
也同样有标签。这是您使用 ax.yaxis.set_label
设置的那个。但是,在生成图例时默认情况下不会考虑这一点,因此它的实用性对于最终用户来说是值得怀疑的。
对于轴的标签,set_ylabel
实际上是用于设置ylabel的方法。在内部,这将调用 yaxis.set_label_text
,因此正如@DavidG 正确指出的那样,您可以将 ax.set_ylabel(..)
替换为 ax.yaxis.set_label_text(..)
(除了 labelpad
所采用的附加参数 labelpad
=19=],但不是 set_label_text
.
(这可能是一个幼稚的问题。请原谅。)
我正在使用 Python 3.7.1 和 MatplotLib 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
在下图中,您可以看到仅显示标签 x axis
。
加 1
根据 here,matplotlib.axis.XAxis.set_label()
方法似乎应该有效。
在我的例子中,ax.xaxis
是 mpl_toolkits.mplot3d.axis3d.XAxis
类型。这是一个有点不同的类型。但我认为它应该也能工作。
查看您为 matplotlib.axis.XAxis.set_label()
显示的文档,这似乎与为轴本身分配标签以在图例中潜在使用有关(有关更多解释,请参阅@ImportanceOfBeingErnest 的回答)
在任何情况下,等同于 ax.set_xlabel
的是 matplotlib.axis.Axis.set_label_text
因此将代码更改为:
ax.set_xlabel('x axis')
ax.yaxis.set_label_text('y axis')
ax.zaxis.set_label_text('z axis')
给出所需的输出:
matplotlib 中有几个东西叫做"labels"。有例如轴标签,通过 set_xlabel
设置,有刻度标签,通过 set_ticklabels
设置,还有艺术家标签,通过 set_label
设置。
matplotlib 中的每个艺术家都有一个标签属性。一般在设置标签显示在图例中时会遇到,
plt.plot(..., label="my label")
但它也可能对其他情况有帮助。以上相当于
line, = plt.plot(...)
line.set_label("mylabel")
因此,不仅 plot
创建的 Line2D
对象有标签,matplotlib.axis.XAxis
也同样有标签。这是您使用 ax.yaxis.set_label
设置的那个。但是,在生成图例时默认情况下不会考虑这一点,因此它的实用性对于最终用户来说是值得怀疑的。
对于轴的标签,set_ylabel
实际上是用于设置ylabel的方法。在内部,这将调用 yaxis.set_label_text
,因此正如@DavidG 正确指出的那样,您可以将 ax.set_ylabel(..)
替换为 ax.yaxis.set_label_text(..)
(除了 labelpad
所采用的附加参数 labelpad
=19=],但不是 set_label_text
.