关闭matplotlib figu后继续代码

2024-04-23 23:39:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

代码的第一部分对我来说不是问题,并导致以下界面。我的问题是第二部分。我希望Edit按钮关闭图形并继续其余代码(数据文件编辑部分)。这是必要的,因为我需要滑块值来定义新的数据范围。 enter image description here 我最初的想法是把代码的第2部分放在plt.show()之后。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_low和{}已经在图形打开时计算和打印,因此基于滑块的初始值。我希望在单击Edit按钮并关闭图形后计算它们,以便它们基于用户设置的滑块值。我怎样才能做到这一点?我需要编辑Edit事件函数吗?谢谢你的帮助。在


Tags: 代码importself编辑matplotlibasnpplt