Erstellen einen 3D-Plot mit Seaborn und Matplotlib

Salman Mehmood 21 Dezember 2022
Erstellen einen 3D-Plot mit Seaborn und Matplotlib

In dieser Erklärung sehen wir uns an, was ein 3D-Plot ist, und wir lernen auch, wie wir mit Hilfe von Seaborn und Matplotlib mehrere verschiedene 3D-Plots erstellen können.

Erstellen Sie einen 3D-Plot mit Seaborn und Matplotlib

Beginnen wir mit dem Import von Matplotlib, NumPy und Seaborn.

import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np

Jetzt verwenden wir das Zufallsmodul von NumPy, um einige x-, y- und z-Daten zu erstellen, und wir haben insgesamt 50 Punkte.

mean = 3
number = 50

x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)

Es gibt mehrere verschiedene 3D-Plots, die wir mit Matplotlib erstellen können. Wann immer wir mit Matplotlib in 3D plotten möchten, müssen wir zunächst mit der Funktion axes() einen Satz von Achsen erstellen.

Wir verwenden das Schlüsselwort projection und übergeben den 3D-Wert als String. Dadurch wird Matplotlib mitgeteilt, dass wir etwas in drei Dimensionen erstellen werden.

plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")

Wenn wir den Typ der Achsen überprüfen, sehen wir, dass es sich um 3D-Subplot-Achsen handelt.

print(type(axes))

Ausgabe:

<class 'matplotlib.axes._subplots.Axes3DSubplot'>

Wir müssen die Funktion scatter3D() aufrufen und unsere Datenpunkte x, y und z übergeben. Dies ist nicht einfach darzustellen, welche die x-Achse, y-Achse usw. ist, also legen wir die Beschriftungen für die 3 Dimensionen fest.

import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np

seaborn.set_style("darkgrid")

mean = 3
number = 50

x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)

plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1)

axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
plot.show()

Ausgabe:

Seaborn 3D-Plot-Ausgabe 1

Wenn wir die Größe der Streupunkte erhöhen möchten, können wir auf dieses s-Argument verweisen und es auf 100 erhöhen.

import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np

seaborn.set_style("darkgrid")

mean = 3
number = 50

x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)

plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1, s=100)

axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
plot.show()

Ausgabe:

Seaborn 3D-Plot-Ausgabe 2

Diese dreidimensionale Figur können wir mit der Methode view_init() drehen. Diese Methode akzeptiert zwei Argumente, das erste ist der Winkel unserer Elevation und das zweite der Winkel unseres Azimuts.

Wir ändern den Höhenwinkel in Grad, nicht im Bogenmaß. Wahrscheinlich wollen wir diese Figur auch über den Horizont drehen, und das ist unser Azimutwinkel.

import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np

seaborn.set_style("darkgrid")

mean = 3
number = 50

x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)

plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1)

axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")

axes.view_init(45, 215)
plot.show()

Ausgabe:

Seaborn 3D-Plot-Ausgabe 3

Matplotlib bietet eine Option zum Erstellen eines Liniendiagramms, und wir werden einige neue Daten zum Präsentieren erstellen. Wir müssen z erstellen, einen linearen Raum von 0 bis 10, und dann x und y basierend auf dem Kosinus und Sinus der z-Achse erstellen.

Genauso wie scatter3D() rufen wir plot3D() auf, das ergibt ein Liniendiagramm.

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np

sb.set_style("whitegrid")

OMEGA = 2

Z1 = np.linspace(0, 10, 100)
X1 = np.cos(OMEGA * Z1)
Y1 = np.sin(OMEGA * Z1)

plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
axes.plot3D(X1, Y1, Z1)
# keeps padding between figure elements
plot.tight_layout()
plot.show()

Jetzt haben wir eine schöne spiralförmige Darstellung, die im dreidimensionalen Raum dargestellt wird.

Seaborn 3D-Plot-Ausgabe 4

Wir können diese Linie mit denselben Schlüsselwörtern für ein zweidimensionales Diagramm gestalten. Angenommen, wir können unsere Linienbreite ändern und diese Spirale etwas dunkler machen.

Das Argument namens OMEGA steuert im Grunde, wie viele Spiralen wir in unserem Plot sehen wollen.

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np

sb.set_style("whitegrid")

OMEGA = 4

Z1 = np.linspace(0, 10, 100)
X1 = np.cos(OMEGA * Z1)
Y1 = np.sin(OMEGA * Z1)

plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
axes.plot3D(X1, Y1, Z1, lw=3)
# keeps padding between figure elements
plot.tight_layout()
plot.show()

Jetzt können wir mehr dicke Spiralen in unserer Figur sehen.

Seaborn 3D-Plot-Ausgabe 5

Wir können auch Matplotlib verwenden, um dreidimensionale Oberflächen und Drahtgitter zu erstellen.

Lassen Sie uns eine FUNC_Z()-Funktion erstellen. Es nimmt die x- und y-Werte und gibt die Funktion zurück, die wir auf die Oberfläche zeichnen werden.

def FUNC_Z(x, y):
    return 50 - (x ** 2 + y ** 2)

Wir verwenden Linspace, um 50 Intervalle zwischen -5 und 5 für x und y zu erstellen. Wir müssen ein Raster erstellen, anstatt nur x- und y-Werte zu haben.

Wir können es mit der Funktion meshgrid() erstellen. Wir müssen ihm die Werte x und yübergeben, damit er sie wiederholt.

X1, Y1 = np.meshgrid(X_VAL, Y_VAL)

Vollständiger Code:

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np


def FUNC_Z(x, y):
    return 50 - (x ** 2 + y ** 2)


sb.set_style("whitegrid")
N = 50

X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)

X1, Y1 = np.meshgrid(X_VAL, Y_VAL)

Z1 = FUNC_Z(X1, Y1)

axes = plot.axes(projection="3d")
axes.plot_surface(X1, Y1, Z1)
plot.show()

Ausgabe:

Seaborn 3D-Plot-Ausgabe 6

Lassen Sie uns ein Drahtgitterdiagramm mit der Funktion plot_wireframe() erstellen. Dieser Code wird der Oberfläche sehr ähnlich aussehen.

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np


def FUNC_Z(x, y):
    return 50 - (x ** 2 + y ** 2)


sb.set_style("whitegrid")
N = 50

X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)

X1, Y1 = np.meshgrid(X_VAL, Y_VAL)

Z1 = FUNC_Z(X1, Y1)

axes = plot.axes(projection="3d")
axes.plot_wireframe(X1, Y1, Z1)
plot.show()

Jetzt haben wir eher ein Drahtgitter als eine Fläche, deren mittlerer Teil nicht gefüllt ist.

Seaborn 3D-Plot-Ausgabe 7

Wir können die Ästhetik dieses Drahtmodells ändern, wenn wir die Anzahl der Punkte in unserem Gitter ändern.

import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np


def FUNC_Z(x, y):
    return 50 - (x ** 2 + y ** 2)


sb.set_style("whitegrid")
N = 10

X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)

X1, Y1 = np.meshgrid(X_VAL, Y_VAL)

Z1 = FUNC_Z(X1, Y1)

axes = plot.axes(projection="3d")
axes.plot_wireframe(X1, Y1, Z1)
plot.show()

Es wird eine andere Ästhetik mit viel mehr Platz schaffen, weil wir die Größe unseres Rasters geändert haben. Wir haben auch die Möglichkeit, unsere Maus zu nehmen, auf diese Figur zu klicken und sie herumzuziehen.

Seaborn 3D-Plot-Ausgabe 8

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Verwandter Artikel - Seaborn Plot