web-dev-qa-db-ja.com

matplotlibのAxes3Dでラベルの位置を調整する

軸ラベルがmatplotlibの目盛りラベルと重複していると問題が発生します。変換を適用するか、set_y()を呼び出して、ラベルを「手動で」再配置しようとしましたが、役に立ちませんでした。

これは問題を再現するスニペットです:

import matplotlib
matplotlib.use("TKAGG")
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d

figure = pyplot.figure()
figure.subplots_adjust(bottom=0.25, top=0.75)
axes = figure.gca(projection='3d')
xLabel = axes.set_xlabel('XXX xxxxxx xxxx x xx x')
yLabel = axes.set_ylabel('YY (y) yyyyyy')
zLabel = axes.set_zlabel('Z zzzz zzz (z)')
plot = axes.plot([1,2,3],[1,2,3])

pyplot.show()

Xラベルとyラベルが目盛りとどのように干渉するかに注意してください。これをエレガントに解決できますか?

32

私はあなたの欲求不満を共有します。私はそれを30分ほど働き、どこにも行きませんでした。ドキュメントは、set_xlabelがarg labelpad を取ると言いますが、エラーが発生します(AttributeError:Unknown property labelpad)! xaxisやw_xaxisでは、事後に設定しても何も起こりません。

大まかな回避策は次のとおりです。

import matplotlib
matplotlib.use("TKAGG")
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d

figure = pyplot.figure(figsize=(8,4), facecolor='w')
ax = figure.gca(projection='3d')

xLabel = ax.set_xlabel('\nXXX xxxxxx xxxx x xx x', linespacing=3.2)
yLabel = ax.set_ylabel('\nYY (y) yyyyyy', linespacing=3.1)
zLabel = ax.set_zlabel('\nZ zzzz zzz (z)', linespacing=3.4)
plot = ax.plot([1,2,3],[1,2,3])
ax.dist = 10

pyplot.show()

enter image description here

37
Paul

Matplotlibの新しいバージョンでは、これを行う方法は次のとおりです。

ax.xaxis._axinfo['label']['space_factor'] = 2.8

ここの説明を参照してください:

https://github.com/matplotlib/matplotlib/issues/361

V1.4でテストしましたが、バージョン> 1.1で動作するはずです。

21
Adam Hughes

StackOverflowをもっと頻繁にフォローする必要があります。私は現在mplot3dのメンテナーです。通常の2Dプロットで通常機能するさまざまなトリックが3Dプロットで機能しないのは、mplot3dが元々ハードコードされたデフォルトで作成されたためです。 mplot3dがラベルをレンダリングする角度を計算する方法にもバグがありました。

v1.1.0には、状態を改善するためのいくつかの修正が含まれています。軸ラベルの角度の誤計算を修正し、間隔を調整しました。次のリリースでは、目盛りラベルと軸ラベルが軸の外側にあることを考慮に入れてデフォルトが設計されているため、デフォルトの軸間隔よりも多くの3d軸を使用したいと思います。これはmplot3dの場合とは異なります。 。間隔はmplot3dの相対的な比率によって決定されるため、内部で機能するスペースが小さいほど、ラベル同士が近づきます。

回避策の他の可能な手段については、注記 こちら を参照してください。公正な警告ですが、このプライベートディクショナリは恒久的な解決策ではなく、mplot3dのリファクタリングが完了するまでの必要悪です。

また、v1.1.0には、mplot3dのAPIに対する多くの更新が含まれています。改訂されたドキュメント ここ をチェックしてください。

16
Ben Root

これを各軸に追加し、数値を調整します。

axes.yaxis.labelpad=30

リンクでAdam Hughesが機能していないと記載されていますが、私にとっては機能します。

9
TNT

これにより、1つのショット内のすべての(x、y、z)ラベルのパディングが変更されます。私はこのアプローチが一番好きです:

from matplotlib import rcParams
rcParams['axes.labelpad'] = 20
6
tamasgal

設計の慣例として、変換されたテキストはあまり判読できません。軸にラベルを使用することをお勧めします。これはあなたがmatplotlibでそれを行う方法です

import matplotlib
matplotlib.use("TKAGG")
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d

figure = pyplot.figure()
figure.subplots_adjust(bottom=0.25, top=0.75)
axes = figure.gca(projection='3d')
xLabel = axes.set_xlabel('X', fontsize=14, fontweight='bold', color='b')
yLabel = axes.set_ylabel('Y',fontsize=14, fontweight='bold', color='r')
zLabel = axes.set_zlabel('Z',fontsize=14, fontweight='bold', color='g')


x = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='b')
y = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='r')
z = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='g')

handles, labels = axes.get_legend_handles_labels()
axes.legend((x,y,z),("XXXXXX","YYYYY","ZZZZZZ"),'best')


plot = axes.plot([1,2,3],[1,2,3])


pyplot.show()

Image result

3
fabrizioM

図をプロットした後は、labelpadを使用できます。

axes = fig.gca(projection='3d')
axes.xaxis.labelpad=20
axes.yaxis.labelpad=20
axes.zaxis.labelpad=20

これにより、軸ラベルが3Dプロットの外に出る可能性があるため、distメソッドを使用して距離を調整する必要があります。

ax.dist = 13
0
G M