关闭matplotlib图后继续编码

时间:2017-12-13 09:42:01

标签: python matplotlib

我正在编写一个例程,我可以附加一组数据文件。代码的第一部分导入单个数据文件并使用matplotlib显示它。然后我可以使用滑块来定义特定的x范围(即排除噪声或不相关的部分)。代码的第二部分涉及一个编辑例程,其中我根据这个新设置的x范围编辑特定文件夹中所有数据文件的范围(即删除所有行)。

代码的第一部分对我来说不是问题,导致以下界面。我的问题在于第二部分。我希望Edit按钮关闭图形并继续其余代码(数据文件编辑部分)。这是必要的,因为我需要滑块值来定义新的数据范围。 enter image description here 我最初的想法是在plt.show()之后放置代码的第2部分。 Edit按钮只会关闭图形,其余代码将继续。我不使用实际数据的代码示例:

### Part 1 ###

import os
import sys
import six
import tkinter as tk
from tkinter import Tk
from tkinter import filedialog
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.gridspec as gridspec
from matplotlib.widgets import Slider, Button


class MinMaxSlider(Slider):
    def __init__(self, ax, label, valmin, valmax, **kwargs):

        self.valinit2 = kwargs.pop("valinit2", valmax)
        self.val2 = self.valinit2
        Slider.__init__(self,ax, label, valmin, valmax, **kwargs)
        self.poly.xy = np.array([[self.valinit,0],[self.valinit,1],
                        [self.valinit2,1],[self.valinit2,0]])
        self.vline.set_visible(False)
    def set_val(self, val):

        if np.abs(val-self.val) < np.abs(val-self.val2):
            self.val = val
        else:
            self.val2 = val
        self.poly.xy = np.array([[self.val,0],[self.val,1],
                                 [self.val2,1],[self.val2,0]])
        self.valtext.set_text(self.valfmt % self.val +"\n"+self.valfmt % self.val2)
        if self.drawon:
            self.ax.figure.canvas.draw_idle()
        if not self.eventson:
            return
        for cid, func in six.iteritems(self.observers):
            func(self.val,self.val2)

def update(mini,maxi):
    ax.set_xlim(mini,maxi)

def edit(event):
    plt.close() 

def find_nearest(array,value):
    return (np.abs(array-value)).argmin()

## Part 1 ##

plt.ion()

x = np.array(range(100))
y_low = 10*np.array(range(100))
y_high = 10*np.array(range(100))

font = {'family' : 'Calibri',
        'weight' : 'normal',
        'size'   : 14}
mpl.rc('font', **font)
axcolor = 'lightgoldenrodyellow'

fig,(ax, sliderax) = plt.subplots(figsize=(12,8), 
                                  nrows=2,gridspec_kw={"height_ratios":[1,0.05]})
fig.subplots_adjust(hspace=0.5)

ln1 = ax.plot(x,y_low, color = 'dodgerblue', label = 'Low')
ax.set_xlabel('x', fontsize=24)
ax.xaxis.labelpad = 15
ax.set_ylabel('y', fontsize=24, color = 'dodgerblue')
ax.yaxis.labelpad = 15
for tl in ax.get_yticklabels():
    tl.set_color('dodgerblue')

ax1 = ax.twinx()
ln2 = ax1.plot(x,y_high, color = 'darkred', label = 'High')
ax1.set_ylabel('y', fontsize=24, color = 'darkred')
for tl in ax1.get_yticklabels():
    tl.set_color('darkred')

lns = ln1+ln2
labs = [l.get_label() for l in lns]
ax1.legend(lns, labs, loc=0)

slider = MinMaxSlider(sliderax,'x(min/max)',x.min(),x.max(),
                      valinit=x.min(),valinit2=x.max())

slider.on_changed(update)
update(x.min(),x.max())

resetax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(resetax, 'Edit', color=axcolor, hovercolor='0.975')
button.on_clicked(edit)

plt.show()

## Part 2 ##

idx_low = find_nearest(x, slider.val)
idx_high = find_nearest(x, slider.val2)
print(idx_low)
print(idx_high)         

然而,在图形打开时,idx_lowidx_high已经计算并打印,因此基于滑块的初始值。我希望在单击Edit按钮并关闭图形后计算它们,以便它们基于用户设置的滑块值。我怎样才能做到这一点?我是否需要编辑Edit事件功能?谢谢你的帮助。

0 个答案:

没有答案