我正在尝试将一些数据绘制到子图上,然后在用户选择时将部分数据移动到同一图中的另一个子图上。我可以从一个轴上移除艺术家并在另一个轴上重新绘制它,但这似乎太慢了。相反,我想将艺术家从一个轴移动到另一个轴。
我可以轻松地从轴上移除艺术家,但添加到另一个似乎没有做任何事情。 相关代码:
artist.remove()
artist.axes = self.ax1
self.ax1.add_line(artist)
self.fig.canvas.draw_idle()
此代码运行后,所选艺术家不再位于第一个轴上,但不会显示在第二个轴上。更具体地说,艺术家在轴上(ax2.children中还有一个元素,artist.axes现在等于ax2),但即使重绘了所有内容,它也不会在视觉上显示出来。
这是一个完整的工作示例,演示了这个问题:
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
fig = plt.figure(figsize=(10,10))
ax1 = fig.add_subplot(121, picker=True)
ax2 = fig.add_subplot(122, picker=True)
v = [0,1,2,3,4]
plt.ion()
ax1.plot(v, picker=5)
def onclick(event):
artist = event.artist
print(artist)
if isinstance(artist, Line2D):
artist.remove()
artist.axes = ax2
ax2.add_line(artist)
fig.canvas.draw()
fig.canvas.mpl_connect('pick_event', onclick)
plt.show()
input('...')
答案 0 :(得分:3)
您还需要更改艺术家的transform
及其axes
属性。
所以,制作你的onclick
功能:
def onclick(event):
artist = event.artist
print(artist)
if isinstance(artist, Line2D):
artist.remove()
artist.axes = ax2
artist.set_transform(ax2.transData) # <-- I added this line
ax2.add_line(artist)
fig.canvas.draw()
一切都应该正常。
请注意,您可能还需要更改ax2
的轴限制,例如:
ax2.set_xlim(ax1.get_xlim())
ax2.set_ylim(ax1.get_ylim())