在 Jupyter 笔记本中使用 Matplotlib 进行交互式绘图时,图形未填充画布

2024-05-11

我正在尝试做这样的事情来仔细查看我的数据:

目前在 Jupyter/iPython 中动态更新绘图的正确方法是什么? https://stackoverflow.com/questions/34486642/what-is-the-currently-correct-way-to-dynamically-update-plots-in-jupyter-ipython

或者在这里:https://nbviewer.jupyter.org/gist/branning/c8e63ce81be0391260b1 https://nbviewer.jupyter.org/gist/branning/c8e63ce81be0391260b1

这是我的代码:

%matplotlib notebook
from matplotlib import pyplot as plt
import pandas as pd

START = DATA.index[0]
END = DATA.index[-1]
DT = "6H"

DATERANGE = pd.date_range(START, END, freq=DT)

fig, ax = plt.subplots(figsize(8, 6))
since = DATERANGE[0]
for till in DATERANGE[1:]:
    data = DATA['SOME_SERIES'].loc[since:till]
    if len(data) > 0:
        if ax.lines:
            ax.lines[0].set_xdata(data.index)
            ax.lines[0].set_ydata(data)
        else:
            ax.plot(data.index, data)
        upper, lower = data.min()*0.9, data.max()*1.1
        if not (isnan(upper) or isnan(lower)):
            ax.set_ylim((data.min()*0.9, data.max()*1.1))
        ax.set_xlim((data.index[0], data.index[-1]))
        fig.canvas.draw()
    time.sleep(2)
    since = till

我的问题是,虽然绘图正在更新,但它并没有填充画布(希望我在那里掌握了术语),但只有大约四分之一的大小。 它看起来像这样:

循环时绘图 https://i.stack.imgur.com/ET1In.png

只有当循环结束时,情节才会变得更大:

循环后的绘图 https://i.stack.imgur.com/afMu7.png

上面链接中的确切代码也是如此。

我更新了 jupyter 和 matplotlib,我尝试了Fig.tight_layout(),我还尝试了 %matplotlib Notebook %matplotlib nbagg 但这也没有解决问题。

有人有解决方案吗?

谢谢, 菲利普


对我来说,这是在 Mac 上工作时的一个问题。对此有一个悬而未决的问题;现在看来最好的解决办法是将代码拆分为两个单元格 https://github.com/matplotlib/matplotlib/issues/9606#issuecomment-754131047。无耻地交叉复制该解决方案:

# Cell 1
%matplotlib notebook
# OR: %matplotlib widget
import matplotlib.pyplot as plt
import numpy as np
import time

fig = plt.figure()

# Cell 2
for j in range(10):       
    plt.plot(range(0, j), [1/(i+1) for i in range(0, j)])
    fig.canvas.draw()
    time.sleep(.1)

或者,可以选择“内联”后端。当然,这个不是交互式的,而且有点丑陋。看这个线程 https://stackoverflow.com/a/29675706/38281

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Jupyter 笔记本中使用 Matplotlib 进行交互式绘图时,图形未填充画布 的相关文章

随机推荐