Quand j'ai essayé d'utiliser le nuage de points 3D avec matplotlib, l'article selon lequel la version sur le serveur était ancienne, Hajimaruyo (voix lente)
Je voulais rendre la visualisation des calculs numériques de particules cool en 3D. En particulier ↑ Je voulais faire quelque chose comme ça. Même si j'étais un professeur de gnuplot de première classe, je voulais le faire avec gnuplot, mais D'un autre côté, parfois je voulais utiliser un traceur différent, alors j'ai fait de mon mieux pour le faire avec matplotlib.
matplotlib est une bibliothèque de visualisation qui s'exécute sur Python. Cliquez ici pour le script.
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
Tout d'abord, importez.
box_size = 4.0
R = 6400.0e+3
Déclaration des constantes.
print mpl.__version__
fig = plt.figure()
#if version > 1.0.0
#ax = plt.add_subplot(111, projection='3d')
J'ai sorti la version de matplotlib. Puisque matplotlib a une méthode de tracé 3D différente selon la version ...
start = 0
stop = 1
step = 1
Créez un graphique en incrémentant étape par étape du début à la fin.
tag = []
x = []
y = []
z = []
Initialisation de la baie.
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])
Étant donné que les résultats des calculs sont distribués dans des fichiers Nnode, chargez-les un par un dans les données avec loadtxt. Utilisez la méthode extend pour plonger dans le tableau défini précédemment. Dans ce cas, la 1ère colonne est la balise, la 3ème colonne est la coordonnée x, la 4ème colonne est la coordonnée y et la 5ème colonne est la coordonnée z.
x_tag = [[], [], [], []]
y_tag = [[], [], [], []]
z_tag = [[], [], [], []]
size_tag = [[], [], [], []]
Créez un tableau bidimensionnel à tracer en modifiant la couleur de chaque balise.
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"]
Après avoir divisé les coordonnées par la constante normalisée, les données sont plongées dans le tableau de balises correspondant. Après cela, définissez la couleur correspondant à l'étiquette.
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)
Créez une classe Axes3D et versez les données dans scatter. Cela doit être fait pour chaque balise. Cette fois, size_tag est fixe. Définissez la couleur des bords sur clr [tag]. Cela permet de dessiner avec des particules sans bordure. La perméabilité alpha est toujours de 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)
Cette fois, les proportions sont toutes égales. Définissez également la plage de chaque axe. Réglez l'angle de la caméra avec view_init.
#plt.show()
plt.savefig("./img/%05d.png " % step)
Production. Vous pouvez afficher () normalement, mais cette fois je vais le faire en png avec savefig et plus tard en faire un gif d'anime.
Droite? N'est-ce pas facile?
Recommended Posts