Python 从matplotlib中不同轴上的直线更新Line2D特性

Python 从matplotlib中不同轴上的直线更新Line2D特性,python,matplotlib,copy,Python,Matplotlib,Copy,在matplotlib中,可以使用Line2D对象的update\u from方法从另一行复制特性(例如,请参见)。如果两条线位于不同的轴上,则此操作无效。以下代码: 图(ax1,ax2)=plt.子批次(2,1) 第1行=ax1.绘图(范围(10),“r.”) line2,=ax2.plot(*line1.get_xydata().T) 第2行。从(第1行)更新 提高 AttributeError:“非类型”对象没有属性“范围” 而回溯让我感到困惑 我的问题是: 为什么会出现这个错误 如

在matplotlib中,可以使用
Line2D
对象的
update\u from
方法从另一行复制特性(例如,请参见)。如果两条线位于不同的轴上,则此操作无效。以下代码:

图(ax1,ax2)=plt.子批次(2,1)
第1行=ax1.绘图(范围(10),“r.”)
line2,=ax2.plot(*line1.get_xydata().T)
第2行。从(第1行)更新
提高

AttributeError:“非类型”对象没有属性“范围”
而回溯让我感到困惑

我的问题是:

  • 为什么会出现这个错误
  • 如何将
    line1
    的(全部)
    Line2D
    属性复制到
    line2
编辑

经过一点测试后,我可以说上面的
AttributeError
是在一个带有
%matplotlib inline
后端的Jupyter笔记本会话中提出的。使用
%matplotlib笔记本
后端或在常规Python脚本中(例如,使用“qt5agg”后端),代码将无错误地传递,但之后第2行将“不可见”

为了完整起见,上面的图像是使用(Anaconda)Python 3.7.9和matplotlib 3.3.1创建的,带有:

将matplotlib导入为mpl
将matplotlib.pyplot作为plt导入
mpl.use(“qt5agg”)
图(ax1,ax2)=plt.子批次(2,1)
第1行=ax1.绘图(范围(10),“r.”)
line2,=ax2.plot(*line1.get_xydata().T)
第2行。从(第1行)更新
plt.savefig(“test.png”)
问题仍然是我无法将
Line2D
属性从
line1
复制到
line2

编辑2

plt.tight_layout()
扔到混音中会带回
AttributeError

编辑3

根据评论中的要求,以下是我使用
plt.tight_layout()
EDIT 2)得到的错误回溯:

回溯(最近一次呼叫最后一次):
文件“test.py”,第11行,在
plt.紧_布局()
包装器中的文件“/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site packages/matplotlib/cbook/deprecation.py”,第451行
返回函数(*args,**kwargs)
文件“/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site packages/matplotlib/pyplot.py”,第1490行,紧凑布局
gcf().紧凑布局(pad=pad,h\U pad=h\U pad,w\U pad=w\U pad,rect=rect)
包装器中的第411行文件“/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site packages/matplotlib/cbook/deprecation.py”
返回函数(*内部参数,**内部参数)
文件“/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site packages/matplotlib/figure.py”,第2615行,紧凑布局
pad=pad,h_pad=h_pad,w_pad=w_pad,rect=rect)
文件“/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site packages/matplotlib/tight_layout.py”,第308行,如图所示
焊盘=焊盘,h_焊盘=h_焊盘,w_焊盘=w_焊盘)
文件“/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site packages/matplotlib/tight_layout.py”,第84行,位于自动调整子地块部分
bb+=[ax.get\u tightbox(渲染器,仅用于布局\u=True)]
文件“/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site packages/matplotlib/axes/_base.py”,第4199行,位于get_Tightbox中
如果np.all(clip_extent.extents==axbbox.extents):
AttributeError:“非类型”对象没有属性“范围”

似乎
update\u from
更新太多,包括转换和剪贴簿。也许错误是因为对象在剪切到错误的剪贴簿后完全不可见

一种解决方法是在更新和设置它们之前保存它们:

from matplotlib import pyplot as plt

fig, (ax1, ax2) = plt.subplots(2, 1)
line1, = ax1.plot(range(10), "r.")
line2, = ax2.plot(*line1.get_xydata().T)
old_transform = line2.get_transform()
old_clipbox = line2.clipbox
line2.update_from(line1)
line2.set_transform(old_transform)
line2.clipbox = old_clipbox
plt.tight_layout()
plt.draw()

无法重现您的错误。您是说这个吗
ax2.update\u from(ax1)
您应该始终发布完整的回溯。@Woodford我的意思是(Line2D.update\u from)[是的,谢谢,这很有效!
from matplotlib import pyplot as plt

fig, (ax1, ax2) = plt.subplots(2, 1)
line1, = ax1.plot(range(10), "r.")
line2, = ax2.plot(*line1.get_xydata().T)
old_transform = line2.get_transform()
old_clipbox = line2.clipbox
line2.update_from(line1)
line2.set_transform(old_transform)
line2.clipbox = old_clipbox
plt.tight_layout()
plt.draw()