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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1570閲覧

Pythonで、点と点の間を任意の関数で補完してプロットしたい

Copula

総合スコア13

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/11/25 11:08

前提・実現したいこと

現在、Pythonを用いて二次元プロットをしたいと考えております。
具体的には、次のようなグラフを描写したいです。
イメージ説明
(http://people.ucalgary.ca/~aswish/Swishchuk_LaLTalk.pdfより引用)

描写するデータとしては、x軸にタイムスタンプ、y軸に時刻tの関数λ(t)となります。
各時刻t_iにおけるλ(t)はすでに計算済みで、値として配列に格納しているのですが、
点間(黒点から次の白抜き点)を補完するような方法を模索しています。

Matplotlibを用いると線形補間や階段関数による補完はできるのですが、
いかんせんこのように指数的に減衰していく関数ですので、独力だけでは解決できず質問させていただいた次第です。

みなさまのお力を貸していただければ幸いです。

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

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

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

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

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

can110

2018/11/25 11:57

「指数的に減衰していく関数」について、黒点を原点とした場合のf(t)の関数を示されると回答得られやすいと思います。
guest

回答1

0

ベストアンサー

自前で補完するしかない気がします。

理由は、matplotlibにある曲線の補完は基本的にBezier Curveしかないと思うからです。つまり任意の初等関数を直接描画する方法はないと思います。

ただし本件の場合はBezier Curveを使うまでもなく、単に「tの区間を充分細かくしてλ(t)の値を計算した上で直線グラフとして描画」でもそこそこ満足できるものが描けると思います。計算機のディスプレイはたかだか1000画素程度しかないので。

以下はごく簡単に(元の図にある色々なあやは気にせず)コードを書いてみたものです。このアプローチでは実際の関数がどのようなものかはあまり問題でなく単に連続関数でありさえすればよいのでテキトーにそれらしい関数(f_atが返している関数)を用いました。

python

1import matplotlib.pyplot as plt 2import numpy as np 3 4λ = 1 5 6def f_at(ti, yi): 7 return lambda t: λ + (yi - λ) * np.exp(-(t - ti)) 8 9ts = [0, 1, 3, 4, 7] 10ys = [0, 2, 3, 4, 0] # 最後の要素の値はグラフの結果には反映されない 11 12interpolation_step = 0.1 13 14for i in range(len(ts) - 1): 15 t0, t1 = ts[i:i + 2] 16 y0 = λ + ys[i] 17 lts = np.linspace(t0, t1, int((t1 - t0) / interpolation_step) + 2) 18 lys = f_at(t0, y0)(lts) 19 # 一つの連続区間のグラフをプロット 20 plt.plot(lts, lys, color='black') 21 if i > 0: 22 # 不連続点の破線をプロット 23 plt.plot((t0, t0), (pre_y, y0), dashes=(4, 4), color='black') 24 pre_y = lys[-1] 25 26plt.show()

イメージ説明
不連続な点を破線で描画したり端点の円を描画する場合は
matplotlib.patches.Ellpise
matplotlib.patches.PathPatch
などを用いてもう少し凝ったことをしなくてはならないと思います。


訂正: 元の回答では不連続関数の座標値を全部連結して最後に1回だけプロットしてましたが、個々の連続部分を複数回プロットした方がより自然なやり方と思ったのでコードおよび結果の図を差し替えさせていただきました。

投稿2018/11/25 16:33

編集2018/11/26 03:17
KSwordOfHaste

総合スコア18392

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

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

Copula

2018/11/26 02:32

とても詳細な解説ありがとうございます。 実際に適当な減衰関数まで仮定していただくなど、 私の質問の至らない部分までフォローしていただいたので今回はベストアンサーにさせていただきます。
KSwordOfHaste

2018/11/26 03:08

自分もmatplotlibを調べながら使っている初心者なので他の方の回答をみて「そうすればいいのかぁ」なんてことがよくあります。本回答もイマイチであることに気づきました。matplotlibは複数のグラフを一枚のAxesに重ねて描くのはごく普通にできるのでもっと単純に不連続関数を描画できました。すみませんが回答をも少しだけマシなものに変更させてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問