Matplotlib - создание графика с легендой CheckButton для неопределенного количества графиков - PullRequest
0 голосов
/ 09 апреля 2020

Я знаю, как создать легенду для графика, представляющего собой серию CheckButtons, используя метод, найденный здесь: https://matplotlib.org/3.1.1/gallery/widgets/check_buttons.html

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons

t = np.arange(0.0, 2.0, 0.01)
s0 = np.sin(2*np.pi*t)
s1 = np.sin(4*np.pi*t)
s2 = np.sin(6*np.pi*t)

fig, ax = plt.subplots()
l0, = ax.plot(t, s0, visible=False, lw=2, color='k', label='2 Hz')
l1, = ax.plot(t, s1, lw=2, color='r', label='4 Hz')
l2, = ax.plot(t, s2, lw=2, color='g', label='6 Hz')
plt.subplots_adjust(left=0.2)

lines = [l0, l1, l2]

# Make checkbuttons with all plotted lines with correct visibility
rax = plt.axes([0.05, 0.4, 0.1, 0.15])
labels = [str(line.get_label()) for line in lines]
visibility = [line.get_visible() for line in lines]
check = CheckButtons(rax, labels, visibility)


def func(label):
    index = labels.index(label)
    lines[index].set_visible(not lines[index].get_visible())
    plt.draw()

check.on_clicked(func)

plt.show()

Моя конкретная проблема имеет размер графики, которые будут расти, когда мы будем тестировать больше образцов. Как я могу структурировать свой код так, чтобы в списке, который в прикрепленном коде назывался lines , постоянно добавлялись новые записи plt.subplots при запуске или обновлении кода?

Спасибо

1 Ответ

0 голосов
/ 09 апреля 2020

IIU C, вы можете сделать что-то подобное и создать функцию, которая возвращает дескрипторы строк. Затем используйте append для обновления списка. По мере роста ваших дочерних участков вызовите пользовательскую функцию addplotlines, чтобы создать дополнительные маркеры.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons

t = np.arange(0.0, 2.0, 0.01)
s0 = np.sin(2*np.pi*t)
s1 = np.sin(4*np.pi*t)
s2 = np.sin(6*np.pi*t)

fig, ax = plt.subplots()

def addplotlines(t,s, color, label, visible=True):
    l, = ax.plot(t, s, visible=visible, lw=2, color=color, label=label)
    plt.subplots_adjust(left=0.2)
    return l

lines = []
lines.append(addplotlines(t, s0, 'k', '2 Hz', False))
lines.append(addplotlines(t, s1, 'r', '4 Hz', True))
lines.append(addplotlines(t, s2, 'g', '6 Hz', True))

# Make checkbuttons with all plotted lines with correct visibility
rax = plt.axes([0.05, 0.4, 0.1, 0.15])
labels = [str(line.get_label()) for line in lines]
visibility = [line.get_visible() for line in lines]
check = CheckButtons(rax, labels, visibility)


def func(label):
    index = labels.index(label)
    lines[index].set_visible(not lines[index].get_visible())
    plt.draw()

check.on_clicked(func)

plt.show()
...