Als ich versuchte, 3D-Scatter-Plot mit matplotlib zu verwenden, war der Artikel, dass die Version auf dem Server alt war, Hajimaruyo (langsame Stimme)
Ich wollte die Visualisierung von numerischen Teilchenberechnungen in 3D cool machen. Speziell ↑ Ich wollte so etwas machen. Selbst wenn ich ein erstklassiger Gnuplot-Lehrer war, wollte ich es mit Gnuplot machen, aber Andererseits wollte ich manchmal einen anderen Plotter verwenden, also versuchte ich mein Bestes, um es mit matplotlib zu machen.
matplotlib ist eine Visualisierungsbibliothek, die unter Python ausgeführt wird. Klicken Sie hier für das Skript.
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
box_size = 4.0
R = 6400.0e+3
print mpl.__version__
fig = plt.figure()
#if version > 1.0.0
#ax = plt.add_subplot(111, projection='3d')
start = 0
stop = 1
step = 1
Nnode = 4
for step in range(start, stop, step):
print step
tag = []
x = []
y = []
z = []
for n in range(Nnode):
data = np.loadtxt("./result/%05d_%05d_%05d.dat" % (step, Nnode, n), skiprows=2, delimiter="\t");
tag.extend(data[:,1])
x.extend(data[:,3])
y.extend(data[:,4])
z.extend(data[:,5])
x_tag = [[], [], [], []]
y_tag = [[], [], [], []]
z_tag = [[], [], [], []]
size_tag = [[], [], [], []]
for i in range(len(x)):
x[i] = x[i]/R
y[i] = y[i]/R
z[i] = z[i]/R
x_tag[int(tag[i])].append(x[i])
y_tag[int(tag[i])].append(y[i])
z_tag[int(tag[i])].append(z[i])
size_tag[int(tag[i])].append(1.0)
clr = ["orange", "gray", "red", "black"]
ax = Axes3D(fig)
for tag in range(4):
ax.scatter(x_tag[tag], y_tag[tag], z_tag[tag], s=size_tag[tag], c=clr[tag], edgecolor=clr[tag], alpha=0.1)
ax.set_aspect('equal')
ax.set_xlim3d(-box_size, box_size)
ax.set_ylim3d(-box_size, box_size)
ax.set_zlim3d(-box_size, box_size)
ax.view_init(9.0, 45.0)
#plt.show()
plt.savefig("./img/%05d.png " % step)
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
Zuerst importieren.
box_size = 4.0
R = 6400.0e+3
Deklaration von Konstanten.
print mpl.__version__
fig = plt.figure()
#if version > 1.0.0
#ax = plt.add_subplot(111, projection='3d')
Ich gebe die Version von matplotlib aus. Da matplotlib je nach Version eine andere 3D-Plotmethode hat ...
start = 0
stop = 1
step = 1
Erstellen Sie ein Diagramm, indem Sie Schritt für Schritt von Anfang bis Ende erhöhen.
tag = []
x = []
y = []
z = []
Array-Initialisierung.
for n in range(Nnode):
data = np.loadtxt("./result/%05d_%05d_%05d.dat" % (step, Nnode, n), skiprows=2, delimiter="\t");
tag.extend(data[:,1])
x.extend(data[:,3])
y.extend(data[:,4])
z.extend(data[:,5])
Da die Berechnungsergebnisse in Nnode-Dateien verteilt sind, laden Sie sie einzeln mit loadtxt in die Daten. Verwenden Sie die Extend-Methode, um in das zuvor definierte Array einzutauchen. In diesem Fall ist die erste Spalte das Tag, die dritte Spalte die x-Koordinate, die vierte Spalte die y-Koordinate und die fünfte Spalte die z-Koordinate.
x_tag = [[], [], [], []]
y_tag = [[], [], [], []]
z_tag = [[], [], [], []]
size_tag = [[], [], [], []]
Erstellen Sie ein zweidimensionales Array zum Plotten, indem Sie die Farbe für jedes Tag ändern.
for i in range(len(x)):
x[i] = x[i]/R
y[i] = y[i]/R
z[i] = z[i]/R
x_tag[int(tag[i])].append(x[i])
y_tag[int(tag[i])].append(y[i])
z_tag[int(tag[i])].append(z[i])
size_tag[int(tag[i])].append(1.0)
clr = ["orange", "gray", "red", "black"]
Nach dem Teilen der Koordinaten durch die standardisierte Konstante werden die Daten in das entsprechende Array von Tags getaucht. Definieren Sie danach die Farbe, die dem Tag entspricht.
ax = Axes3D(fig)
for tag in range(4):
ax.scatter(x_tag[tag], y_tag[tag], z_tag[tag], s=size_tag[tag], c=clr[tag], edgecolor=clr[tag], alpha=0.1)
Erstellen Sie eine Axes3D-Klasse und gießen Sie Daten in die Streuung. Dies muss für jedes Tag durchgeführt werden. Dieses Mal ist size_tag festgelegt. Setzen Sie die Kantenfarbe auf clr [Tag]. Dies ermöglicht das Zeichnen mit randlosen Partikeln. Das Permeabilitäts-Alpha beträgt durchweg 0,1.
ax.set_aspect('equal')
ax.set_xlim3d(-box_size, box_size)
ax.set_ylim3d(-box_size, box_size)
ax.set_zlim3d(-box_size, box_size)
ax.view_init(9.0, 45.0)
Diesmal sind alle Seitenverhältnisse gleich. Stellen Sie außerdem den Bereich jeder Achse ein. Stellen Sie den Kamerawinkel mit view_init ein.
#plt.show()
plt.savefig("./img/%05d.png " % step)
Ausgabe. Sie können () normal anzeigen, aber dieses Mal werde ich es mit savefig png machen und später ein Anime-GIF machen.
Richtig? Ist es nicht einfach
Recommended Posts