質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2854閲覧

gnuplot 時間ごとの3次元アニメーションについて

Kinsho

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/09 07:34

編集2020/09/09 12:00

前提・実現したいこと

3次元空間内の点の運動について時間経過ごとにgifアニメーションとして出力したいです.
プログラム言語の中に組み込んで動かすというものは検索したらいくつかヒットしましたがよく分かりませんでした.
本来は自分で作ってc++で動かしていた運動シミュレーションプログラムで,結果の出力だけならできます.

しかしプログラム内で結果の出力と一緒にgnuplotにgifを作らせようとすると複雑そうなエラーメッセージが出てきた上に,元のコード自体が長くてその解決法をここで聞くのは適さないだろうと考えました.

そこでリンク内容
のようなテキストファイルを元にして,ある時刻tにおける点がどこにあり,それが時間経過ごとにどのように移動するかをgif化する方法を教えてほしいです.

イメージとしてはこのサイト内の「点が動くプログラム」にあるgifみたいなアニメーションです.

私はgnuplotで頑張って失敗しましたが,もしPythonなどを使った方が効率的だよなどのご意見がありましたら特別gnuplotにこだわりたいわけでもございませんので,そちらの方法を教えていただけますと幸いです.

添付いたしましたこのtxtでは点が20個あり,2行目がx座標,3行目がy座標,4行目がz座標です.
また1行目が0の時と1の時で点の色を変えたいと思っています.
描画範囲は
set xrange [-2.5:2.5]
set xrange [-2.5:2.5]
set xrange [-2.5:2.5]の予定です.

ご指導よろしくお願いします.

t=0.00ns 0 -0.286106 -1.66674 0.436972 0 1.55886 -0.33545 0.684778 0 0.169185 -1.23779 -0.325733 0 0.958496 1.17157 0.665226 0 0.0690392 1.02818 -1.13015 0 1.40519 -1.10132 0.801209 0 -1.00578 0.300336 0.588059 0 0.609933 0.00968146 0.551685 0 -0.698907 0.910334 -0.887723 0 0.00481047 -1.42694 -0.637193 0 -0.475948 1.6796 -1.42228 0 0.264631 0.925717 1.42151 0 -1.0194 1.08796 0.649592 0 -0.215302 -1.34385 -1.12029 0 -0.573852 0.763716 0.332555 0 0.147492 -1.2985 1.28318 0 -0.152091 -0.0083339 1.19806 0 0.630061 1.60518 0.0427965 0 -1.21904 0.626342 0.389007 0 0.118063 -0.392421 -0.234945 t=0.01ns 0 -0.28599 -1.66688 0.437027 0 1.55871 -0.335482 0.684673 0 0.169348 -1.2377 -0.325762 0 0.958448 1.17162 0.665049 0 0.0688959 1.02811 -1.13005 0 1.40512 -1.10121 0.801348 0 -1.0056 0.300357 0.58801 0 0.60982 0.00956502 0.551571 0 -0.69883 0.910209 -0.887848 0 0.00474165 -1.42711 -0.63715 0 -0.476128 1.67957 -1.42223 0 0.264703 0.925598 1.42138 0 -1.01952 1.08782 0.649578 0 -0.215392 -1.34402 -1.12028 0 -0.573878 0.763687 0.332363 0 0.147455 -1.29841 1.28335 0 -0.151884 -0.00825999 1.19838 0 0.630218 1.60513 0.0428842 0 -1.21907 0.626226 0.389155 0 0.1179 -0.392369 -0.234814 以下続く

補足情報(FW/ツールのバージョンなど)

gnuplot version5.2
Python 3.6.9
gcc version 7.5.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

matplotlib.animation.FuncAnimation で 3D 版の scatter() で散布図のアニメーションを作成すればよいです。

matplotlib.animation.FuncAnimation — Matplotlib 3.3.1 documentation

テキストパース部分

python

