Як мені сказати 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)

FYI Як мені сказати 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").
simonb

1
чому ти використовував 111?
Яш Сода

2
@yashSodha - це специфікація стилю matlab щодо кількості субплотів (рядків, колів, індексів). Але зараз набагато простіше використовувати plt.subplots(nrows, ncols). Оновили приклад.
simonb

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, тоді як метод фігури () ... add_subplot () не робить. Дякую!
chbrown

@SebMa Будь ласка, не змінюйте код, не розуміючи його. Ця відповідь конкретно стосувалася передачі номера, до figureякого ви видалили. Інші речі, які ви змінили, були скопійовані з оригіналу публікації, а не мої відповіді.
agf

@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, ім'я файлу та порядок як параметр, щоб створити boxplots із заданих даних у впорядкованій фігурі (різні замовлення = різні цифри) та зберегти їх під заданим ім'ям файлу.

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.