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

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

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

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

NumPy

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

Python

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

Q&A

解決済

1回答

2986閲覧

Python Pyplotによるグラフのリアルタイム描画を任意のグラフ数で行いたい。

Kazumori102

総合スコア45

Matplotlib

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

NumPy

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

Python

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

0グッド

2クリップ

投稿2019/08/25 09:04

編集2019/09/07 16:52

前提・実現したいこと

Python Pyplotによるグラフのリアルタイム描画を任意のグラフ数で行いたい。
1つのグラフをリアルタイムで描画するプログラムを参考に、とりあえず描画に関するコードを数字をつけて増やしてみたはいいものの、これをいかに任意の数で出来るようにすればよいか初心者なので検討が付かない。実装の例と軽い解説があると嬉しい。

初期化の際にプロットの数をどうこうできればよいのだろうとは思うのだが、いかに実装したものか、調べるための知識もない。
Pyplotのオブジェクト指向のなんとかなどを読んでみたもののしっくりこない。関数の構造が理解しきれていないのだろう。わかりやすく図表でまとめてある学習に良いサイトなども知りたい。
質問のふさわしいタイトルとかもこれでいいのかさっぱりなので助言願いたい

該当のソースコード

Python

1# https://qiita.com/hausen6/items/b1b54f7325745ae43e47 から。 2# なお、( https://stackoverflow.com/questions/11874767/how-do-i-plot-in-real-time-in-a-while-loop-using-matplotlib )がオリジナルのようだ。 3 4 5import numpy as np 6import matplotlib.pyplot as plt 7 8 9 10fig, ax = plt.subplots(1, 1) 11x = np.arange(-np.pi, np.pi, 0.1) 12#y = np.sin(x) 13y1 = x 14y2 = x 15y3 = x 16# 初期化的に一度plotしなければならない 17# そのときplotしたオブジェクトを受け取る受け取る必要がある. 18# listが返ってくるので,注意 19lines1, = ax.plot(x, y1) 20lines2, = ax.plot(x, y2) 21lines3, = ax.plot(x, y3) 22 23 24# ここから無限にplotする 25while True: 26 # plotデータの更新 27 x += 0.1 28 y1 = np.sin(x) 29 y2 = np.sin(x+np.pi*2/3) 30 y3 = np.sin(x+np.pi*4/3)#とりあえず三相を表示してみた。 31 # 描画データを更新するときにplot関数を使うと 32 # lineオブジェクトが都度増えてしまうので,注意. 33 # 34 # 一番楽なのは上記で受け取ったlinesに対して 35 # set_data()メソッドで描画データを更新する方法. 36 lines1.set_data(x, y1) 37 lines2.set_data(x, y2) 38 lines3.set_data(x, y3) 39 40 # set_data()を使うと軸とかは自動設定されないっぽいので, 41 # 今回の例だとあっという間にsinカーブが描画範囲からいなくなる. 42 # そのためx軸の範囲は適宜修正してやる必要がある. 43 ax.set_xlim((x.min(), x.max())) 44 45 # 一番のポイント 46 # - plt.show() ブロッキングされてリアルタイムに描写できない 47 # - plt.ion() + plt.draw() グラフウインドウが固まってプログラムが止まるから使えない 48 # ----> plt.pause(interval) これを使う!!! 引数はsleep時間 49 plt.pause(.01) 50

追記19/09/08

nomukenさま、
回答ありがとうございます。
私にぎりぎりわからない程度の難易度で書かれておりとても勉強になります。
そこでいくつか質問があります。

  1. ラムダ式とは関数、引数をとり戻り値を返すを名前なしで簡単に行えるもの、と調べた限りでは出ましたが、配列に関数が入ってる?っていうのがC言語から転向してきた身としてはよくわからんのです。詳しく学べそうなページやら何かありますでしょうか?
  2. 「line,」などの「,」が付いている関数が手元の本では出てこないのでわからないのですが、同じく詳しく学べそうなページやら何かありますでしょうか?

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

