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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

2回答

2771閲覧

matplotlib 点を動かすアニメーションについて

J_RICE

総合スコア2

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

1クリップ

投稿2021/08/19 01:37

#達成したいこと
関数上を点が動くアニメーションを作成したいです.
その際,点の動くスピードを一定にする方法を模索しています.

##現状

python

1import numpy as np 2import matplotlib.pyplot as plt 3from matplotlib import animation 4 5 6plt.rcParams['figure.figsize'] = (6,5) 7plt.rcParams['font.family'] = 'Times New Roman' 8plt.rcParams['font.size'] = 16 9 10 11def axes_set_linewidth(axes, t=2, b=2, r=1, l=1): 12 axes.spines['top'].set_linewidth(t) 13 axes.spines['bottom'].set_linewidth(b) 14 axes.spines['right'].set_linewidth(r) 15 axes.spines['left'].set_linewidth(l) 16 17#変数設定,Nは(x軸の距離) 18N = 0.1 19x = np.arange(-2 * np.pi,2 * np.pi, N) 20y = np.sin(x) 21x1 = np.arange(-2 * np.pi,2 * np.pi,N) 22y1 = np.cos(x1)*2 23x2 = np.arange(-2 * np.pi,2 * np.pi,N) 24y2 = np.cos(x1)*0.5 25 26fig, ax = plt.subplots() 27 28ax.plot(x, y, color = 'blue', label = 'sin x') #sinカーブをplot 29ax.plot(x1, y1, color = 'red', label = 'cos x*2') #cosカーブをplot 30ax.plot(x2, y2, color = 'green', label = 'cos x*0.5') 31 32axes_set_linewidth(ax, t=0, r=0, b=2, l=2) 33ax.set_xlabel('x') 34ax.set_ylabel('y') 35ax.set_ylim(-1.2, 1.4) 36ax.legend(frameon = False) 37plt.subplots_adjust(top=0.9, bottom=0.2, right=0.9, left=0.2) 38 39ims = [] 40 41for i in range(len(x1)): 42 p = ax.plot(x[i], y[i], color = 'darkblue', marker = 'o', markersize = 10) 43 q= ax.plot(x1[i], y1[i], color = 'darkblue', marker = 'o', markersize = 10) 44 r= ax.plot(x2[i], y2[i], color = 'darkblue', marker = 'o', markersize = 10) 45 ims.append(p+q+r) 46 47 48ani = animation.ArtistAnimation(fig, ims, interval=100) 49ani.save('sincos2.gif', writer='imagemagick', dpi = 300)

#問題点
上記の場合,x軸でプロットの間隔を定めているため,アニメーション時の点の動く速さがバラバラになってしまいます.
一定の速度で関数上を点が動く方法をご教示いただけますと幸いです.
(上記の場合,振幅が大きい2cosx上の点が最も遅く右端に到達するようにしたいです.)

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

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

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

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

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

guest

回答2

0

原理的には、弧長を求める関数を作り、その逆関数の定義域に等間隔のサンプル点を取り、それで点を打っていけば一定の速度で関数のグラフ上を点が動くようになります。

弧長の求め方は、弧長に書かれている弧長の積分形式です。
例えば2cosxであれば√(1+4(sinx)**2)の積分となります。

積分も逆関数を正確に求めるのは難しいので、近似解でよければ以下のようにやればよいでしょう。

区間を十分大きい数に分割した一次元ndarray xを作る。
それぞれの分割点で関数f(x)の値を計算する。これをndarray yとする。
隣り合った分割点に対するグラフ上の点の距離を計算する。
上記の距離の累積和を取る。これを弧長を表すndarry sとする。
単位時間のn倍を表すndarray tを作成する。
単位時間あたりに進む距離をvとして、sの値がtvとなるようなxを補間によって求め、それを表すndarrayをuとする。
uにおけるf(u)の値を表すndarryをwとする。
uとwを使ってアニメーションを行う。

投稿2021/08/20 00:35

ppaul

総合スコア24666

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

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

0

ベストアンサー

python

1import numpy as np 2import matplotlib.pyplot as plt 3from matplotlib import animation, rc 4from itertools import zip_longest 5 6plt.rcParams['figure.figsize'] = (6,5) 7plt.rcParams['font.size'] = 16 8 9 10def axes_set_linewidth(axes, t=2, b=2, r=1, l=1): 11 axes.spines['top'].set_linewidth(t) 12 axes.spines['bottom'].set_linewidth(b) 13 axes.spines['right'].set_linewidth(r) 14 axes.spines['left'].set_linewidth(l) 15 16def createSinTrace(v,dt,A,phi): # y = Asin(x+phi)を曲線に沿って一定間隔になるように座標列を求める 17 xs = [0] 18 while xs[-1] < 2*np.pi : 19 dx = v*dt/np.sqrt(1+(A**2)*np.cos(xs[-1]+phi)**2) 20 xs.append(xs[-1]+dx) 21 xs=np.array(xs) 22 ys=A*np.sin(xs+phi) 23 return (xs,ys) 24 25(xs0,ys0) = createSinTrace(1, 0.1, 1, 0) 26(xs1,ys1) = createSinTrace(1, 0.1, 2, 0) 27 28 29fig, ax = plt.subplots() 30 31ax.plot(xs0, ys0, color = 'blue', label = 'sin x') 32ax.plot(xs1, ys1, color = 'blue', label = '2sin x') 33 34axes_set_linewidth(ax, t=0, r=0, b=2, l=2) 35ax.set_xlabel('x') 36ax.set_ylabel('y') 37# ax.set_ylim(-1.2, 1.4) 38ax.legend(frameon = False) 39plt.subplots_adjust(top=0.9, bottom=0.2, right=0.9, left=0.2) 40 41ims = [] 42 43for x0,x1,y0,y1 in zip_longest(xs0,xs1,ys0,ys1,fillvalue=0): 44 p = ax.plot(x0, y0, color = 'darkblue', marker = 'o', markersize = 10) 45 q = ax.plot(x1, y1, color = 'darkblue', marker = 'o', markersize = 10) 46 # r= ax.plot(x2[i], y2[i], color = 'darkblue', marker = 'o', markersize = 10) 47 ims.append(p+q) 48 # ims.append(p+q+r) 49 50 51ani = animation.ArtistAnimation(fig, ims, interval=100) 52rc('animation', html='jshtml') 53plt.close() 54ani 55

投稿2021/08/20 00:29

ozwk

総合スコア13521

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問