【问题标题】:Jupyter Notebook matplotlib notebook makes plot not show up, inline makes it not interactiveJupyter Notebook matplotlib notebook 使绘图不显示,内联使其不交互
【发布时间】:2019-05-07 00:05:28
【问题描述】:

我有一个 python 文件Vis.py 具有以下两个功能:

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

def update(val): #needed for slider function of plot_test
    pos = spos.val
    ax.axis([pos,pos+10,-1,1])
    fig.canvas.draw_idle()

def plot_test(data):
    fig, ax = plt.subplots()
    plt.subplots_adjust(bottom=0.25)
    plt.plot(data)
    plt.axis([0, 10, -1, 1])
    axcolor = 'lightgoldenrodyellow'
    axpos = plt.axes([0.2, 0.1, 0.65, 0.03], facecolor=axcolor)
    spos = Slider(axpos, 'Pos', 0.1, 90.0)
    spos.on_changed(update)
    plt.show();

我正在尝试在单独的 ipynb 文件中使用 plot_test 函数:

%matplotlib notebook
from Vis import *
import numpy as np

t = np.arange(0.0, 200.0, 0.1)
s = np.sin(2*np.pi*t)
plot_test(s)

但是,情节并没有出现,甚至没有出现空白区域。我尝试在plot_test(s) 之前运行%matplotlib inline。这使得情节出现了,但它也摆脱了情节的互动性。

【问题讨论】:

  • 对我来说很好用;尽管要获得交互式滑块,您需要在更新函数中定义ax。最好使update 成为plot_test() 的一部分,这样ax 可以在命名空间中访问。
  • 呵呵奇怪。所以你可以使用底部的滑块,使用我的代码吗?关于更新功能,我同意你的看法,但是更新功能在我的示例中被用于整个互联网(matplotlib.org/gallery/widgets/slider_demo.htmlstackoverflow.com/questions/31001713/…)。如果您可以提供一个明确的示例,其中 update 函数是 plot_test() 函数的一部分并以交互方式工作,我很乐意接受它作为答案。

标签: python python-3.x matplotlib jupyter-notebook


【解决方案1】:

更新函数引用ax,超出范围。一个解决方案是将更新函数放在plot_test 函数中。

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

def plot_test(data):
    fig, ax = plt.subplots()
    plt.subplots_adjust(bottom=0.25)
    plt.plot(data)
    plt.axis([0, 10, -1, 1])
    axcolor = 'lightgoldenrodyellow'
    axpos = plt.axes([0.2, 0.1, 0.65, 0.03], facecolor=axcolor)
    spos = Slider(axpos, 'Pos', 0.1, 90.0)

    def update(val): #needed for slider function of plot_test
        pos = spos.val
        ax.axis([pos,pos+10,-1,1])
        fig.canvas.draw_idle()

    spos.on_changed(update)
    plt.show()

然后,保持笔记本部分不变,

%matplotlib notebook
from Vis import *
import numpy as np

t = np.arange(0.0, 200.0, 0.1)
s = np.sin(2*np.pi*t)
plot_test(s)

为我生成所需的交互式图形。

【讨论】:

  • 完美,谢谢!补充一点:对我来说,情节仍然没有出现,但是在from Vis import * 行之后第二次添加%matplotlib notebook 奇怪地为我解决了这个问题。将来可能会帮助某人。
  • 那是你没有从新内核开始的时候,即如果之前使用过内联后端,将行更改为notebook,但没有重新启动内核。见this answer
  • 不,不是这样。我摆脱了内联语句并重新启动了内核,但是没有第二个 %matplotlib notebook 语句就不会显示。此外,在您引用的问题中,出现了一个空白区域,对我来说并非如此。
  • 您的笔记本可能被配置为自动加载内联后端。这似乎经常发生(虽然我不知道为什么会这样)。
猜你喜欢
  • 2017-05-11
  • 1970-01-01
  • 2017-05-05
  • 2016-12-30
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 2020-12-12
  • 2016-11-16
相关资源
最近更新 更多