web-dev-qa-db-ja.com

MatplotLib 3.0.1におけるax.set_xlabel()とax.xaxis.set_label()の違い

(これは素朴な質問かもしれません。もしそうならご容赦ください。)

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_のみが表示されています。

enter image description here

追加1

here によると、matplotlib.axis.XAxis.set_label()アプローチが機能するようです。

私の場合、_ax.xaxis_は_mpl_toolkits.mplot3d.axis3d.XAxis_型です。少し違うタイプです。しかし、私はそれがはずだと思いますもうまくいくと思います。

6
smwikipedia

Matplotlibには「ラベル」と呼ばれるものがいくつかあります。たとえば、軸ラベル、_set_xlabel_で設定、ティックラベル、_set_ticklabels_で設定、アーティストラベル、_set_label_で設定.

Matplotlibのすべてのアーティストにはlabel属性があります。凡例に表示されるようにラベルを設定するときに、通常これに遭遇します。

_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を除く) _set_ylabel_ではなく、_set_label_text_が受け取ります。

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

3
DavidG