Построение отдельных фигур с использованием понимания списка

#list #matplotlib #plot #list-comprehension #figure

#Список #matplotlib #построение #понимание списка #рисунок

Вопрос:

Мой текущий код создает перекрывающиеся фигуры для каждого элемента в тесте списка. Как я могу создать две отдельные фигуры, используя понимание списка? (Желательно использовать только одну строку кода).

 test=[[1, 2, 3, 4],[5, 6, 7, 8]]
[plt.plot(test[k]) for k in range(0,2)]
 

Текущий вывод выглядит следующим образом:

Текущий вывод

Комментарии:

1. Обратите внимание, что это действительно не очень хороший вариант использования для понимания списка. Чтобы записать это в одну строку, вы могли бы использовать for k in range(0,2) : plt.plot(test[k])`. Здесь понимание списка не делает вещи более компактными и не облегчает чтение.

2. Понятно. Спасибо за полезные комментарии.

Ответ №1:

Как объясняется в руководстве по использованию Matplotlib, plt.plot работает так же, как ax.plot и метод построения графиков:

для каждого метода построения графиков осей в модуле matplotlib.pyplot есть соответствующая функция, которая выполняет этот график для «текущих» осей, создавая эти оси (и их родительскую фигуру), если они еще не существуют.

Итак, когда вы запускаете понимание списка, которое вы привели в качестве примера, первый plt.plot вызов метода в for цикле создает новый объект figure, содержащий дочерний объект Axes . Затем, как указано в разделе руководства Matplotlib Pyplot по работе с несколькими фигурами и осями:

MATLAB и pyplot имеют концепцию текущей фигуры и текущих осей. Все функции построения применяются к текущим осям.

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

 test = [[1, 2, 3, 4],[5, 6, 7, 8]]
for k in range(len(test)): plt.figure(), plt.plot(test[k])
 

Редактировать: основываясь на комментарии Йоханка (по вопросу), заменил понимание списка однострочным составным оператором. Несмотря на то, что это противоречит рекомендациям PEP 8, это действительно делает код более читаемым при соблюдении требования к однострочности.

Комментарии:

1. Спасибо за подробное объяснение!