1import re 2 3import numpy as np 4from matplotlib import pyplot as plt 5from matplotlib.animation import FuncAnimation 6from mpl_toolkits.mplot3d import Axes3D 7 8with open("result.txt") as f: 9 lines = f.read().splitlines() 10 11sep_indices = [] 12for i, line in enumerate(lines): 13 if line.startswith("t"): 14 sep_indices.append(i) 15 16data = [] 17for s, e in zip(sep_indices, sep_indices[1:] + [len(lines)]): 18 time_str = lines[s] 19 points_str = "\n".join(lines[s + 1 : e]) 20 21 time = float(re.match(r"t=(.+)ns", time_str).group(1)) 22 w, x, y, z = np.fromstring(points_str, sep=" ").reshape(-1, 4).T 23 color = np.where(w == 0, "r", "b") # 1列目が0なら赤、それ以外なら青 24 25 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") 3ax.set_xlim(-2.5, 2.5) 4ax.set_ylim(-2.5, 2.5) 5ax.set_zlim(-2.5, 2.5) 6 7# 空の散布図とタイトルオブジェクトを作成しておく。 8scatter = ax.scatter([], [], [], c="b") 9title = ax.set_title("") 10 11 12def update(sample): 13 # タイトル更新を更新する。 14 title.set_text(f"time={sample['time']}ns") 15 # 散布図更新を更新する。 16 scatter._offsets3d = ( 17 sample["x"], 18 sample["y"], 19 sample["z"], 20 ) 21 # 点とエッジの色を更新する。 22 scatter._facecolor3d = sample["color"] 23 scatter._edgecolor3d = sample["color"] 24 25# アニメーションを作成する。 26anim = FuncAnimation(fig, update, data, interval=100) 27anim.save("anim.gif", writer="pillow")

投稿2020/09/09 14:26

編集2020/09/09 14:27
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kinsho

2020/09/09 15:44

ご回答ありがとうございます! ただjanacondaでインストールしたjupyterで実行してみたところ2つ目のコードで以下のようなエラーが返されてしまいましたが,これはどのような原因が考えられるでしょうか? エラーメッセージをインターネットで検索し元データを観察してみましたが自分の力量では解決できませんでした. AttributeError Traceback (most recent call last) <ipython-input-11-c0f02f7efa0b> in <module> 1 fig = plt.figure(figsize=(9, 9)) 2 ax = fig.add_subplot(projection="3d") ----> 3 ax.set_xlim(-2.5, 2.5) 4 ax.set_ylim(-2.5, 2.5) 5 ax.set_zlim(-2.5, 2.5) AttributeError: 'NoneType' object has no attribute 'set_xlim' <Figure size 648x648 with 0 Axes>
Kinsho

2020/09/09 15:52

いただいたリンク先のsource codeを先に貼り付けるべきでしょうか? 試しにコピペしてみたらいろんな場所でIndentationErrorが返されてしまいましたが
tiitoi

2020/09/09 15:56

Python のバージョンはいくつでしょうか?回答の2つのコードをデータのテキストファイルと同じ階層で実行すれば動くと思います。 もし、動かないのであれば、コピペがうまくできていないか、Python 環境に問題があると思います。
Kinsho

2020/09/09 23:00

ありがとうございます! 試しにanacondaのアップデートしてみたら無事動きました! 夜中に余計な追加質問してしまいすみませんでした. tiitoiさんのおかげで課題解決できました.
guest

0

もしpythonでされるのならmatplotlibというグラフ描画のモジュールがあります。グラフの形式にもよりますが、折れ線グラフ等であれば数行でかけます。

これでグラフを書いて一枚ずつpngやpdfで保存することができますので、後でアニメ合成することができます。

リアルタイムでアニメーションすることもできますが、1ページずつの計算時間に依存してしまうので、私はいつも上記のようにしています。

投稿2020/09/09 09:09

glp

総合スコア102

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kinsho

2020/09/09 11:58

折れ線ではなく散布図のイメージですかね.ただ1枚ずつ作ると200枚とか500枚とかになったりするので一度に読み込ませて作りたいと考えています.
glp

2020/09/09 12:32

matplotlibのグラフはplt.savefigで指定した形式に出力できます まとめて一度にデータ読み込んでグラフ書けばいいのでは? 以前これで1000枚以上のグラフをアニメーションしたことがあるので問題なくできると思いますよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問