gpt4 book ai didi

matplotlib - pyplot - 复制轴内容并将其显示在新图形中

转载 作者:行者123 更新时间:2023-12-03 13:35:00 27 4
gpt4 key购买 nike

假设我有这个代码:

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

结果图有太多信息,现在我想选择 1 个轴并将其单独绘制在一个新图中

我试着做这样的事情
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()

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

谢谢

最佳答案

复制轴

这里的初始答案不起作用,我们保留它以供将来引用,并了解为什么需要更复杂的方法。

#There are some pitfalls on the way with the initial approach. 
#Adding an `axes` to a figure can be done via `fig.add_axes(axes)`. However, at this point,
#the axes' figure needs to be the figure the axes should be added to.
#This may sound a bit like running in circles but we can actually set the axes'
#figure as `axes.figure = fig2` and hence break out of this.

#One might then also position the axes in the new figure to take the usual dimensions.
#For this a dummy axes can be added first, the axes can change its position to the position
#of the dummy axes and then the dummy axes is removed again. In total, this would look as follows.

import matplotlib.pyplot as plt
import numpy as np

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)


def on_click(event):
axes = event.inaxes
if not axes: return
fig2 = plt.figure()
axes.figure=fig2
fig2.axes.append(axes)
fig2.add_axes(axes)

dummy = fig2.add_subplot(111)
axes.set_position(dummy.get_position())
dummy.remove()
fig2.show()

fig.canvas.mpl_connect('button_press_event', on_click)


plt.show()

#So far so good, however, be aware that now after a click the axes is somehow
#residing in both figures, which can cause all sorts of problems, e.g. if you
# want to resize or save the initial figure.


相反,以下将起作用:

腌制图

问题是无法复制轴(即使 deepcopy 也会失败)。因此,要获得轴的真实副本,您可能需要使用 pickle。以下将起作用。它腌制整个图形并删除除要显示的一个轴以外的所有图形。
import matplotlib.pyplot as plt
import numpy as np
import pickle
import io

num_rows = 10
num_cols = 1
fig, axs = plt.subplots(num_rows, num_cols, sharex=True)
for i in range(num_rows):
ax = axs[i]
ax.plot(np.arange(10), np.arange(10)**i)

def on_click(event):

if not event.inaxes: return
inx = list(fig.axes).index(event.inaxes)
buf = io.BytesIO()
pickle.dump(fig, buf)
buf.seek(0)
fig2 = pickle.load(buf)

for i, ax in enumerate(fig2.axes):
if i != inx:
fig2.delaxes(ax)
else:
axes=ax

axes.change_geometry(1,1,1)
fig2.show()

fig.canvas.mpl_connect('button_press_event', on_click)

plt.show()

重新创建图

上面的替代方案当然是每次单击轴时在新图形中重新创建绘图。为此,可以使用在指定轴上创建绘图并以指定索引作为输入的函数。在图形创建期间以及稍后在另一个图形中复制绘图时使用此函数可确保在所有情况下都具有相同的绘图。
import matplotlib.pyplot as plt
import numpy as np

num_rows = 10
num_cols = 1
colors = plt.rcParams["axes.prop_cycle"].by_key()["color"]
labels = ["Label {}".format(i+1) for i in range(num_rows)]

def myplot(i, ax):
ax.plot(np.arange(10), np.arange(10)**i, color=colors[i])
ax.set_ylabel(labels[i])


fig, axs = plt.subplots(num_rows, num_cols, sharex=True)
for i in xrange(num_rows):
myplot(i, axs[i])


def on_click(event):
axes = event.inaxes
if not axes: return
inx = list(fig.axes).index(axes)
fig2 = plt.figure()
ax = fig2.add_subplot(111)
myplot(inx, ax)
fig2.show()

fig.canvas.mpl_connect('button_press_event', on_click)

plt.show()

关于matplotlib - pyplot - 复制轴内容并将其显示在新图形中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45810557/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com