Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

Matplotlib ウィジェット

Matplotlib は静的プロット専用ではありません。 GUI は通常、次のような GUI ライブラリとフレームワークを使用して作成されます。 PyQt, トキンター, キビー & wxPythonPython は PyQt と優れた統合を持っていますが、Tkinter & wxPython – いくつかの基本的な GUI 機能にはこれらを使用する必要はありません。 Matplotlib ウィジェット.

  matplotlib.widgets モジュールにはいくつかのクラスがあります。 AxesWidget、そのうち Buttons, CheckButtons, Sliders, TextBoxesなどが派生します。 これらはすべて受け入れます Axes これらは唯一の必須のコンストラクター引数として追加されており、その位置は手動で設定する必要があります。 注意すべき点は、 ウィジェットは軸ですを作成します。 Axes 各ウィジェットのインスタンス。

注意すべきもう一つのことは ウィジェットへの参照を保持する必要があります そうしないと、ガベージ コレクションが行われる可能性があります。

設定によってそれぞれを無効にすることもできます active 〜へ False, この場合、クリックなどのイベントには反応しません。 そうは言っても、さまざまな GUI 要素やコンポーネントを通じて、新しいタイプの対話性をプロットに導入できます。

注: Matplotlib は、高品質の GUI の作成やユーザーフレンドリーなシステムの使用を目的としたものではありません。 これらのウィジェットは初歩的なもので、あまり見栄えがよくなく、機能も限られています。 これらは、実際に出荷するのではなく、プロトタイプを作成してテストする方法を目的としています。

以前に PyQt を使用したことがある場合は、これらのウィジェットを追加するための一般的な構文とアプローチ、およびウィジェットをイベント ハンドラーに接続する方法は、かなり馴染みのあるものであることに気づくかもしれません。

ボタンの追加

まずは始めましょう ボタン - matplotlib.widgets モジュールはを定義します Button クラス。 それに接続するには、 on_clicked() function、私たちが提供する関数を実行します。 クリックが検出されると、関数が実行されます。

ボタンの作成中に、 Axes 位置決めに使用されます。 を渡すこともできます label その際に、テキストを追加してユーザーに注釈を付けます。 の color & hovercolor 引数は、ボタンの上にマウスを置く前後のボタンの色を定義します。

すべてのウィジェットの位置とスペースを管理するので、次のウィジェットを作成しましょう。 Figure & Axes、ボタンを追加し、空の散布図をプロットするために下部にある程度のスペースを確保します。 次に、 EventHandler 単一のメソッドを持つクラス add_random()。 このメソッドは XNUMX つの乱数を生成し、それらのマーカーを Axes 以前に作成して呼び出した plt.draw()を再描画します。 Figure。 プロットを更新するときは、常に呼び出す必要があります plt.draw() もう一度実際に更新するには:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
plot = ax.scatter([], []) class EventHandler: def add_random(self, event): x = np.random.randint(0, 100) y = np.random.randint(0, 100) ax.scatter(x, y) plt.draw() # Axes for the Button and positioning
# xposition and yposition in percentages, width, height
button_ax = plt.axes([0.7, 0.05, 0.2, 0.07])
# Create Button and assign it to `button_ax` with label
button = Button(button_ax, 'Add Random', color='green', hovercolor='red')
# On a detected click, execute add_random()
button.on_clicked(EventHandler().add_random) plt.show()

これにより、 Figure、空の Axes その内部と、画面の右上隅にあるボタン Axes:

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

そして、ボタンを数十回押した後、 ax ランダムなマーカーが入力されます。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

より実践的に言えば、 サイクル ボタンを押すたびにプロットされるフィーチャの数。 これにはいくつかの調整が必要です EventHandler、そのサイクルに戻るための別のボタンもあります。

を使ってみましょう 赤ワインの品質 データセットを再度作成し、いくつかの特徴を視覚化します。 アルコール 特徴。 これらを個別にプロットする必要はないので、XNUMX つのフィーチャを他のフィーチャに対してプロットするコードを記述し、そのコードを変更して別のフィーチャを他のフィーチャに対してプロットします。

