matplotlib plt.show () только выбранные объекты - PullRequest
5 голосов
/ 21 ноября 2011

У меня есть несколько plt.plot экземпляров, и я хотел только plt.show() определенных объектов. Для иллюстрации приведем код:

import matplotlib.pyplot as plt

ax1 = plt.plot(range(5),range(5))
ax2 = plt.plot([x+1 for x in range(5)],[x+1 for x in range(5)])
ax3 = plt.plot([x+2 for x in range(5)],[x+2 for x in range(5)])

#plt.show([ax1,ax2])
plt.show()

Так что я бы хотел, чтобы что-то вроде закомментированного оператора показывало только ax1 & ax2 на рисунке.

Ответы [ 2 ]

4 голосов
/ 21 ноября 2011

Вы можете удалить некоторые из нанесенных линий из набора линий текущих осей:

axes = plt.gca()  # Get current axes
axes.lines.remove(ax2[0])  # Removes the (first and only) line created in ax2
plt.draw()  # Updates the graph (in interactive mode)

Если вы хотите вернуть его обратно, вы можете аналогичным образом сделать

axes.lines.append(ax2[0])  # Puts the line back (the drawing order is changed, here)

В качестве альтернативы вы можете сохранить текущие линии графика, если вам понадобится вернуть их позже:

all_lines = list(axes.lines)  # Copy
# ...
axes.lines[:] = all_lines  # All lines put back

Ключевым моментом является то, что каждая команда plot() добавляет линию к текущим осям и рисует ее (винтерактивный режим).Таким образом, вы можете удалить уже нанесенные линии (как в этом ответе).

Как указал Янн, вы также можете сделать некоторые линии невидимыми.Тем не менее, метод из этого ответа, вероятно, быстрее, так как нужно нарисовать меньше линий (если это имеет значение).

3 голосов
/ 21 ноября 2011

Не совсем. Во-первых, вызов plt.plot не возвращает оси, он возвращает список объектов Line2D, по одному для каждой построенной линии. Вы можете использовать интерфейс OO для Matplotlib, чтобы создать отдельные оси для каждого графика, затем выборочно добавить их в качестве вспомогательных участков и т. Д. Существует много различных способов выборочного раскрытия графика.

Но для вашего примера вы можете использовать альфа-значение Line2D, то есть насколько оно непрозрачно, чтобы сделать одну строку невидимой. Вот модифицированная версия вашего примера:

import matplotlib.pyplot as plt

line1 = plt.plot(range(5),range(5))
line2 = plt.plot([x+1 for x in range(5)],[x+1 for x in range(5)])
line3 = plt.plot([x+2 for x in range(5)],[x+2 for x in range(5)])
print line3, " see I'm a list of lines"
print line3[0].get_alpha()
line3[0].set_alpha(0) # make complete opaque

#plt.show([ax1,ax2])
plt.gcf().savefig('line3opaque.png')
line3[0].set_alpha(1) # make visible
line1[0].set_alpha(0) # make opaque
plt.gcf().savefig('line1opaque.png')
plt.show()

Первая фигура, которую я сохранил, это 'line3opaque.png'; вот что я получаю:

enter image description here Строка 3 не существует, а строки 1 и 2 есть. Для 'line1opaque.png' я получаю:

enter image description here

Теперь у нас пропущена строка 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...