8

サブプロットを使用して、1 つの図に複数のプロットがあります。各軸インスタンスは、特定の軸セットを参照するために使用されます。そのようです:

ax[0] = fig.add_subplot(2, 2, 1)
ax[1] = fig.add_subplot(2, 1, 2)
ax[2] = fig.add_subplot(2, 2, 2,projection='3d')

ご覧のとおり、軸のセットの 1 つは 3D プロットです。次のように、他のプロットのプロパティの 1 つを変更します。

plt.setp(zh, xdata=event.xdata,ydata=event.ydata)

次のように再描画します。

zh.figure.canvas.draw();

ただし、これは、3D 投影されたものを含むすべての suplots を使用して全体の図を再描画しているため、処理が大幅に遅くなります。

私はこれを試しました:

ax[0].draw_artist(zh)

これは有望だと思いましたが、軸は更新されていません。エラーは発生していません。再描画していないだけです。私も試しました:

zh.axes.draw(zh,ax[0])

しかし、それはエラーを与えます:

AttributeError: 'Line2D' object has no attribute 'open_group'

なぜこれが起こっているのか、図全体ではなく、変更している軸インスタンスを再描画する方法についてのアイデアはありますか?

編集:

zh は Line2D オブジェクトです。

zh, = plt.plot(z.real, z.imag, 'x', ms=10)
4

1 に答える 1

8

単一の軸を描画することはできませんが、単一の軸のみを更新できます。

基本的に、物事をブリットする必要があります。軸の範囲 (したがって目盛りなど) が変化している場合、これはより複雑になります。現時点では、そうではないと仮定します。

単純化しすぎた例として、次のようにします。

import matplotlib.pyplot as plt
import numpy as np

plt.ion()
x = np.linspace(0, 4*np.pi, 100)
fig, axes = plt.subplots(nrows=3)

fig.canvas.draw()
background = fig.canvas.copy_from_bbox(axes[0].bbox)

lines = [ax.plot(x, np.cos(x))[0] for ax in axes]
fig.canvas.draw()

for phase in range(1000):
    fig.canvas.restore_region(background)
    lines[0].set_ydata(np.cos(x + phase / 5.0))
    axes[0].draw_artist(lines[0])
    fig.canvas.blit(axes[0].bbox)

ただし、 newmatplotlib.animationsはこれを処理し、指定したアーティストの軸のみをブリットします。

を使用して記述された同じ例を次に示しmatplotlib.animations.FuncAnimationます。

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

x = np.linspace(0, 4*np.pi, 100)
fig, axes = plt.subplots(nrows=3)

lines = [axes[0].plot(x, np.cos(x), animated=True)[0]]
lines += [ax.plot(x, np.cos(x)) for ax in axes[1:]]

class Update(object):
    def __init__(self, line):
        self.phase = 0
        self.line = line
    def __call__(self, _):
        self.line.set_ydata(np.cos(x + self.phase / 5.0))
        self.phase += 1.0
        return [self.line]

anim = FuncAnimation(fig, Update(lines[0]), interval=0, blit=True) 
plt.show()

どのアーティストがアニメートされるか (およびどの軸が更新されるか) は、関数 (またはこの場合は呼び出し可能なオブジェクト) が返すアーティストによって制御されます。

于 2012-06-13T20:59:39.523 に答える