ここでは散布行列の作成が役立つかもしれませんが、データセットに多くの特徴がある場合、かなり読みにくくなり、先に進むことはできません。 ご希望の場合は 両言語で 簡単に表示して解釈できる大規模なプロット、 同じように 追加の労力を必要とせずに複数の機能を循環させることができるため、ボタンを使用してこのプロセスを自動化できます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv')
plot = ax.scatter([], []) class EventHandler: i = 0 # Find and plot next feature, re-draw the Axes def next_feature(self, event): # If the counter is at the end of the columns # Revert it back to 0 to cycle through again if self.i >= len(df.columns): self.i = 0 # Clear Axes from last plot ax.cla() # Plot a feature against a feature located on the `i` column ax.scatter(df['alcohol'], df.iloc[:,self.i]) # Set labels ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) # Increment i self.i += 1 # Update Figure plt.draw() def previous_feature(self, event): # If the counter is at the start of the columns # Revert it back to the last column to cycle through if self.i <= 0: self.i = len(df.columns)-1 ax.cla() ax.scatter(df['alcohol'], df.iloc[:,self.i]) ax.set_xlabel('Alcohol') ax.set_ylabel(df.columns[self.i]) self.i -= 1 plt.draw() # Add buttons
button1_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
next_button = Button(button1_ax, 'Next Feature')
next_button.on_clicked(EventHandler().next_feature) button2_ax = plt.axes([0.45, 0.02, 0.2, 0.07])
previous_button = Button(button2_ax, 'Previous Feature')
previous_button.on_clicked(EventHandler().previous_feature) plt.show()

  EventHandler クラスには XNUMX つのメソッドが追加されました – next_feature() & previous_feature()。 これらは両方とも、カウンターが i 列リストの末尾または先頭に達しました – そして、 IndexError、インデックスを反対の値にリセットし、 サイクル。 以下に進みます 0 私たちを元に戻します end 列リストの最後の列の上に移動すると、最初の列に戻ります。

私たちがどこにいるかを確認した後、私たちは クリア Axesを介して既存のプロットをクリアせずに、その上に再度プロットすることになるためです。 cla() (cla×)。 あるいは、フィーチャ関係を重ねてプロットし、 cla() サイクルの終了時または開始時にインデックスをリセットするときのステートメント。

クリアした後 Axes – ペイントするための透明なキャンバスがあります。 ax.scatter() 関数。 この例では、固定機能は次のとおりです。 アルコール, したがって、常に存在します。 他の機能はさまざまで、以下からアクセスできます。 iloc[]、列のインデックスを渡します。 これは、 Series このプロットで使用できます。 同様に、アクセスできます 列名 インデックスを通じても – df.columns[index]、Y 軸のラベルを設定するために使用されます。

最後に、カウンターを増減して呼び出します。 plt.draw() 更新する Figure:

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

クリックしたら 次の機能 ボタンをクリックすると、列リストの次のフィーチャがプロットされます。 アルコール、 そしてその Figure ラベル、マーカー、スケールは適切に更新されます。 逆も同様です – 前の機能 はリストを逆方向に走査し、サイクルの終わりまたは始まりに到達するたびにカウンタをリセットする安全メカニズムを備えた、前後のサイクルを可能にします。

ラジオボタンとチェックボックスの追加

ラジオボタン ユーザーが選択できるようにするために使用されます XNUMX つの値いくつかの値。 一度に選択できるラジオ ボタンは XNUMX つだけであり、通常は選択肢を表します。 チェックボックス ユーザーに複数のオプションを一度に選択させたい場合に使用できます。

注: チェックボックスが有効かどうかを確認する機能は非常に限られています。 on or オフ。 実際、すぐに使えるものは何もありません。 チェックできるのは、ボックスが 押し or 、それ以前の状態がわからないため、使用方法に重大な制限が生じます。 唯一の代替方法は、ボックスの現在の状態に関する独自のカウンター/チェックをブール値で保持し、それに基づいてロジックを変更することです。

これにより、たとえば、各項目にチェックボックスを追加できます。 カスタマイズ引数 特定のプロットの、ユーザーがそれらを設定できるようにする True or False (チェック済みまたはチェックなし)、またはこれらの状態に基づくその他の競合しないマッピング。

ただし、API 自体に制限があるため、意図した使用法 (オンとオフの切り替え) に限定します。 XNUMX つの機能があり、それらを切り替えることができます on & オフ チェックボックス経由。 この機能も、表示されているかどうかを確認できるオブジェクトに限定されていることに注意してください。

一方、シーケンスの XNUMX 番目に呼び出されるステートメントのみが適用されるため、ユーザーが XNUMX つのスケールを同時に適用したり、XNUMX つの X 制限を同時に設定したりすることは望ましくありません。 これらには、ラジオ ボタンを使用します。

