Указание, какую именно строку удалить из сюжета matplotlib - PullRequest
0 голосов
/ 24 апреля 2018

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

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

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

enter image description here

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()

1 Ответ

0 голосов
/ 24 апреля 2018

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

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...