在同一个图

时间:2017-07-11 15:36:15

标签: python matplotlib

我正在尝试将一些数据绘制到子图上,然后在用户选择时将部分数据移动到同一图中的另一个子图上。我可以从一个轴上移除艺术家并在另一个轴上重新绘制它,但这似乎太慢了。相反,我想将艺术家从一个轴移动到另一个轴。

我可以轻松地从轴上移除艺术家,但添加到另一个似乎没有做任何事情。 相关代码:

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('...')

1 个答案:

答案 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())