Hoe vertel ik Matplotlib om een tweede (nieuwe) plot te maken en later op de oude plot te plotten?

Ik wil data plotten, dan een nieuwe figuur maken en data plotten2, en uiteindelijk terugkeren naar de originele plot en plot data3, ongeveer als volgt:

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)

Ter info Hoe weet ik dat matplotlib dat ik klaar ben met een plot?doet iets soortgelijks, maar niet helemaal! Het geeft me geen toegang tot die originele plot.


Antwoord 1, autoriteit 100%

Als je merkt dat je dit soort dingen regelmatig doet, is het misschien de moeite waard om de objectgeoriënteerde interface naar matplotlib te onderzoeken. In jouw geval:

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

Het is iets uitgebreider, maar het is veel duidelijker en gemakkelijker bij te houden, vooral met meerdere figuren met elk meerdere subplots.


Antwoord 2, autoriteit 85%

Als je figureaanroept, nummer dan gewoon de plot.

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)

Bewerken: Houd er rekening mee dat u de plots kunt nummeren zoals u wilt (hier, beginnend bij 0), maar als u het cijfer helemaal niet van een nummer voorziet wanneer u een nieuwe maakt, automatische nummering begint bij 1(“Matlab Style” volgens de documenten).


Antwoord 3, autoriteit 12%

De nummering begint echter bij 1, dus:

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)

Als je meerdere assen op een figuur hebt, zoals subplots, gebruik dan de opdracht axes(h)waarbij hde handle is van het gewenste assenobject om focus op die assen.

(heb nog geen reactierechten, sorry voor nieuw antwoord!)


Antwoord 4

Een gemakkelijke manier om voor elke iteratie een apart frame te plotten is:

import matplotlib.pyplot as plt  
for grp in list_groups:
        plt.figure()
        plt.plot(grp)
        plt.show()

Python zal dan verschillende frames plotten.


Antwoord 5

Een manier die ik na wat worsteling heb gevonden, is het creëren van een functie die de data_plot-matrix, bestandsnaam en volgorde als parameter krijgt om boxplots te maken van de gegeven gegevens in de geordende figuur (verschillende volgorden = verschillende figuren) en deze op te slaan onder de gegeven bestandsnaam .

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

Antwoord 6

Het geaccepteerde antwoord hier zegt het objectgeoriënteerde interface (d.w.z. matplotlib), die de manier is om te gaan. De code voor het antwoord bevat de (enkele van de) Matlab-Style-interface (d.w.z. matplotib.pyplot) echter.

Er is de mogelijkheid om uitsluitend de OOP -wethode te gebruiken, die het probleem bij de hand direct kan aanpakken en ons in staat stellen met meer dan één figuur tegelijk te werken:

import numpy as np
import matplotlib
x = np.arange(5)
y = np.exp(x)
first_figure      = matplotlib.figure.Figure()
first_figure_axis = first_figure.add_subplot()
first_figure_axis.plot(x, y)
z = np.sin(x)
second_figure      = matplotlib.figure.Figure()
second_figure_axis = second_figure.add_subplot()
second_figure_axis.plot(x, z)
w = np.cos(x)
first_figure_axis.plot(x, w)
display(first_figure) # Jupyter
display(second_figure)

Dit geeft de gebruikershandleiding Controle over de cijfers en vermijdt problemen die zijn geassocieerd met pyplot‘S Internal Status ondersteunt slechts één cijfer, zoals wanneer u een figuur uit een bibliotheekfunctie wilt retourneren.

Other episodes