Matplotlib pyplot-复制轴内容并在新图形中显示

Matplotlib pyplot-复制轴内容并在新图形中显示,matplotlib,Matplotlib,假设我有这个代码: num_rows = 10 num_cols = 1 fig, axs = plt.subplots(num_rows, num_cols, sharex=True) for i in xrange(num_rows): ax = axs[i] ax.plot(np.arange(10), np.arange(10)**i) plt.show() 结果图有太多的信息,现在我想选择一个轴,并在一个新的图形单独绘制它 我试过这样做 def on_click(

假设我有这个代码:

num_rows = 10
num_cols = 1
fig, axs = plt.subplots(num_rows, num_cols, sharex=True)
for i in xrange(num_rows):
     ax = axs[i]
     ax.plot(np.arange(10), np.arange(10)**i)
plt.show()
结果图有太多的信息,现在我想选择一个轴,并在一个新的图形单独绘制它

我试过这样做

def on_click(event):
    axes = event.inaxes.get_axes()
    fig2 = plt.figure(15)
    fig2.axes.append(axes)
    fig2.show()

fig.canvas.mpl_connect('button_press_event', on_click)
但这并不奏效。正确的方法是什么?搜索文档并抛出SE几乎没有任何有用的结果

编辑:

我不介意重画所选的轴,但我不知道如何才能知道选择了哪个轴,因此如果该信息以某种方式可用,那么它对我来说是一个有效的解决方案

编辑#2:

所以我设法做了这样的事情:

def on_click(event):
    fig2 = plt.figure(15)
    fig2.clf()
    for line in event.inaxes.axes.get_lines():
         xydata = line.get_xydata()
         plt.plot(xydata[:, 0], xydata[:, 1])
    fig2.show()
fig, axs = plot_something()
ax = axs[2]
l = list(ax.get_lines())[0]
l2 = list(ax.get_lines())[1]
l3 = list(ax.get_lines())[2]
plot(l.get_data()[0], l.get_data()[1])
plot(l2.get_data()[0], l2.get_data()[1])
plot(l3.get_data()[0], l3.get_data()[1])
ylim(0,1)

这似乎是“工作”(所有其他信息都丢失了-标签、线条颜色、线条样式、线条宽度、xlim、ylim等) 但我觉得一定有更好的方法

谢谢

复制轴 这里的初始答案不起作用,我们保留它以供将来参考,并了解为什么需要更复杂的方法。
#最初的方法存在一些缺陷。
#可以通过“fig.add_axes(axes)”向图形添加“axes”。但在这一点上,,
#轴的图形需要是轴应添加到的图形。
#这听起来可能有点像在圆中运行,但我们实际上可以设置轴的位置
#图为'axis.figure=fig2',因此打破了这一局面。
#然后,还可以在新图形中定位轴,以获得通常的尺寸。
#为此,可以首先添加虚拟轴,这些轴可以将其位置更改为
#然后再次移除虚拟轴。总的来说,这将如下所示。
将matplotlib.pyplot作为plt导入
将numpy作为np导入
行数=10
num_cols=1
图,axs=plt.子批次(num_行,num_列,sharex=True)
对于xrange中的i(num_行):
ax=axs[i]
ax.地块(北阿兰奇(10)、北阿兰奇(10)**i)
单击时的def(事件):
axes=event.inaxes
如果不是轴:返回
图2=plt.图()
轴。图=图2
图2.轴。附加(轴)
图2.添加_轴(轴)
虚拟=图2.添加子批次(111)
轴。设置位置(虚拟。获取位置()
dummy.remove()
图2.show()
图canvas.mpl\u connect(“按钮按下事件”,点击时)
plt.show()
#然而,到目前为止还不错,请注意,现在在单击之后,轴不知何故
#居住在两个数字中,这可能会导致各种问题,例如,如果

#要调整或保存初始图形。
例如,如果您有一个由函数
plot\u something
生成的带有三行的绘图,您可以执行以下操作:

def on_click(event):
    fig2 = plt.figure(15)
    fig2.clf()
    for line in event.inaxes.axes.get_lines():
         xydata = line.get_xydata()
         plt.plot(xydata[:, 0], xydata[:, 1])
    fig2.show()
fig, axs = plot_something()
ax = axs[2]
l = list(ax.get_lines())[0]
l2 = list(ax.get_lines())[1]
l3 = list(ax.get_lines())[2]
plot(l.get_data()[0], l.get_data()[1])
plot(l2.get_data()[0], l2.get_data()[1])
plot(l3.get_data()[0], l3.get_data()[1])
ylim(0,1)

谢谢!这似乎是正确的方向,但正如您所说的“轴以某种方式存在于两个图形中”。因此,我并没有得到预期的结果(在您发布的代码中,尝试单击一些轴,过一段时间后,无论您在何处单击,新图形将始终使用相同的图形创建)以重现:1。单击最上面的轴(y=x),一个正确的图形将打开2。单击最底部的轴(其中y=x^10),一个正确的图形将打开3。单击任何其他图形,如图2所示。opensI看到了这个问题。我用一种使用初始轴的方法更新了答案。它需要使用
pickle
完成图形的完整复制!太神了如果你问我的话,你会发现这是一个令人惊讶的愚蠢(实现它的黑客,而不是答案本身)。我也尝试过使用deepcopy,发现这是不可能的,我从来没有想过要尝试腌制。非常感谢您的电子邮件将使用BytesIO往返的4行代码替换为:
fig2=pickle.loads(pickle.dumps(图))
所有其他信息都丢失了-标签、线条颜色、线条样式、线条宽度、xlim、ylim等。是的,您可能可以对其中的每一行执行类似的操作。我只是想指出,数据,这可能是最重要的部分,是可以从线。我觉得这很酷。你可以在我的编辑中看到#2:问题的一部分,我尝试了类似的东西。你是对的,我没有读那部分,因为我太专注于寻找答案。很抱歉我想我可以在这里留下我的答案,它有一个数字,也许会引起人们对这种可能性的注意,如果可以的话。