Je voulais visualiser la simulation de particules 3D avec la bibliothèque de visualisation Python Matplotlib.

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)

en premier

Je voulais rendre la visualisation des calculs numériques de particules cool en 3D. En particulier 00000.png 00010.png 00020.png 00030.png 00040.png ↑ 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

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)

Commentaire

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

Je voulais visualiser la simulation de particules 3D avec la bibliothèque de visualisation Python Matplotlib.
Je voulais résoudre le problème ABC164 A ~ D avec Python
Je voulais utiliser la bibliothèque Python de MATLAB
Je voulais résoudre ABC160 avec Python
Je voulais résoudre ABC172 avec Python
[Python] J'ai essayé de visualiser le prix en argent de "ONE PIECE" plus de 100 millions de caractères avec matplotlib.
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
Je voulais résoudre NOMURA Contest 2020 avec Python
Je voulais jouer avec la courbe de Bézier
Je voulais installer Python 3.4.3 avec Homebrew + pyenv
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
Essayez le fonctionnement de la base de données avec Python et visualisez avec d3
Je veux hériter de l'arrière avec la classe de données python
J'ai essayé de résoudre le problème avec Python Vol.1
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
Ce que j'ai fait pour accueillir le Python2 EOL en toute confiance
[Python] Je souhaite utiliser l'option -h avec argparse
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai capturé le projet Toho avec Deep Learning ... je le voulais.
J'ai aimé le tweet avec python. ..
Je veux déboguer avec Python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
Je veux connaître la météo avec LINE bot avec Heroku + Python
Je veux sortir le début du mois prochain avec Python
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
[Introduction à Matplotlib] Axes Animation 3D: J'ai joué avec des figurines 3D Lisaju ♬
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
[Python] J'ai visualisé les paroles d'Arashi avec WordCloud et j'ai essayé de démêler ce que je voulais transmettre aux fans en 20e année de formation.
FBX SDK De quelles compétences ai-je besoin pour créer un programme à l'aide de Python?
[Python] Définissez la plage du graphique avec matplotlib
J'ai essayé de visualiser AutoEncoder avec TensorFlow
Ajouter un intervalle de confiance de 95% des deux côtés pour la figure avec Python / Matplotlib
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
C'est plus récent, mais je voulais essayer le calcul de l'IMC avec python.
Je voulais résoudre ABC159 avec Python
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai installé la bibliothèque avec Visual Studio Code, mais impossible d'importer
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
Alignez la barre de couleurs sur la figure avec matplotlib
Je voulais vraiment copier avec du sélénium
La route de la compilation vers Python 3 avec Thrift
J'ai essayé d'extraire des expressions uniques avec la bibliothèque de traitement du langage naturel GiNZA
J'ai essayé d'utiliser la bibliothèque Python "pykakasi" qui peut convertir des kanji en romaji.
[Calcul scientifique / technique par Python] Tracer, visualiser, matplotlib des données 2D avec barre d'erreur
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python