7

を使用してアニメーション画像を作成する驚くべき可能性がたくさんありますmpld3。ただし、「動く部分」はすべて JavaScript の責任のようです。さらに、インターネットやスタック オーバーフローでは、人々が直接その可能性を求めるリクエストがたくさんあります。

Python で動的 mpld3 プロットからデータを取得する

ドラッグ後の点情報取得

mpld3 の LinkedBrush プラグインで選択したポイントを「ダンプ」する方法は?

mpld3 ~ ポイントを選択して座標を取得しますか?

その中に参照がありますが、何らかのアラートやキャプションを使用することを提案しているため、すべての答えは間違っています. ただし、2番目のリンクは最も興味深いものです。HTMLフォームを追加し、ボタンを押して「client-javascript」から「server-python」にデータを送信することを提案しているためです。もう一つ面白いノートがあります

http://nbviewer.jupyter.org/gist/aflaxman/11156203

これは多くの人がインスピレーションの源として言及しています - 出力構成を .html ファイルに保存します。おそらく、このハードディスク交換を使用して、この情報を python でさらに進めることができます。

さらに進んで、IPYwidgets多くの例と真の相互作用のクライアントサーバーの可能性さえも発見しました。基本的に、基本的なスライダーとボタンから始めることができますが、これに基づいてより複雑なパッケージが構築されていることがわかりbqplotます。

私が望むのは、画像上のいくつかのポイントをドラッグアンドドロップし、それらを iPython に渡してさらにプロットを作成することです。これは非常に複雑で、JavaScript に移行することはできません。bqplotしかし、チームが多大な作業を行ったにもかかわらず、使用できるのは「事前定義された」相互作用のセットのみであるように思われるため、ドラッグ アンド ドロップの動作はここでも含まれていません。

mpld3 のソース コードを入力して (それほど深くではありませんが) 修正して、場合によっては ipywidgets とマージしようとしたとき、多くのことが非推奨になっていることに気付きました。 :ほとんどのポプラは非常に古いもので、問い合わせも非常に古いものです。そのため、混乱のために何もできませんでした。多くの例は、下位互換性がないために失敗します。

概要。ポイントをドラッグ アンド ドロップしてその座標を python に渡す方法を誰かが提供してくれたら嬉しいのですが、もっと役に立ちます - mpld3 からの情報をより「抽象的な方法」で渡す機能です。ケースを含めることができます。

4

3 に答える 3

4

質問されてからほぼ1年が経ちました。答えは ではありませんmpld3が、私はその特定の技術に固執しません。ユーザー @Drew が の使用bqplotを提案したので、関連するノートブックへのリンクを投稿します

https://github.com/bloomberg/bqplot/blob/master/examples/Interactions/Interaction%20Layer.ipynb

からbloomberg。これを開いた場合は、右上隅にあるリンクを見つけて、写真付きの外部 nbviewer にリダイレクトすることをお勧めします。ほとんどすべてがそこに含まれています。最小限の作業例を再現しようとしています。

jupyter notebookwith extensionbqplotや someを起動ipywidgetsするには、何らかの「魔法」をかけて動作させる必要がある場合があることに注意してください。jupyter install nbextensionや などのいくつかの bash コマンドに精通している必要がありますjupyter nbextension enablebqplot私は個人的にそれを機能させるために数時間苦労しなければなりませんでした. しかし、これは明らかに別の問題です。

試しに機能を起動してみましょうobserve。テスト関数my_callback(...)はイベントを出力するだけです。

%matplotlib inline
from bqplot import pyplot as plt

def my_callback(change):
    print change

scatt = plt.scatter([1,2,3],[4,5,6],enable_move=True)
scatt.observe(my_callback)
plt.show()

次のような素敵なプロットが得られます。 bqplot からのランダム プロット

ポイントをドラッグする機能が追加されました。ポイントをドラッグすると、python構造体である変更のリストが出力され、各イベントが別の行に表示されます。

ここに画像の説明を入力

{'owner': , 'new': {u'hovered_point': 1}, 'old': traitlets.Undefined, 'name': '_property_lock', 'type': 'change'}

{'owner': , 'new': 1, 'old': None, 'name': 'hovered_point', 'type': 'change'}

{'owner': , 'new': {}, 'old': {u'hovered_point': 1}, 'name': '_property_lock', 'type': 'change'}

