Разница между ax.set_xlabel () и ax.xaxis.set_label () в MatplotLib 3.0.1 - PullRequest
0 голосов
/ 15 ноября 2018

(Это может быть наивный вопрос. Извините, если так.)

Я использую Python 3.7.1 и MatplotLib 3.0.1.

В приведенном ниже простом коде я использовал разныеспособы назначения меток осям.Они кажутся эквивалентными с точки зрения ОО.Но показывает только ярлык 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.

enter image description here

ADD 1

Согласно здесь кажется, что подход matplotlib.axis.XAxis.set_label() должен работать.

В моем случае ax.xaxis имеет тип mpl_toolkits.mplot3d.axis3d.XAxis.Это немного другой тип.Но я думаю, что должно работать так же.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

В matplotlib есть несколько вещей, называемых «метками».Например, есть метки осей, установленные через set_xlabel, есть метки тиков, установленные через set_ticklabels, и есть метки исполнителей, установленные через set_label.

У каждого исполнителя в matplotlib есть атрибут label.Обычно вы сталкиваетесь с этим, когда устанавливаете метку, чтобы она отображалась в легенде

plt.plot(..., label="my label")

, но это может быть полезно и в других случаях.Вышеуказанное эквивалентно

line, = plt.plot(...)
line.set_label("mylabel")

Так что не только объект 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.

0 голосов
/ 15 ноября 2018

Глядя на документацию, которую вы показали для 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')

Дает желаемый результат:

enter image description here

...