4

以下は、関数をプロットするコードです。「X」ラベルと「Y」ラベルを、対応する矢印の近くに通常配置されている第1象限に移動する必要があります。これはどのように行われますか?

import pylab as p
import numpy as n

from mpl_toolkits.axes_grid import axislines


def cubic(x) :
    return x**3 + 6*x


def set_axes():
    fig = p.figure(1)
    ax = axislines.SubplotZero(fig, 111)
    fig.add_subplot(ax)

    for direction in ['xzero', 'yzero']:
        ax.axis[direction].set_axisline_style('->', size=2)
        ax.axis[direction].set_visible(True)

    for direction in ['right', 'top', 'left', 'bottom']:
        ax.axis[direction].set_visible(False)

    ax.axis['xzero'].set_label('X')
    ax.axis['yzero'].set_label('Y')

    ax.axis['yzero'].major_ticklabels.set_axis_direction('right')
    ax.axis['yzero'].set_axislabel_direction('+')
    ax.axis['yzero'].label.set_rotation(-90)
    ax.axis['yzero'].label.set_va('center')


set_axes()

X = n.linspace(-15,15,100)
Y = cubic(X)

p.plot(X, Y)

p.xlim(-5.0, 5.0)
p.ylim(-15.0, 15.0)

p.xticks(n.linspace(-5, 5, 11, endpoint=True))
p.grid(True)

p.show()
4

1 に答える 1

8

通常、軸の (例: ax.xaxis) ラベルの位置を変更するには、 を実行しますaxis.label.set_position(xy)。または、'ax.xaxis.set_x(1)` のように 1 つの座標のみを設定することもできます。

あなたの場合、それは次のようになります。

ax['xzero'].label.set_x(1)
ax['yzero'].label.set_y(1)

ただし、axislines(およびaxisartistまたは内の他のものaxes_grid)はやや古いモジュールです(これがaxes_grid1存在する理由です)。場合によっては、適切にサブクラス化されません。したがって、ラベルの x 位置と y 位置を設定しようとしても、何も変わりません!


簡単な回避策は、 を使用ax.annotateして矢印の端にラベルを配置することです。ただし、最初に別の方法でプロットを作成してみましょう (その後、annotateいずれにしても元に戻ります)。


最近では、達成しようとしていることに新しいスパイン機能を使用した方がよいでしょう。

x 軸と y 軸を「ゼロ」に設定するのは、次のように簡単です。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

for spine in ['left', 'bottom']:
    ax.spines[spine].set_position('zero')

# Hide the other spines...  
for spine in ['right', 'top']:
    ax.spines[spine].set_color('none')

ax.axis([-4, 10, -4, 10])
ax.grid()

plt.show()

ここに画像の説明を入力

ただし、素敵な矢印の装飾が必要です。これはもう少し複雑ですが、適切な引数で注釈を付けるための 2 つの呼び出しだけです。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

#-- Set axis spines at 0
for spine in ['left', 'bottom']:
    ax.spines[spine].set_position('zero')

# Hide the other spines...
for spine in ['right', 'top']:
    ax.spines[spine].set_color('none')

#-- Decorate the spins
arrow_length = 20 # In points

# X-axis arrow
ax.annotate('', xy=(1, 0), xycoords=('axes fraction', 'data'), 
            xytext=(arrow_length, 0), textcoords='offset points',
            arrowprops=dict(arrowstyle='<|-', fc='black'))

# Y-axis arrow
ax.annotate('', xy=(0, 1), xycoords=('data', 'axes fraction'), 
            xytext=(0, arrow_length), textcoords='offset points',
            arrowprops=dict(arrowstyle='<|-', fc='black'))

#-- Plot
ax.axis([-4, 10, -4, 10])
ax.grid()

plt.show()

ここに画像の説明を入力

(矢印の幅はテキスト サイズ (または のオプション パラメータarrowprops) によって制御されるため、必要に応じて のようなものを指定するsize=16annotate、矢印が少し広くなります。)


この時点で、"X" と "Y" のラベルを注釈の一部として追加するのが最も簡単ですが、それらの位置を設定することもできます。

空の文字列の代わりに注釈を付ける最初の引数としてラベルを渡すだけで (そして配置を少し変更すると)、矢印の端に素敵なラベルが表示されます。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

#-- Set axis spines at 0
for spine in ['left', 'bottom']:
    ax.spines[spine].set_position('zero')

# Hide the other spines...
for spine in ['right', 'top']:
    ax.spines[spine].set_color('none')

#-- Decorate the spins
arrow_length = 20 # In points

# X-axis arrow
ax.annotate('X', xy=(1, 0), xycoords=('axes fraction', 'data'), 
            xytext=(arrow_length, 0), textcoords='offset points',
            ha='left', va='center',
            arrowprops=dict(arrowstyle='<|-', fc='black'))

# Y-axis arrow
ax.annotate('Y', xy=(0, 1), xycoords=('data', 'axes fraction'), 
            xytext=(0, arrow_length), textcoords='offset points',
            ha='center', va='bottom',
            arrowprops=dict(arrowstyle='<|-', fc='black'))

#-- Plot
ax.axis([-4, 10, -4, 10])
ax.grid()

plt.show()

ここに画像の説明を入力

少しだけ作業を追加するだけで (スパインの変換に直接アクセスする)、注釈の使用を一般化して、任意のタイプのスパインの位置合わせ (たとえば、「ドロップされた」スパインなど) を処理することができます。

いずれにせよ、それが少し役立つことを願っています。必要に応じて、より洗練されたものにすることもできます。

于 2012-10-06T18:17:22.227 に答える