前提・実現したいこと
Pythonのmatplotlibで粒子軌道のアニメーションを作っています.
元のtxtデータがこれで,
gifのイメージが
何が問題かというと私は「(x,y)=(0,0)を中心とする半径1.8の円を底面として高さが-1.8<z<1.8の円柱」を背景に入れたいのですが,なぜかxy平面がズレてしまいます.
アニメーションの文字と被らないように勝手に文字を入れたのが原因でしょうか?
またこれをあるべき位置に移動させるにはどのようにするべきか対処法を教えてほしいです.
テキストパース部分
Python
1import re 2%matplotlib inline 3import numpy as np 4 5from matplotlib import pyplot as plt 6from matplotlib.animation import FuncAnimation 7from mpl_toolkits.mplot3d import Axes3D 8import mpl_toolkits.mplot3d.art3d as art3d 9from matplotlib.patches import Circle 10 11with open("rev2.txt") as f: 12 lines = f.read().splitlines() 13 14sep_indices = [] 15for i, line in enumerate(lines): 16 if line.startswith("t"): 17 sep_indices.append(i) 18 19data = [] 20for s, e in zip(sep_indices, sep_indices[1:] + [len(lines)]): 21 time_str = lines[s] 22 points_str = "\n".join(lines[s + 1 : e]) 23 24 time = float(re.match(r"t=(.+)ns", time_str).group(1)) 25 w, x, y, z = np.fromstring(points_str, sep=" ").reshape(-1, 4).T 26 color = np.where(w == 0, "r", "w") # 1列目が0なら赤、それ以外なら白 27 28 data.append({"time": time, "color": color, "x": x, "y": y, "z": z})
アニメーション作成部分
Python
1fig = plt.figure(figsize=(9, 9)) 2ax = fig.add_subplot(projection="3d") 3 4 5zzz = np.linspace(-1.8, 1.8, 100) 6theta = np.linspace(0, 2*np.pi, 100) 7Theta,backz=np.meshgrid(theta, zzz) 8backx = 1.8*np.cos(Theta) 9backy = 1.8*np.sin(Theta) 10 11ax.plot_surface(backx,backy,backz, color='#f8ecd5',alpha=0.2) 12 13soko = Circle((0, 0), 1.8,color='#f8ecd5',alpha=0.2) 14ax.add_patch(soko) 15art3d.pathpatch_2d_to_3d(soko, z=-1.8, zdir="z") 16 17futa = Circle((0, 0), 1.8,color='#f8ecd5',alpha=0.2) 18ax.add_patch(futa) 19art3d.pathpatch_2d_to_3d(futa, z=1.8, zdir="z") 20 21 22 23 24ax.set_xlabel('x axis') 25ax.set_ylabel('y axis') 26ax.set_zlabel('z axis') 27ax.set_xlim([-2.5, 2.5]) 28ax.set_ylim([-2.5, 2.5]) 29ax.set_zlim([-2.5, 2.5]) 30 31 32# 空の散布図とタイトルオブジェクトを作成しておく。 33scatter = ax.scatter([], [], [], c="b") 34title = ax.set_title("") 35 36 37def update(sample): 38 # タイトル更新を更新する。 39 title.set_text(f"time={sample['time']}ns") 40 # 散布図更新を更新する。 41 scatter._offsets3d = ( 42 sample["x"], 43 sample["y"], 44 sample["z"], 45 ) 46 # 点とエッジの色を更新する。 47 scatter._facecolor3d = sample["color"] 48 scatter._edgecolor3d = sample["color"] 49 50# アニメーションを作成する。 51anim = FuncAnimation(fig, update, data, interval=100) 52anim.save("rev2.gif", writer="pillow")
このzzzやbackxが自分で勝手に入れた文字ですがそのままx,y,zと入れていくとアニメーション部分にぶつかりそうな気がしたり,ほかの部分の文字を変えていくと結局同じような問題が発生しそうで混乱してしまいました.
調べれば調べるほどわからなくなってきたので教えていただけますと幸いです.
補足情報(FW/ツールのバージョンなど)
Pythonとanacondaは本日アップデートしたばかりです.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/10 12:55