いくつかのラジオ ボタンを追加して、ユーザーがいくつかのラジオ ボタンを使用して軸の範囲を選択できるようにします。また、フィーチャの視覚化を切り替えることもできるようにします。 on & オフ:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons
from matplotlib.widgets import RadioButtons fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') # Plot two line plots for two features, and turn them invisible
line1, = ax.plot(df['fixed acidity'], visible=False)
line2, = ax.plot(df['citric acid'], visible=False) class EventHandler: # set_range handler def set_range(label): if (label == 'Small Range'): ax.set_xlim(0, 1600) ax.set_ylim(0, 25) else: ax.set_xlim(0, 1600) ax.set_ylim(0, 50) plt.draw() # Turn off, if on, and on if off def apply_features(label): if (label == 'Fixed Acidity'): line1.set_visible(not line1.get_visible()) elif (label == 'Citric Acid'): line2.set_visible(not line2.get_visible()) plt.draw() # Add radio buttons and checkboxes
ranges_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
range_radio_buttons = RadioButtons(ranges_ax, ('Small Range', 'Large Range'))
range_radio_buttons.on_clicked(EventHandler.set_range) checkboxes_ax = plt.axes([0.4, 0.02, 0.25, 0.1])
checkboxes = CheckButtons(checkboxes_ax, ('Fixed Acidity', 'Citric Acid'))
checkboxes.on_clicked(EventHandler.apply_features) plt.show()

繰り返しますが、次の XNUMX つのメソッドがあります。 EventHandler() クラス– set_range() & apply_features()を選択します。 set_range() このメソッドは、範囲を「小」または「大」のいずれかに設定します。 Axes' X および Y の制限。 の apply_features() 関数は、 visible 現在のデータに基づいて、以前に作成したライン プロットのフィールド visible 状態。 もし visible == True、ラインプロットをオフにし、その逆も同様です。

以前にチェックボックスがチェックされているかどうかを確認できないため、ラインプロットの表示/非表示をチェックする組み込み機能に頼る必要があります。 これと同じ能力を次のコマンドでエミュレートできます。 status のスコープ内のブール値 EventHandler() に設定されているクラス True & False クリックするたびに、すぐに表示されるかどうかのチェックをサポートしていないプロット タイプの場合。

このコードを実行すると、 Figure 下部にボタンが XNUMX セットあります。 両方のチェックボックスをオンにすると、両方の折れ線グラフが表示されます。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

それらを個別にオフにすることができます。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

そして、範囲を変更することができます Axes ラジオボタン経由:

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

テキストボックスの追加

テキストボックス 〜に慣れる 収集する ユーザーからのデータ – そしてこのデータに基づいてプロットを変更できます。 たとえば、ユーザーに特徴の名前を入力するように依頼したり、プロットを視覚化するための関数を挿入するように依頼したりできます。 もちろん、ユーザー入力の操作は難しい場合があります。常に注意すべきエッジケースが存在します。

ユーザーが入力できるようにするスクリプトを書いてみましょう。 機能名 データセットの、そして Axes 入力を反映するために各提出物を更新します。 ユーザーの便宜を図るため、入力が列名と一致しなかった場合はユーザーに通知します。

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import TextBox fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('winequality-red.csv') class EventHandler: def submit(feature_name): if feature_name != "" or feature_name != None: if feature_name in df: ax.cla() ax.plot(df[feature_name]) else: if len(textbox_ax.texts) > 2: del textbox_ax.texts[-1] textbox_ax.text(-2, 0.4, feature_name + ' was not found.') plt.draw() textbox_ax = plt.axes([0.7, 0.02, 0.2, 0.1])
textbox = TextBox(textbox_ax, 'Feature Name')
textbox.on_submit(EventHandler.submit) plt.show()

提供されているかどうかを確認する簡単なチェックがあります feature_name 空白であるか、 None, その場合は何もしません。 そうでない場合は、 feature_name に存在する DataFrame、機能が存在しない場合は、その機能が見つからなかったというメッセージを添付します。 ただし、テキストを添付する前に、新しいメッセージが前のメッセージと重ならないように、前のメッセージが削除されていることを確認する必要があります。 の axes.texts プロパティはすべてのリストです。 Text 上のインスタンス Axes。 から Axes すでに持っています Text インスタンス、私たちのもの TextBox2 つ以下の場合は何も削除したくない Text インスタンスが存在する – エラー メッセージと TextBox ラベル。

XNUMX つ以上の場合は、すでにエラー メッセージが表示されているため、削除する必要があります。

