0

如何使用 Jupyter Notebook 使用 ipywidgets 有效地显示类似的图?

我希望交互式地绘制一个沉重的情节(从某种意义上说,它有很多数据点并且需要一些时间来绘制它)并使用来自 ipywidgets 的交互来修改它的单个元素,而无需重新绘制所有复杂的情节。是否有内置功能可以做到这一点?

基本上我想做的是

import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact
import matplotlib.patches as patches
%matplotlib inline #ideally nbagg

def complicated plot(t):
    plt.plot(HEAVY_DATA_SET)
    ax = plt.gca()
    p = patches.Rectangle(something_that_depends_on_t)
    ax.add_patch(p)

interact(complicatedplot, t=(1, 100));

现在,每次重新绘制最多需要 2 秒。我希望有办法将图形保留在那里并替换那个矩形。

一个技巧是创建一个常量部分的图形,使其成为绘图的背景,然后只绘制矩形部分。但声音太脏

谢谢

4

1 回答 1

1

这是更改矩形宽度的交互式方法的粗略示例(我假设您在 IPython 或 Jupyter 笔记本中):

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.patches as patches

import ipywidgets
from IPython.display import display

%matplotlib nbagg

f = plt.figure()
ax = plt.gca()

ax.add_patch(
    patches.Rectangle(
        (0.1, 0.1),   # (x,y)
        0.5,          # width
        0.5,          # height
    )
)

# There must be an easier way to reference the rectangle
rect = ax.get_children()[0]

# Create a slider widget
my_widget = ipywidgets.FloatSlider(value=0.5, min=0.1, max=1, step=0.1, description=('Slider'))

# This function will be called when the slider changes
# It takes the current value of the slider
def change_rectangle_width():
    rect.set_width(my_widget.value)
    plt.draw()

# Now define what is called when the slider changes
my_widget.on_trait_change(change_rectangle_width)

# Show the slider
display(my_widget)

然后,如果您移动滑块,矩形的宽度将会改变。我会尝试整理代码,但您可能有这个想法。要更改坐标,您必须执行rect.xy = (x0, y0), wherex0y0are new坐标。

于 2016-07-22T14:47:13.817 回答