Jupyter Notebook:带有小部件的交互式情节

时间:2017-06-02 12:32:13

标签: python matplotlib jupyter-notebook jupyter

我正在尝试生成依赖于小部件的交互式绘图。 我遇到的问题是,当我使用滑块更改参数时,会在上一个之后完成新的绘图,而我希望只根据参数更改一个绘图。

示例:

from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np

def plot_func(freq):
    x = np.linspace(0, 2*np.pi)
    y = np.sin(x * freq)
    plt.plot(x, y)

interact(plot_func, freq = widgets.FloatSlider(value=7.5,
                                               min=1,
                                               max=5.0,
                                               step=0.5))

将滑块移动到4.0后,我有:

enter image description here

虽然我只想在移动滑块时改变一个数字。 我怎样才能做到这一点?

(我使用的是Python 2.7,matplotlib 2.0,我刚刚更新了笔记本和jupyter到最新版本。如果需要进一步的信息,请告诉我。)

2 个答案:

答案 0 :(得分:17)

由于您想要更改图形,而不是创建新图形,我可以建议采用以下方式:

  1. 使用交互式后端; %matplotlib notebook from ipywidgets import * import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2 * np.pi) fig = plt.figure() ax = fig.add_subplot(1, 1, 1) line, = ax.plot(x, np.sin(x)) def update(w = 1.0): line.set_ydata(np.sin(w * x)) fig.canvas.draw_idle() interact(update);
  2. 更新图中的线条,而不是绘制新线条。
  3. 所以代码看起来像这样:

    plt.show()

    enter image description here

    或者,您可以使用this answer中的requestOptions = [[PHImageRequestOptions alloc] init]; requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; requestOptions.synchronous = false; assetsOfPhotos = [PHAsset fetchAssetsWithMediaType: PHAssetMediaTypeImage options: nil]; PHImageManager *manager = [PHImageManager defaultManager]; @autoreleasepool { for (int i = 0; i <= totalImages - 1; i++) { PHAsset *asset = assetsOfPhotos[i]; [manager requestImageForAsset: asset targetSize: CGSizeMake(640, 480) contentMode: PHImageContentModeDefault options: requestOptions resultHandler: ^void(UIImage *image, NSDictionary *info) { image = nil; }]; } }

答案 1 :(得分:2)

这是jupyter和/或ipywidgets的最新版本中引入的问题(?)。我找到的一种解决方法是在plt.show()的末尾添加行plot_func