Sinus 3d Surface mit Matplotlib
English version below.
Dieser Plot auf sämtlichen Produkten bei redbubble | ||
---|---|---|
|
|
|
Sinus Grundlagen |
Eine Sinusfunktion eignet sich gut, um bspw. mechanische Schwinungsvorgänge zu beschreiben. Um die Sinusfunktion an sämtliche Gegebenheiten anzupassen, stehen vier Parameter a, b, c, d
zur verfügung. Wie sich diese auf die Funktion auswirken, wird im Folgenden dargestellt.
Amplitude einer Sinusfunktion |
Der Faktor a
gibt die maximale Amplitude der Funktion im Wertebereich Wf=[-a
;a
] an.
Stauchung und Streckung einer Sinusfunktion |
Prameter b
streckt (b
< 1) bzw. staucht (b
> 1) die Sinusfunktion und verändert somit die Periode p
.
p
:
Verschiebung einer Sinusfunktion |
Die Konstante c
bewirkt eine Verschiebung entlang der x
-Achse.
Die Konstante d
bewirkt eine Verschiebung entlang der y
-Achse.
c
>0: Verschiebung nach links c
<0: Verschiebung nach rechts
d
>0: Verschiebung nach oben d
<0: Verschiebung nach unten
Implementierung in Python 3 |
Zunächst werden alle erforderlichen Bibliotheken importiert
import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D
Damit die Plots direkt im Jupyter Notebook ausgegeben werden können, muss Matplotlib über einen so genannten Built-in Magic Command aktiviet werden:
%matplotlib inline
Anschließend erstellen wir einen Container fig
, in welchem die Plots deponiert werden. In unserem Fall ist es nur ein Plot. Als Parameter wird das Seitenverhältnis 1:1 mit figsize=plt.figaspect(1)
und desweiteren eine Auflösung von 700 dpi (dpi=700
) übergeben.
fig = plt.figure(figsize=plt.figaspect(1), dpi=700)
Koordinatensystem |
Nun werden die Koordinatenpunkte erzeugt, auf denen das Programm die Funktionswerte berechnet. Für die Ausmaße dieses Kartesischen Koordinatensystems (Standartkoordinatensystem) eignet sich die Funktion linspace
der Bibliothek numpy (siehe auch: Artikel zu numpy
). Mit ihr werden 1000 Punkte in einem Intervall von -5 bis 5 in sowohl x
-, als auch y
-Richtung generiert. Durch die, ebenfalls von numpy stammende Funktion meshgrid
wird eine Matrix mit allen möglichen Kombinationen von x
und y
für die Koordinatenpunkte generiert.
x = np.linspace(-5, 5, endpoint=True, num=1000) y = np.linspace(-5, 5, endpoint=True, num=1000) x, y = np.meshgrid(x, y)
Mehrdimensionale Sinusfunktion |
Die bisher vorgestellten Parameter sind Konstanten, die die Form des Sinus verformen. Wird die Funktion von mehreren Veränderlichen abhängig gemacht, so ändert sich ihre Dimension. Dies ist theoretisch mit einer beliebigen Anzahl der Veränderlichen möglich, jedoch nur mit zweien visualisierbar. Kommt bspw. zu dem x
eine weitere Variable y
hinzu, kippt die Dimention von einer Linie in eine Fläche. Somit ist die Höhe z
abhängig von x
und y
. Die hier gezeigte Funktion lautet:
z = (np.sin(5*x)*np.cos(5*y))/5
Erstellung des Plots |
Um die LaTeX Schrift im Jupyter Notebook zu aktivieren sind folgende zwei Zeilen erforderlich:
plt.rc('text', usetex=True) plt.rc('font', family='serif')
Plots werden als subplot
dem Container (figure) zugeordnet. Dabei wird der Plot als 3D Projektion deklariert.
ax = fig.gca(projection='3d')
Color Map |
Die Auswahl einer Colormap kann in der Methode plot_surface()
mit dem Parameter cmap=
festgelegt werden.
Eine vollständige Auflistung der Parametern findet sich in der Matplotlib Dokumentation.
surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm, linewidth=0, antialiased=True, rstride=2, cstride=2) ax.set_title(' ')
Plot ausgeben |
Im folgenden wird ein quadratischer Ausschnitt der Größe lim
generiert. Die Kantenlängen dieses Quadrats entsprechen des betragsmäßig höchsten Maximums bzw. Minimums aus allen Koordinatenrichtungen x
und y
.
# Skalierung der gezeigten Funktion lim = (max(abs(max(np.max(x), np.max(y), np.max(z))), abs(min(np.min(x), np.min(y), np.min(z))))) # Axenlimits setzen ax.set_xlim(-lim, lim) ax.set_ylim(-lim, lim) ax.set_zlim(-lim, lim)
Zu guter Letzt wird der Plot abgespeichert und – falls im Jupyter Notebook ausgeführt, direkt angezeigt.
# deactivae coordinate axis rendering plt.axis('off') # Plot unter "cool_warm_sinus_land.png" abspeichern plt.savefig("cool_warm_sinus_land.png", bbox_inches='tight') # Ausgabe im Jupyter Notebook plt.show()
English Version |
#!/usr/bin/env python print("This will maybe take a while, depending on the figure dpi you have chosen and your system performance") # import necessary libarys from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from matplotlib import cm import numpy as np # activare the output into the jupyter notebook %matplotlib inline # container "fig" for the plot(s, it's actually one^^) # for more info: https://matplotlib.org/api/_as_gen/matplotlib.pyplot.figure.html fig = plt.figure(figsize=plt.figaspect(1), dpi=700) # cartesian coordinate system (the standart one) x = np.linspace(-5, 5, endpoint=True, num=1000) y = np.linspace(-5, 5, endpoint=True, num=1000) x, y = np.meshgrid(x, y) z = (np.sin(5*x)*np.cos(5*y))/5 # the mathematical function f(x,y) = z # activate LaTeX(-Font) plt.rc('text', usetex=True) plt.rc('font', family='serif') # Add a plot to the container (figure) ax = fig.gca(projection='3d') surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm, linewidth=0, antialiased=True, rstride=2, cstride=2) ax.set_title(' ') # scaling of the shown function lim = (max(abs(max(np.max(x), np.max(y), np.max(z))), abs(min(np.min(x), np.min(y), np.min(z))))) # Set the axis limits ax.set_xlim(-lim, lim) ax.set_ylim(-lim, lim) ax.set_zlim(-lim, lim) # deactivae coordinate axis rendering plt.axis('off') # save the plot to the file "cool_warm_sinus_land.png" plt.savefig("cool_warm_sinus_land.png", bbox_inches='tight') # output plt.show()
ocean king winnipeg
14.01.2019 @ 06:13
I really like your blog.. very nice colors &
theme. Did you create this website yourself or did you hire
someone to do it for you? Plz reply as I’m looking to create my own blog and
would like to find out where u got this from. thanks
Niklas
29.04.2019 @ 21:39
Hi,
I was using the Themify Ultra Theme. There is a very good tutorial online on youtube (https://www.youtube.com/watch?v=MFgZ5Vm-LU8) from where I got the idea and the theme for free. Then I played around a lot with the possibilities the theme has.
Where did you find this page? 🙂