私はMatplotlib NavigationToolbar2TkAggボタンを使ってサブプロットをナビゲートするために、同じデータをプロットするTkinterキャンバスに2つのmatplotlibサブプロットを持っています。トップパネルにデータの1つの領域を表示したいと思います(xlimits x1からx2 )、どちらのパネルでもユーザーがどのようにズーム/パンするかに基づいて、下のパネルにその領域からのオフセット(xlimits:x1 + offset〜x2 + offset)のデータが自動的に表示されます。私は基本的にTkinterのsharex/shareyの動作を探していますが、いくつかの単純な関数で制限値を操作しています。簡単な関数をトリガするNavigationToolbarイベントをキャッチする方法はありますか?私はこれについて間違ったやり方をしていますか?Tkinter内の他の制限に基づいてmatplotlibサブプロットの制限を自動的に更新しますか?
1
A
答えて
0
別のプロットの軸の限界に応じて、1つのプロットの新しい軸の制限を設定できます。両方の軸でxlim_changed
イベントを使用して、現在の制限に応じて他のプロットの制限を調整する関数を呼び出します。
制限を変更する前にイベントを切断して、無限ループにならないようにする必要があります。
以下は、下のプロットが上のものと比較して100単位だけシフトされた実装です。
import numpy as np; np.random.seed(1)
import matplotlib.pyplot as plt
x = np.linspace(0,500,1001)
y = np.convolve(np.ones(20), np.cumsum(np.random.randn(len(x))), mode="same")
fig, (ax, ax2) = plt.subplots(nrows=2)
ax.set_title("original axes")
ax.plot(x,y)
ax2.set_title("offset axes")
ax2.plot(x,y)
offset = lambda x: x + 100
inverse_offset = lambda x: x - 100
class OffsetAxes():
def __init__(self, ax, ax2, func, invfunc):
self.ax = ax
self.ax2 = ax2
self.func = func
self.invfunc = invfunc
self.cid = ax.callbacks.connect('xlim_changed', self.on_lims)
self.cid2 = ax2.callbacks.connect('xlim_changed', self.on_lims)
self.offsetaxes(ax, ax2, func)
def offsetaxes(self,axes_to_keep, axes_to_change, func):
self.ax.callbacks.disconnect(self.cid)
self.ax2.callbacks.disconnect(self.cid2)
xlim = np.array(axes_to_keep.get_xlim())
axes_to_change.set_xlim(func(xlim))
self.cid = ax.callbacks.connect('xlim_changed', self.on_lims)
self.cid2 = ax2.callbacks.connect('xlim_changed', self.on_lims)
def on_lims(self,axes):
print "xlim"
if axes == self.ax:
self.offsetaxes(self.ax, self.ax2, self.func)
if axes == self.ax2:
self.offsetaxes(self.ax2, self.ax, self.invfunc)
o = OffsetAxes(ax, ax2, offset, inverse_offset)
plt.show()
関連する問題
- 1. カウントに基づく制限
- 2. c#asp.netドロップダウンリストに基づいてテキストボックスを制限します
- 3. CBV CreateViewは、get_initial()に基づいてForeignKeyを制限します
- 4. "other"ディメンションに基づいてディメンションを制限します。
- 5. XSDの他の値に基づいてXML要素値を制限する
- 6. neo4j - ノードのランクに基づいてクエリを制限する
- 7. Environ( "Username")に基づいてデータベースへのアクセスを制限する
- 8. シリアルデータに基づいてTkinterウィンドウを動的に更新する
- 9. サブプロットのX制限を設定する
- 10. カスタム制限colormap matplotlib
- 11. SQLの更新制限
- 12. html5キャンバス内の動きを制限していますか?
- 13. 動的フォームフィールドの制限
- 14. 動的プログラミングアルゴリズムの制限
- 15. SQLAlchemyコアクエリの動的制限
- 16. PHPは制限に基づいてメモリ使用量を動的に処理しますか?
- 17. ユーザーグループに基づいてWCF Webサービス機能を制限する
- 18. IPアドレスに基づいてAzure Active Directoryアプリケーションアクセスを制限する
- 19. コンテンツタイプに基づいてPOST作成操作を制限する
- 20. Spring Security +ユーザ名に基づいてユーザを制限する
- 21. レコードIDに基づいて子ウィンドウを制限する
- 22. asp.netのいくつかの条件に基づいてソートを制限する
- 23. ユーザーのロールに基づいて返される行数を制限します。
- 24. Linux:フェアシェアに基づいてユーザーあたりのCPU /メモリリソースを制限します。
- 25. WooCommerceはカテゴリーに基づいて州への配送を制限します
- 26. データベースの行数を自動的に制限する方法は?
- 27. Jenkinsはユーザーに基づくビューを制限します
- 28. jQueryタイムピッカーの時間を動的に制限しますか?
- 29. matplotlibを使用して棒グラフのy軸の制限を自動的に設定する
- 30. 他のチェックボックスの選択に基づいてチェックボックスの選択を制限します