{'owner': , 'new': {u'y': {u'type': u'float', u'values': [4, 4.863453784620906, 6]}, u'x': {u'type ': u'float', u'values': [1, 2.016078455307904, 3]}}, 'old': {}, 'name': '_property_lock', 'type': 'change'}

{'owner': , 'new': array([ 4. , 4.86345378, 6. ]), 'old': array([4, 5, 6]), 'name': 'y', 'type': '変化する'}

{'owner': , 'new': array([ 1. , 2.01607846, 3. ]), 'old': array([1, 2, 3]), 'name': 'x', 'type': '変化する'}

{'owner': , 'new': {}, 'old': {u'y': {u'type': u'float', u'values': [4, 4.863453784620906, 6]}, u' x': {u'type': u'float', u'values': [1, 2.016078455307904, 3]}}, 'name': '_property_lock', 'type': 'change'}

{'owner': , 'new': {u'hovered_point': None}, 'old': {}, 'name': '_property_lock', 'type': 'change'}

{'owner': , 'new': None, 'old': 1, 'name': 'hovered_point', 'type': 'change'}

{'owner': , 'new': {}, 'old': {u'hovered_point': None}, 'name': '_property_lock', 'type': 'change'}

構造を分解するのが少し難しいことは認めますが、注意深く見てみると、太線が に'name'等しく'_property_lock''new'サブ構造に フィールドu'x'andが含まれていることがわかりますu'y'。これは、"x" と "y" の Unicode です。

次に、これらの変更を追跡し、それに応じpythonて function 内でいくつかのコードを実行my_callback(...)できます。このプロット内に何かを描画したり、新しいプロットを作成したりすることもできます。驚くべきことに、これは何とか機能し、新しい jupyter を使用すると、ウィジェットでノートブックを保存することもできますこれは完全に驚くべきことです。

于 2017-05-11T14:06:37.673 に答える
2

これは newbqplot Scatterで行うことができ、Label両方にenable_moveパラメーターがあり、に設定するTrueとポイントをドラッグできます。さらに、orのorの値をdrag変更observeして、それを介して Python 関数をトリガーすると、新しいプロットが生成されます。xyScatterLabel

それは明らかですか?

于 2016-08-08T15:33:02.583 に答える
1

これも ではありませんが、 Is it really possible to pass data (callback) from mpld3 to ipython?での Sergey のコメント/質問に触発されたmpld3で使用する簡単な例を次に示します そしてセルゲイとドリューの答え。bqplotjupyter notebook

まずはbqplotanaconda環境にインストールしてノートブックを開く

(... do whatever to make anaconda work for you....)

conda install bqplot

jupyter notebook

次に、この調整可能なインタラクティブな散布図コードを最初のブロックに貼り付けます。

import numpy as np
from __future__ import print_function # So that this notebook becomes both Python 2 and Python 3 compatible
from bqplot import pyplot as plt

# And creating some random data
size = 10
np.random.seed(0)
x_data = np.arange(size)
y_data = np.cumsum(np.random.randn(size)  * 100.0)


# Creating a new Figure and setting it's title
plt.figure(title='An adjustable, extractable scatter plot')
# Let's assign the scatter plot to a variable
scatter_plot = plt.scatter(x_data, y_data)
plt.show()
scatter_plot.enable_move = True  # make the points movable

次に、プロットが表示されたら、データ ポイントを 1 つまたは 2 つクリック アンド ドラッグし、次のブロックでプロット内の変化を確認します。

print([x_data-scatter_plot.x,y_data-scatter_plot.y])

https://github.com/bloomberg/bqplot/blob/master/examples/Introduction.ipynbのコールバックが必要だと思っていましたが、変更時にコードをトリガーしたい場合にのみ必要です。

そのためには、次のようなものを試してください:

def foo(change):
    print('This is a trait change. Foo was called by the fact that we moved the Scatter')
    #print('In fact, the Scatter plot sent us all the new data: ')
    #print('To access the data, try modifying the function and printing the data variable')
    global pdata 
    pdata = [scatter_plot.x,scatter_plot.y]
    #print (pdata)

# Hook up our function `foo` to the coordinates attributes (or Traits) of the scatter plot
scatter_plot.observe(foo, ['y','x'])

次に、x,y座標のトリガーfooを変更し、グローバル変数を変更しますpdata。最初のブロックの出力に追加された の印刷出力が表示foo()され、更新された pdata が将来のコード ブロックで使用できるようになります。

于 2018-01-28T16:52:42.923 に答える