wake-up-neo.net

Matplotlib: Hinzufügen von Achsen mit denselben Argumenten wie bei vorherigen Achsen

Ich möchte Daten in zwei verschiedenen Unterplots darstellen. Nach dem Plotten möchte ich zum ersten Subplot zurückkehren und ein zusätzliches Dataset darin zeichnen. Wenn ich dies tue, bekomme ich jedoch folgende Warnung:

MatplotlibDeprecationWarning: Beim Hinzufügen einer Achse mit denselben Argumenten wie bei einer vorherigen Achse wird derzeit die vorherige Instanz verwendet. In einer zukünftigen Version wird immer eine neue Instanz erstellt und zurückgegeben. Inzwischen kann diese Warnung unterdrückt und das zukünftige Verhalten sichergestellt werden, indem an jede Achseninstanz eine eindeutige Bezeichnung übergeben wird. warnings.warn (message, mplDeprecation, stacklevel = 1)

Ich kann das mit einem einfachen Code reproduzieren:

import matplotlib.pyplot as plt
import numpy as np

# Generate random data
data = np.random.Rand(100)

# Plot in different subplots
plt.figure()
plt.subplot(1, 2, 1)
plt.plot(data)

plt.subplot(1, 2, 2)
plt.plot(data)

plt.subplot(1, 2, 1) # Warning occurs here
plt.plot(data + 1)

Ideen, wie Sie diese Warnung vermeiden können? Ich verwende matplotlib 2.1.0. Sieht aus wie das gleiche Problem wie hier

18
Nickj

Dies ist ein gutes Beispiel, das den Nutzen der Verwendung von matplotlibs objektorientierter API veranschaulicht. 

import numpy as np
import matplotlib.pyplot as plt

# Generate random data
data = np.random.Rand(100)

# Plot in different subplots
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(data)

ax2.plot(data)

ax1.plot(data+1)

plt.show()

Hinweis: Es ist mehr Pythonic, Variablennamen mit einem Kleinbuchstaben zu beginnen, z. data = ... statt Data = ... siehe PEP8

15
DavidG

Mit plt.subplot(1,2,1) wird eine neue Achse in der aktuellen Figur erstellt. Die Warnung über veraltete Informationen besagt, dass in einer zukünftigen Version, wenn Sie sie ein zweites Mal aufrufen, die zuvor erstellte Achse nicht erfasst, sondern überschrieben wird.

Sie können einen Verweis auf die erste Instanz der Achse speichern, indem Sie ihn einer Variablen zuweisen.

plt.figure()
# keep a reference to the first axis
ax1 = plt.subplot(1,2,1)
ax1.plot(Data)

# and a reference to the second axis
ax2 = plt.subplot(1,2,2)
ax2.plot(Data)

# reuse the first axis
ax1.plot(Data+1)
4
James

Beachten Sie, dass die Warnung in diesem Fall falsch positiv ist. Sie sollte im Idealfall nicht ausgelöst werden, wenn Sie plt.subplot(..) verwenden, um ein zuvor erstelltes Subplot wieder zu aktivieren. 

Der Grund für diese Warnung ist, dass plt.subplot und fig.add_subplot() intern denselben Codepfad verwenden. Die Warnung ist für das Letztere gedacht, nicht jedoch für das Erstere. 

Um mehr darüber zu erfahren, siehe Ausgaben 12513 . Um es kurz zu machen, die Leute arbeiten daran, aber es ist nicht so einfach, wie zunächst gedacht, die beiden Funktionen zu entkoppeln. Im Moment können Sie die Warnung einfach ignorieren, wenn sie von plt.subplot() ausgelöst wird.

Sie können einfach plt.clf() aufrufen, bevor Sie Dinge plotten. Dadurch werden alle vorhandenen Plots gelöscht.

1
Hugh Perkins

Ich hatte das gleiche Problem. Ich hatte den folgenden Code, der die Warnung auslöste:

(Beachten Sie, dass die Variable Image einfach mein als numpy Array gespeichertes Bild ist.) 

import numpy as np
import matplotlib.pyplot as plt

plt.figure(1)  # create new image
plt.title("My image")  # set title
# initialize empty subplot
AX = plt.subplot()  # THIS LINE RAISED THE WARNING
plt.imshow(Image, cmap='Gist_gray')  # print image in grayscale
...  # then some other operations

und ich habe es gelöst, wie folgt modifiziert:

import numpy as np
import matplotlib.pyplot as plt

fig_1 = plt.figure(1)  # create new image and assign the variable "fig_1" to it
AX = fig_1.add_subplot(111)  # add subplot to "fig_1" and assign another name to it
AX.set_title("My image")  # set title
AX.imshow(Image, cmap='Gist_gray')  # print image in grayscale
...  # then some other operations
0
Tommaso Di Noto

Der Fehler tritt auf, wenn Sie dasselbe Achsenobjekt mehr als einmal erstellen. In Ihrem Beispiel erstellen Sie zunächst zwei Untergrundobjekte (mit der Methode plt.subplot).

type(plt.subplot(2, 1, 2)) Out: matplotlib.axes._subplots.AxesSubplot

python legt die zuletzt erstellte Achse automatisch als Standard fest. Achse bedeutet nur den Rahmen für die Zeichnung ohne Daten. Deshalb können Sie plt.plot (data) ausführen. Das Methodendiagramm (Daten) druckt einige Daten in Ihrem Achsenobjekt. Wenn Sie dann versuchen, neue Daten im selben Plot zu drucken, können Sie plt.subplot (2, 1, 2) nicht einfach erneut verwenden, da python) standardmäßig versucht, ein neues Achsenobjekt zu erstellen Was Sie also tun müssen, ist: Ordnen Sie jede Teilzeichnung einer Variablen zu.

ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)

wählen Sie dann Ihren "Rahmen", in dem Sie Daten drucken möchten:

ax1.plot(data)
ax2.plot(data+1)
ax1.plot(data+2)

Wenn Sie mehr Graphen (z. B. 5) in einer Abbildung darstellen möchten, erstellen Sie zunächst eine Abbildung. Ihre Daten werden in einem Pandas DataFrame) gespeichert und Sie erstellen für jede Spalte ein neues Achsenelement in einer Liste. Anschließend durchlaufen Sie die Liste und zeichnen in jedem Achsenelement die Daten und wählen die Attribute aus

import pandas as pd 
import matplotlib.pyplot as plt 

#want to print all columns
data = pd.DataFrame('some Datalist')
plt.figure(1)
axis_list = []

#create all subplots in a list 
for i in range(data.shape[1]):
axis_list.append(plt.subplot(data.shape[1],1,i+1)

for i,ax in enumerate(axis_list):

    # add some options to each subplot  
    ax.grid(True)
    #print into subplots
    ax.plot(data.iloc[:,[i]])
0
Robert Schirmer