如何在更改对象';Matplotlib中的s轴?

如何在更改对象';Matplotlib中的s轴?,matplotlib,axes,Matplotlib,Axes,请参考下面的例子。将添加两个子地块,并向每个子地块插入Line2D打印。然后,我将第二个子图中Line2D的轴更改为第一个子图。通过get_geometry输出判断,这是成功的。然而,在实际图形中,两个Line2D图仍在其原始子图中 我错过了什么?如何刷新图形以反映轴的更改 显然,这是一个相当愚蠢的例子,真正的应用程序更具动态性 脚本: import matplotlib.pyplot as plt fig = plt.figure() ax_1 = fig.add_subplot(2,1

请参考下面的例子。将添加两个子地块,并向每个子地块插入Line2D打印。然后,我将第二个子图中Line2D的轴更改为第一个子图。通过
get_geometry
输出判断,这是成功的。然而,在实际图形中,两个Line2D图仍在其原始子图中

我错过了什么?如何刷新图形以反映轴的更改

显然,这是一个相当愚蠢的例子,真正的应用程序更具动态性

脚本:

import matplotlib.pyplot as plt

fig = plt.figure()  
ax_1 = fig.add_subplot(2,1,1)
ax_2 = fig.add_subplot(2,1,2)
ax_1.plot([0,1,2],[0,1,2])
ax_2.plot([0,1,2],[2,1,0])

print 'before'
for line in ax_1.get_lines():
    print line.get_ydata()
    print line.get_axes().get_geometry()
    print id(line.get_axes())

for line in ax_2.get_lines():
    print line.get_ydata()
    print line.get_axes().get_geometry()
    print id(line.get_axes())

f = ax_2.get_lines()[0]
f.set_axes(ax_1)

print 'after'
for line in ax_1.get_lines():
    print line.get_ydata()
    print line.get_axes().get_geometry()
    print id(line.get_axes())

for line in ax_2.get_lines():
    print line.get_ydata()
    print line.get_axes().get_geometry()
    print id(line.get_axes())

plt.show()
输出:

before
[0 1 2]
(2, 1, 1)
4330504912
[2 1 0]
(2, 1, 2)
4336262288
after
[0 1 2]
(2, 1, 1)
4330504912
[2 1 0]
(2, 1, 1)
4330504912
数字输出:
我认为一个问题是,第一个轴(
ax\u 1
)的行列表中没有要添加的行(
f

您可以使用以下命令将第二个绘图中的线“复制”到第一个绘图中:

f = ax_2.lines.pop()  # Removes the line from the second plot
ax_1.plot(*f.get_data())  # Draws a new line in the first plot, but with the coordinates of the second line

(使用此方法,显然不需要执行
f.set_轴(ax_1)
)。
plot()
的其他参数也可以用来复制颜色等,我想。

我认为一个问题是,第一个轴(
ax\u 1
)的行列表中没有要添加的行(
f

您可以使用以下命令将第二个绘图中的线“复制”到第一个绘图中:

f = ax_2.lines.pop()  # Removes the line from the second plot
ax_1.plot(*f.get_data())  # Draws a new line in the first plot, but with the coordinates of the second line

(使用此方法,显然不需要执行
f.set_轴(ax_1)
)。
plot()
的其他参数也可以用来复制颜色等,我想。

后来我发布了相同的问题,这就是答案

TL,DR
这是不受支持的。

后来我发布了相同的问题,并得到了回复

TL,DR

它不受支持。

嗯,这只是同一问题的另一个症状,即轴ax_2的线f没有正确更改。坐标轴更改后,两个Line2D对象都指向同一个坐标轴对象。@c00kiemonster:您能在此基础上展开吗?我不希望
f
在图形上改变,只要它是
ax_2.行的一部分。如果你想让它消失,你可能应该把它从
ax\u 2.lines
中删除。但是它不应该是
ax\u 2.lines
的一部分,我把它的轴改成了
ax\u 1
。除非我完全误解了matplotlib,否则如果两条线共享相同的轴,它们不应该显示在相同的轴上吗?文档表明该线的轴已更改();它并不是说轴本身被修改了。这就是你观察到的。我不确定在这些情况下,
set\u axis()
的典型用法是什么(行
f
仍然包含在
ax\u 2.line
中,但表明它的轴是
ax\u 1
,在
set\u axis()
之后:这似乎是矛盾的;所以,我在你的问题上加了一个星号是的,我自己也有点困惑,不完全是直觉行为。希望有一些matplotlib大师可以解释。好吧,这只是同一问题的另一个症状,即轴ax_2的线f没有被正确地改变。坐标轴更改后,两个Line2D对象都指向同一个坐标轴对象。@c00kiemonster:您能在此基础上展开吗?我不希望
f
在图形上改变,只要它是
ax_2.行的一部分。如果你想让它消失,你可能应该把它从
ax\u 2.lines
中删除。但是它不应该是
ax\u 2.lines
的一部分,我把它的轴改成了
ax\u 1
。除非我完全误解了matplotlib,否则如果两条线共享相同的轴,它们不应该显示在相同的轴上吗?文档表明该线的轴已更改();它并不是说轴本身被修改了。这就是你观察到的。我不确定在这些情况下,
set\u axis()
的典型用法是什么(行
f
仍然包含在
ax\u 2.line
中,但表明它的轴是
ax\u 1
,在
set\u axis()
之后:这似乎是矛盾的;所以,我在你的问题上加了一个星号是的,我自己也有点困惑,不完全是直觉行为。希望有一些matplotlib大师可以解释。你想实现什么?也许有比在一张图中画一条线并将其“移动”到另一张图更好的方法吗?正如我在原始帖子中所说,上面的例子很愚蠢。真正的应用程序是一个gui图表应用程序,它比示例稍微复杂一些。不管应用程序如何,如果
set\u axes
函数实际上没有改变任何东西,我不认为它有什么意义。我认为它是
axes.add\u line()
你想要的,但我似乎还不能让它工作。到目前为止,我已经创建了一个新行,使用
update\u from()
f
复制到这一新行中,然后将它添加到其他轴上。这仍然不起作用,但它可能适用于您的应用程序。我认为它对我不起作用,因为我不认为用于生成线的样条曲线会针对新轴进行更新,但我正在研究这一点……目前我正在从旧轴中的线复制所有数据(xydata)和元数据(颜色、线宽等)。然后删除旧轴中的线,并在新轴中绘制新的线(使用线的提取数据和元数据)。我一直都是这样做的。就在前几天,我在文档中看到了
set_axes
,但我无法让它工作(因为我认为它应该工作)。也许我误解了matplotlib中的轴力学,但就我所见,我认为这是违反直觉的行为。你想实现什么?也许有比在一张图中画一条线并将其“移动”到另一张图更好的方法吗?正如我在原始帖子中所说,上面的例子很愚蠢。真正的应用程序是一个gui图表应用程序,它有点b