2017-11-17 6 views
0

MatplotlibをGUIにして、x軸とy軸をインタラクティブに再スケーリングしたいと考えています。このために、x軸とy軸のそれぞれの最小値と最大値を設定できる4つのテキストボックスを使用します。私が今まで持っているコードは次のとおりです。 複数のテキストボックスに適切なサブミット関数

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.widgets import TextBox 
import matplotlib.gridspec as gridspec 

fig, ax = plt.subplots() 
ax.plot([1,3,2]) 

fig.subplots_adjust(bottom=0.4) 
gs = gridspec.GridSpec(2,2) 
gs.update(left=0.4, right=0.7, bottom=0.15, top=0.25, hspace=0.1) 

axes = [fig.add_subplot(gs[i,j]) for i,j in [[0,0],[0,1],[1,0],[1,1]]] 
# create the textboxes 
tb_xmin = TextBox(axes[0],'x', hovercolor='0.975', label_pad=0.1) 
tb_xmax = TextBox(axes[1],'', hovercolor='0.975') 
tb_ymin = TextBox(axes[2],'y', hovercolor='0.975', label_pad=0.1) 
tb_ymax = TextBox(axes[3],'', hovercolor='0.975') 

def submit(val): 
    data = eval(val) 
    # how to know which limit to set here? 
    ax.set_xlim(data) 
    plt.draw() 

for tb in [tb_xmin,tb_xmax,tb_ymin,tb_ymax]: 
    tb.on_submit(submit) 
plt.show() 

enter image description here

は、しかし、私は submit機能で立ち往生しています。私は、どのテキストボックスがサブミットして入力するかを認識し、入力が有効でデータアレンジ内にあるという条件の下で適切な最小値または最大値を設定する関数を持っています。
誰も私を助けることができますか?

答えて

0

TextBox入力を介して制限を更新するには、値とともにいくつかの引数を関数に渡すことができます。これを行う方法は、ラムダ関数を作成することです。ラムダ関数は更新する制限に応じて、事前に引数が設定されています。

def submit(val,func,pos): 
    data = float(val)  
    func([data,None][::pos]) 

tb_xmin.on_submit(lambda val: submit(val, ax.set_xlim, 1)) 
tb_xmax.on_submit(lambda val: submit(val, ax.set_xlim, -1)) 
tb_ymin.on_submit(lambda val: submit(val, ax.set_ylim, 1)) 
tb_ymax.on_submit(lambda val: submit(val, ax.set_ylim, -1)) 

別のオプションは、常に提出に同じ関数を呼び出すと関数は、すべての4つのTextBoxの値を収集し、simulataneously制限を設定できるようになります。

import matplotlib.pyplot as plt 
from matplotlib.widgets import TextBox 
import matplotlib.gridspec as gridspec 

fig, ax = plt.subplots() 
ax.plot([1,3,2]) 

fig.subplots_adjust(bottom=0.4) 
gs = gridspec.GridSpec(2,2) 
gs.update(left=0.4, right=0.7, bottom=0.15, top=0.25, hspace=0.1) 

axes = [fig.add_subplot(gs[i,j]) for i,j in [[0,0],[0,1],[1,0],[1,1]]] 
# create the textboxes 
xlim = ax.get_xlim() 
ylim = ax.get_ylim() 
tb_xmin = TextBox(axes[0],'x', initial = str(xlim[0]), hovercolor='0.975', label_pad=0.1) 
tb_xmax = TextBox(axes[1],'', initial = str(xlim[1]), hovercolor='0.975') 
tb_ymin = TextBox(axes[2],'y', initial = str(ylim[0]), hovercolor='0.975', label_pad=0.1) 
tb_ymax = TextBox(axes[3],'', initial = str(ylim[1]), hovercolor='0.975') 

def submit(val): 
    lim = [float(tb.text) for tb in [tb_xmin,tb_xmax,tb_ymin,tb_ymax]] 
    ax.axis(lim) 
    fig.canvas.draw_idle() 

for tb in [tb_xmin,tb_xmax,tb_ymin,tb_ymax]: 
    tb.on_submit(submit) 
plt.show() 
+0

あなたは素晴らしいです、ありがとうございます! – STJ

+0

これを別の質問として投稿しました。私は、TextBoxウィジェットをmatplotlibに追加すると、TextBoxを使用しないときにインタラクションが遅くなることに気付きました。これはTextBoxウィジェットの一般的な側面ですか? – STJ

関連する問題