Visual Studio Code
バージョン: 1.37.1 (user setup)
コミット: f06011ac164ae4dc8e753a3fe7f9549844d15e35
日付: 2019-08-15T16:17:55.855Z
Electron: 4.2.7
Chrome: 69.0.3497.128
Node.js: 10.11.0
V8: 6.9.427.31-electron.0
OS: Windows_NT x64 10.0.17763

Python 3.7.4
Package Version


astroid 2.2.5
colorama 0.4.1
cycler 0.10.0
decorator 4.4.0
isort 4.3.21
kiwisolver 1.1.0
lazy-object-proxy 1.4.1
matplotlib 3.1.1
mccabe 0.6.1
networkx 2.3
numpy 1.17.0
pandas 0.25.0
pip 19.2.2
pylint 2.3.1
pyparsing 2.4.2
python-dateutil 2.8.0
pytz 2019.2
PyYAML 5.1.2
setuptools 41.2.0
six 1.12.0
tornado 6.0.3
typed-ast 1.4.0
wrapt 1.11.2
XlsxWriter 1.1.9

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1import numpy as np 2import matplotlib.pyplot as plt 3 4fig, ax = plt.subplots(1, 1) 5 6funcs = [] 7funcs.append( (lambda x: np.sin(x)) ) 8funcs.append( (lambda x: np.sin(x+np.pi*2/3)) ) 9funcs.append( (lambda x: np.sin(x+np.pi*4/3)) ) 10 11#funcs.append( (lambda x: np.sin(x+np.pi*1/3)) ) 12#funcs.append( (lambda x: np.sin(x+np.pi*3/3)) ) 13#funcs.append( (lambda x: np.sin(x+np.pi*5/3)) ) 14 15x = np.arange(-np.pi, np.pi, 0.1) 16 17# funcの数だけyを準備する。 18y = [] 19for func in funcs: 20 y.append(func(x)) 21 22# yの数(=funcsの数)だけlineを作る 23lines = [] 24for item in y: 25 line, = ax.plot(x, item) 26 lines.append(line) 27 28while True: 29 x += 0.1 30 31 # funcの数だけ演算とグラフのデータ更新をする。 32 for i in range(len(funcs)): 33 y[i] = funcs[i](x) 34 lines[i].set_data(x, y[i]) 35 36 ax.set_xlim((x.min(), x.max())) 37 38 plt.pause(.01)

Python初心者の私にはこれが限界でした。
funcs.appendを増やしていけばその数に従ってグラフを増やしていきます。

配列をうまく使うのがポイントだと思います。データだけでなく関数(今回はラムダ式)も配列に含めることができます。

投稿2019/09/03 13:37

編集2019/09/03 13:55
nomuken

総合スコア1627

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

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

Kazumori102

2019/09/03 15:47

回答ありがとうございます。時間があるときに改めてしっかりと検証してコメントさせていただきます。
Kazumori102

2019/09/07 16:53

追記しました。よろしければご教授願えると嬉しいです。
nomuken

2019/09/07 19:57

> 質問1 私の理解では式を書くと「その場で関数を作って関数ポインタを返してくれる」です。今回はその関数ポインタをそのまま配列に追加したイメージです。 C++にも機能あります。 https://cpprefjp.github.io/lang/cpp11/lambda_expressions.html > 質問2 Pythonでは関数の戻り値を複数で返すことができ、その際の型はTuple型という変更できない配列になります。関数の中で "reutnr 1, 2"と書いてあると ( 1, 2 ) という値が返ってきます。"line, "というのはこの時、"1"だけを受け取るだけです。"line ="と書くとlineには"(1, 2)"と配列になりますが"line, ="と書けば[0]だけ受け取ります。"line = ax.plot(x, item)[0]"という書き方もできます。 https://note.nkmk.me/python-function-return-multiple-values/
Kazumori102

2019/09/15 16:42

C++にもあったんですね。知らなかったか無意識で使っていました。 タプルはそういうのがあるという知識のみだったので、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問