Я делаю интерфейс, где у меня есть кнопки «очистить это» и «очистить» для удаления различных элементов сюжета.
Проблема с matplotlib заключается в том, что я должен знать точный порядок построения объектов, чтобы удалить правильный с помощью ax.lines.pop(). Например, график может содержать необработанные данные, затем сглаженную версию, а затем подгонку сверху, но в зависимости от порядка их вызова ax.lines.pop(2) удалит либо синюю, либо красную линию.
Но как я могу последовательно удалять, например, красная линия в многоуровневом сценарии?
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()






Для ясности и простоты изложения в следующем примере рисуется один график, и вместо удаления линии он переключает ее видимость. Обратите внимание, что две строки помечены явно, а третьей по умолчанию присвоена метка. Мы используем эти метки для индексации пути к линии.
Если вы действительно хотите удалить строку, просто замените вызов 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()).