использование неглобальных переменных внутри функции onselect объекта SpanSelector - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь нарезать и сохранять данные (pandas .DataFrame с несколькими столбцами) на основе объектов, видимых на графике, в отдельные файлы каждый раз, когда я выбираю срез. До сих пор я использовал matplotlib SpanSelector с его функцией onselect . Тем не менее, это работает только с глобальными переменными, так как теперь, кажется, есть простой способ передать DataFrame в функцию. Есть ли какое-либо решение, чтобы избежать объявления глобальной переменной каждый раз?

Сам DataFrame происходит из программы, которая считывает входной файл в DataFrame.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector



def get_data():
    # example of DataFrame, real Data will come from input-files
    x = np.arange(100,step=0.2)
    y = np.sin(x)
    y2 = np.cos(x)
    data = pd.DataFrame(np.array((y,y2)).transpose(), index=x, columns=["a","b"])
    return data

def cut_data(data_frame):
    # use a single plot or as many subplots as there are columns in dataframe if more than one
    if data_frame.shape[1] == 1:
        fig, ax = plt.subplots(data_frame.shape[1], 1, sharex=True)
        ax.plot(data_frame)
        span = SpanSelector(ax, onselect, 'horizontal', useblit=True,
                        rectprops=dict(alpha=0.35, facecolor='red'), span_stays=True)
    else:
        fig, axlst = plt.subplots(data_frame.shape[1], 1, sharex=True)
        for n, col in enumerate(data_frame):
            axlst[n].plot(data_frame[col])
        span = SpanSelector(axlst[0], onselect, 'horizontal', useblit=True,
                        rectprops=dict(alpha=0.35, facecolor='red'), span_stays=True)
    plt.show()

def onselect(xmin, xmax):
    pass
    # get indices of x-values each time a subset of the data is selected
    # slice every column in DataFrame and save to file as new DataFrame


cut_data(get_data())

1 Ответ

0 голосов
/ 12 февраля 2020

Я написал вызываемый объект, чтобы обойти проблему

class OnselectObject(object):
'''
This classed is used to circumvent the limitations of the matplotlib SpanSelector object
'''
def __init__(self, data_frame):
    self.data = data_frame

def __call__(self, xmin, xmax):
    cut_data = self.data[:][xmin:xmax] # this is awesome
    save_cut_data(cut_data)
...