Как мне сказать Matplotlib создать второй (новый) сюжет, а затем построить старый?


147

Я хочу построить данные, затем создать новую фигуру и построить данные2, и, наконец, вернуться к исходному графику и построить данные3, примерно так:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

К вашему сведению, как мне сказать matplotlib, что я закончил с сюжетом? делает что-то похожее, но не совсем! Это не позволяет мне получить доступ к этому оригинальному сюжету.

Ответы:


152

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

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

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


2
Я предпочитаю объектно-ориентированный подход, так как, когда я ожидаю иметь много цифр, их будет легче отслеживать, используя имена, а не цифры. Спасибо!
Питер Д

1
Но как можно изменить границы метки и оси при таком подходе. Если я использую ax1.ylabelэто говорит, что это не найдено. То же самое с fig1.ylabel...
Джордж Дацерис

3
@ GeorgeDatseris Синтаксис немного отличается. Это ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label")и ax1.set_title("your title").
Симонб

1
почему ты использовал 111?
Яш Содха

2
@yashSodha - это спецификация в стиле matlab для количества подзаговоров (row, col, index). Но теперь это намного проще в использовании plt.subplots(nrows, ncols). Обновили пример.
Симонб

120

Когда вы звоните figure, просто наберите номер сюжета.

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

Редактировать: Обратите внимание, что вы можете 0нумеровать участки по своему усмотрению (здесь, начиная с ), но если при создании нового числа цифра не будет указана вообще, автоматическая нумерация начнется с 1(«Стиль Matlab» в соответствии с в документы).


3
Похоже, что это работает в интерактивном режиме matplotlib, а метод figure () ... add_subplot () - нет. Спасибо!
февраля

@SebMa Пожалуйста, не меняйте код, не понимая его. Этот ответ был конкретно о передаче номера figure, который вы удалили. Другие вещи, которые вы изменили, были скопированы из исходного поста, а не ошибок в моем ответе.
августа

@agf Привет, я удалил 1внутреннюю часть, plt.figure(1)потому что я думал, что число было автоматически увеличено и поэтому не нужно. Сожалею.
SebMa

18

Однако нумерация начинается с 1:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

Кроме того, если у вас есть несколько осей на фигуре, например, на вспомогательных участках, используйте axes(h)команду гдеh - дескриптор нужного объекта осей, чтобы сфокусироваться на этих осях.

(еще нет прав на комментарии, извините за новый ответ!)


10
0работает, автоматическая нумерация только начинается 1, если вы вообще не даете ей номер.
AGF

0

Один из способов, который я нашел после некоторых трудностей, - это создание функции, которая получает матрицу data_plot, имя файла и порядок в качестве параметра для создания коробочных диаграмм из заданных данных в упорядоченной фигуре (разные порядки = разные фигуры) и сохранения ее под заданным именем файла.

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.