我使用子图在一个图中有几个图.每个轴实例用于引用一组特定的轴.像这样:
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')
Run Code Online (Sandbox Code Playgroud)
如您所见,我的一组轴是3d图.我对其他图的其中一个属性进行了更改,如下所示:
plt.setp(zh, xdata=event.xdata,ydata=event.ydata)
Run Code Online (Sandbox Code Playgroud)
并重新绘制如下:
zh.figure.canvas.draw();
Run Code Online (Sandbox Code Playgroud)
然而,这正在重新绘制包含3D投影在内的所有情节的整体图形,这会显着降低速度.
我试过这个:
ax[0].draw_artist(zh)
Run Code Online (Sandbox Code Playgroud)
我认为这有希望,但轴没有更新.我没有收到错误,它只是没有重新绘制.我也尝试过:
zh.axes.draw(zh,ax[0])
Run Code Online (Sandbox Code Playgroud)
但是这给出了错误:
AttributeError: 'Line2D' object has no attribute 'open_group'
Run Code Online (Sandbox Code Playgroud)
关于为什么会发生这种情况的任何想法,以及如何重新绘制我正在改变而不是整个数字的轴实例?
编辑:
zh是一个Line2D对象:
zh, = plt.plot(z.real, z.imag, 'x', ms=10)
Run Code Online (Sandbox Code Playgroud)
您不能绘制单个轴,但只能更新单个轴.
基本上,你需要搞快乐.如果轴的范围(以及因此的刻度等)发生变化,则会变得更加复杂.目前,我认为情况并非如此.
作为一个过于简化的例子:
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)
Run Code Online (Sandbox Code Playgroud)
但是,新手matplotlib.animations将为您执行此操作,并且只会对您指定的艺术家的轴进行blit.
这是使用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()
Run Code Online (Sandbox Code Playgroud)
哪些艺术家是动画的(以及哪些轴被更新)由艺术家控制功能(或可调用对象,如本例中)返回.