2017-11-17 2 views
0

Matplotlib GUI을 만들고 x 및 y 축의 대화식 크기를 조정하려고합니다. 이를 위해 4 개의 텍스트 상자를 사용하여 각각 x 및 y 축 제한의 최소 및 최대를 설정할 수 있습니다. 내가 지금까지 가지고있는 코드는 다음과 같습니다 여러 텍스트 상자에 적합한 제출 기능

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 텍스트 상자의 값을 수집하고 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