Python 从matplotlib中不同轴上的直线更新Line2D特性
在matplotlib中,可以使用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:“非类型”对象没有属性“范围” 而回溯让我感到困惑 我的问题是: 为什么会出现这个错误 如
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()