機能の場合 is に存在する DataFrameただし、 Axes そしてそれをプロットします:

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

スパンセレクターの追加

スパンセレクター を使用すると、ユーザーがデータの範囲を選択してそれに焦点を当て、その選択に基づいて軸の制限を設定できるようになります。 デフォルトでは、多くのライブラリがこの機能をサポートしていますが、残念ながら Matplotlib はサポートしていないため、これを手動で行う必要があります。 さらに、追加する必要があります 「リセット」 必要に応じてボタンを押します ズームアウトする 同様に。

を追加する スパンセレクター、まったく新しいものを専用にする必要はありません。 Axes そのために、既存のものにアタッチできます。これは非常に理にかなっています。 を生成するとき、 SpanSelector、私たちはを供給します Axes それはイベント ハンドラーと同様に属し、その後に続きます。 'horizontal' or 'vertical'を回転させます。 Axes & スパンセレクター両方.

  useblit 引数は通常、次のように設定されます True ほとんどのバックエンドのパフォーマンスが向上するためです。 さらに、いくつかのスタイル プロパティを追加しました。 alpha スパン セレクターとして作成された長方形の 0.5facecolor 素敵な tab:blue:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
from matplotlib.widgets import Button fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2) df = pd.read_csv('AmesHousing.csv') ax.scatter(x = df['Year Built'], y = df['Total Bsmt SF'], alpha = 0.6) class EventHandler: def select_horizontal(x, y): ax.set_xlim(x, y) plt.draw() def reset(self): ax.set_xlim(df['Year Built'].min(), df['Year Built'].max()) plt.draw span_horizontal = SpanSelector(ax, EventHandler.select_horizontal, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='tab:blue')) button_ax = plt.axes([0.7, 0.02, 0.2, 0.07])
button = Button(button_ax, 'Reset')
button.on_clicked(EventHandler.reset) plt.show()

これを実行すると、スパンを選択し、軸の制限を指定された値に設定することで拡大できるプロットが生成されます。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

スライダーの追加

スライダー ユーザーはマーカーをスライドさせて値を選択することで、多くの値の中から直感的に選択できるようになります。 通常、スライダーは、プロット上の値 (範囲など) を継続的に更新するために使用されます。 or 特徴さえも。 たとえば、スライダーを使用して定数の値を調整すると、その定数に依存する関数に影響を与えることができます。

スライダーを使用して Y 軸と X 軸の制限を変更できるスクリプトを作成しましょう。これにより、データを表示する視点を変更できるようになります。

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2, left=0.2) df = pd.read_csv('winequality-red.csv')
plot, = ax.plot(df['volatile acidity']) class EventHandler: def update(val): ax.set_ylim(0, yslider.val) ax.set_xlim(0, xslider.val) plt.draw() xslider_ax = plt.axes([0.35, 0.03, 0.5, 0.07])
xslider = Slider( ax=xslider_ax, label="X-limit", valmin=0, valmax=len(df['volatile acidity']), valinit=len(df['volatile acidity']), orientation="horizontal"
) yslider_ax = plt.axes([0.03, 0.2, 0.07, 0.5])
yslider = Slider( ax=yslider_ax, label="Y-limit", valmin=0, valmax=3, valinit=1.5, orientation="vertical"
) xslider.on_changed(EventHandler.update)
yslider.on_changed(EventHandler.update) plt.show()

の左側と下部にスライダーができるようにパディングを調整しました。 Axes、簡単な折れ線グラフをプロットしました。 スライダーを追加するには、 Axes 他のほとんどのウィジェットと同様に、それを ax の引数 Slider コンストラクターを介して。 さらに、スライダーの最小値、最大値、初期値を設定できます。 これらは通常、プロットしているデータに基づくダイナミック レンジですが、スカラー値を手動で設定することもできます。

最後に、 Sliderは水平方向または垂直方向に配置できます。 これらはマウスのスワイプによって継続的に更新されるようになっているため、 on_changed() 関数は、ユーザーが入力を行ったときに応答をトリガーするために使用されます。 微調整しました EventHandler のクラス update() に基づいて X および Y の制限値を単純に調整する関数。 valそれぞれのスライダーの設定を変更します。

このコードを実行すると、XNUMX つのスライダーを含むプロットが生成され、これを使用してオブジェクトの範囲を変更できます。 Axes:

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

Matplotlib ウィジェット PlatoBlockchain データ インテリジェンス。垂直検索。あい。

タイムスタンプ:

より多くの スタックアバス