Указание, какую именно строку удалить из графика matplotlib

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

Проблема с matplotlib заключается в том, что я должен знать точный порядок построения объектов, чтобы удалить правильный с помощью ax.lines.pop(). Например, график может содержать необработанные данные, затем сглаженную версию, а затем подгонку сверху, но в зависимости от порядка их вызова ax.lines.pop(2) удалит либо синюю, либо красную линию.

Но как я могу последовательно удалять, например, красная линия в многоуровневом сценарии?

Указание, какую именно строку удалить из графика matplotlib

import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import medfilt

a = np.random.normal(0, 1, 100)
b = medfilt(a, 17)

fig1, axes = plt.subplots(ncols = 2)

ax1, ax2 = axes

ax1.set_title("Figure 1")
ax1.plot(a, color = "darkgrey")  # 0
ax1.plot(b, color = "firebrick") # 1
ax1.axhline(0.5, color = "blue") # 2

ax1.lines.pop(2)

ax2.set_title("Figure 2")
ax2.plot(a, color = "darkgrey")  # 0
ax2.axhline(0.5, color = "blue") # 2
ax2.plot(b, color = "firebrick") # 1

ax2.lines.pop(2)

plt.show()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
252
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для ясности и простоты изложения в следующем примере рисуется один график, и вместо удаления линии он переключает ее видимость. Обратите внимание, что две строки помечены явно, а третьей по умолчанию присвоена метка. Мы используем эти метки для индексации пути к линии.

Если вы действительно хотите удалить строку, просто замените вызов set_visible () своим вызовом pop (), c.f. ax.lines.pop (п).

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

import numpy as np
from scipy.signal import medfilt

a = np.random.normal(0, 1, 100)
b = medfilt(a, 17)

fig = plt.figure()
ax  = fig.add_subplot(1,1,1)

# Create a graph with two curves, and save the lines
ax.set_title("Figure 1")
ax.plot(a, label='a', color = "darkgrey")  # 0
ax.plot(b, label='b', color = "firebrick") # 1
ax.axhline(0.5, color = "blue") # 2

# Show the labels
plt.legend()

# Labels and initial states for buttons
labels = []
states = []
for l in ax.lines:
    labels.append( l.get_label() )
    states.append( l.get_visible() )

# Add a box with checkbuttons
plt.subplots_adjust(right=0.8)
bx = plt.axes( [0.85,0.4,0.1,0.15] )
cb = CheckButtons( bx, labels, states )

# Function to toggle visibility of each line
def toggle( label ):
    n = labels.index(label)
    ax.lines[ n ].set_visible( not ax.lines[ n ].get_visible() )
    plt.draw()

# Connect the function to the buttons
cb.on_clicked( toggle )

# And start the show
plt.show()

Замечательно! Все, что вам действительно нужно, это соответствующим образом пометить строки, а затем переключить видимость с помощью n = labels.index("a"); ax.lines[n].set_visible(not ax.lines[n].get_visible()).

komodovaran_ 25.04.2018 14:17

Рад, что тебе это нравится. Спасибо. Я нарисовал третью строку без указания метки, чтобы показать, как использовать ее метку по умолчанию, если это тоже может быть полезно.

DrM 25.04.2018 19:42

Другие вопросы по теме