2016-07-22 16 views
0

Jupyterノートブックを使用してipywidgetsで同様のプロットを効率的に表示するにはどうすればよいですか?プロットの要素を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秒を要しています。私はそこに図を保持し、その四角形を置き換える方法があると思います。

定数部分の図形を作成し、プロットの背景にし、矩形部分をプロットするだけです。しかし

あまりにも汚い音は(私はあなたがIPythonまたはJupyterノートブックであると仮定しています)。これは、長方形の幅を変更するためのインタラクティブな方法のラフな例であるあなた

+0

本当にやりたいことの詳細を追加できますか?たとえば、散布図では、プロットが 'p'変数で参照されている場合は、単に' p.set_offsets'を実行してデータを再定義することができます。おそらく 'ax.get_children()'のようなことをして、それらのオブジェクトの1つを変更することができます。ウィジェットの場合、ipywidgetsには更新する関数を定義することができる 'observe'メソッドがあると思いますが、あなたのプロットを変更する関数を定義することができます –

+0

100行のプロットを表示したい(plt.plot(HEAVY_DATA_SET) )そして、それらの行の上に垂直矩形を追加するだけです。 – gota

+0

おそらく 'ax.get_children()'から矩形を削除し、その矩形を再描画できますか?たとえば、 'ax.get_children()'を呼び出すと、リスト内にいくつかの '

答えて

1

ありがとう:

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)を実行する必要があります。x0y0は新しい座標です。

関連する問題