gpt4 book ai didi

python - 从 matplotlib 中不同轴上的线更新 Line2D 属性

转载 作者:行者123 更新时间:2023-12-04 14:07:23 27 4
gpt4 key购买 nike

在 matplotlib 中,update_from Line2D的方法object 可用于从另一行复制属性(参见例如 this answer )。如果两条线位于不同的轴上,这将不起作用。以下代码:

fig, (ax1, ax2) = plt.subplots(2, 1)
line1, = ax1.plot(range(10), "r.")
line2, = ax2.plot(*line1.get_xydata().T)
line2.update_from(line1)
加注
AttributeError: 'NoneType' object has no attribute 'extents'
而追溯让我感到困惑。
我的问题是:
  • 为什么会出现这个错误?
  • 如何复制(全部)Line2D line1 的属性至 line2反而?

  • 编辑
    经过更多的测试,我可以说 AttributeError例如,上面是在与 %matplotlib inline 的 Jupyter 笔记本 session 中提出的。后端。与 %matplotlib notebook后端或在常规 Python 脚本中(例如使用“qt5agg”后端),代码通过时没有错误,但 line2 之后“不可见”。
    enter image description here
    为完整起见,上图是使用 (Anaconda) Python 3.7.9 和 matplotlib 3.3.1 创建的:
    import matplotlib as mpl 
    import matplotlib.pyplot as plt

    mpl.use("qt5agg")

    fig, (ax1, ax2) = plt.subplots(2, 1)
    line1, = ax1.plot(range(10), "r.")
    line2, = ax2.plot(*line1.get_xydata().T)
    line2.update_from(line1)

    plt.savefig("test.png")
    问题仍然是我无法复制 Line2D来自 line1 的属性至 line2 .
    编辑 2
    throw plt.tight_layout()加入混合带回 AttributeError .
    编辑 3
    按照评论中的要求,这是我在 plt.tight_layout() 中得到的错误的回溯( 编辑 2 ):
    Traceback (most recent call last):
    File "test.py", line 11, in <module>
    plt.tight_layout()
    File "/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site-packages/matplotlib/cbook/deprecation.py", line 451, in wrapper
    return func(*args, **kwargs)
    File "/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site-packages/matplotlib/pyplot.py", line 1490, in tight_layout
    gcf().tight_layout(pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect)
    File "/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site-packages/matplotlib/cbook/deprecation.py", line 411, in wrapper
    return func(*inner_args, **inner_kwargs)
    File "/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site-packages/matplotlib/figure.py", line 2615, in tight_layout
    pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect)
    File "/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site-packages/matplotlib/tight_layout.py", line 308, in get_tight_layout_figure
    pad=pad, h_pad=h_pad, w_pad=w_pad)
    File "/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site-packages/matplotlib/tight_layout.py", line 84, in auto_adjust_subplotpars
    bb += [ax.get_tightbbox(renderer, for_layout_only=True)]
    File "/home/janjoswig/.pyenv/versions/miniconda3-4.7.12/envs/md379/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 4199, in get_tightbbox
    if np.all(clip_extent.extents == axbbox.extents):
    AttributeError: 'NoneType' object has no attribute 'extents'

    最佳答案

    好像update_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()
    using update_from between different axes

    关于python - 从 matplotlib 中不同轴上的线更新 Line2D 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67388945/

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