Как создать интерактивную легенду для matplotlib, чтобы я мог удалять линии из своего графика? - PullRequest
0 голосов
/ 06 декабря 2018

В идеале хотелось бы реализовать это с крестиками рядом с метками легенды, по которым можно щелкнуть, чтобы удалить линию из графика.Прямо сейчас я пытаюсь сделать это, просто нажав на строку записи легенды, чтобы удалить график из графика;Я делаю это посредством словаря, отображающего запись легенды в линию на графике.У меня проблема в том, что когда на график добавляется более одной линии, я могу удалить все линии, кроме первой.Я подозреваю, что эта проблема может быть из-за того, что я воссоздаю легенду, которая может мешать отображению словаря.

Инициализация графика в методе класса init как таковом,

f = Figure(figsize=(1, 1), dpi=100)
self.chart = f.add_subplot(111)
self.lined = dict()
self.canvas = FigureCanvasTkAgg(f, self)
self.canvas.draw()
self.canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
self.canvas.mpl_connect('pick_event', self.remove_graph)

И это функции, относящиеся к построению линий и их удалению.

def plot_prices(self, event=None):
    ticker = self.entry.get().upper()
    with open(suffixed_ticker_dump_path, 'rb') as tickers:
        tickers = pickle.load(tickers)
        if ticker not in tickers:
            self.popupmsg("Invalid ticker input. Enter a valid ticker.")
        else:
            df = pd.read_csv(os.path.join(daily_data_dir, '{}.csv'.format(ticker)),
                             index_col=0, parse_dates=True)
            prices = df['adjusted_close'].replace(0, np.nan)
            line,=self.chart.plot(prices.interpolate(), label=ticker)

            self.leg = self.chart.legend(loc='lower right')
            legline = self.leg.get_lines()[-1]
            legline.set_picker(5)
            self.lined[legline] = line

            self.canvas.draw()

def remove_graph(self, event=None):
    legline = event.artist
    origline = self.lined[legline]
    origline.remove()
    self.leg = self.chart.legend(loc='lower right')
    self.canvas.draw()

1 Ответ

0 голосов
/ 09 декабря 2018

Закончилось устранение проблемы путем простой очистки и сброса записей легенды отображения словаря в линии на графике после построения или удаления линии.Я полагаю, что раньше это не работало из-за некоторой технической сложности со ссылками на линии, отличающиеся в легенде и диаграмме, если у кого-то нет лучшего решения, я буду использовать это, так как это не слишком лишний код.

def plot_prices(self, event=None):
    ticker = self.entry.get().upper()
    with open(suffixed_ticker_dump_path, 'rb') as tickers:
        tickers = pickle.load(tickers)
        if ticker not in tickers:
            self.popupmsg("Invalid ticker input. Enter a valid ticker.")
        else:
            df = pd.read_csv(os.path.join(daily_data_dir, '{}.csv'.format(ticker)),
                             index_col=0, parse_dates=True)
            prices = df['adjusted_close'].replace(0, np.nan)
            line,=self.chart.plot(prices.interpolate(), label=ticker)
            self.leg = self.chart.legend(loc='lower right')
            self.reset_line_dict()
            self.canvas.draw()

def remove_graph(self, event=None):
    legline = event.artist
    origline = self.lined[legline]
    self.chart.lines.remove(origline)
    self.leg = self.chart.legend(loc='lower right')
    self.reset_line_dict()
    self.canvas.draw()

def reset_line_dict(self):
    self.lined.clear()
    for legline, origline in zip(self.leg.get_lines(), self.chart.get_lines()):
        legline.set_picker(5)  # 5 pts tolerance
        self.lined[legline] = origline
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...