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

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

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

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

Python

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

Q&A

解決済

2回答

1707閲覧

matplotlib

okioki

総合スコア5

Matplotlib

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

Python

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

0グッド

0クリップ

投稿2019/08/14 11:41

前提・実現したいこと

Raspberry piを使って半固定抵抗の値を読み込むプログラムを作成しています。
ベースとなっているのはblue backsの「最新 Raspberry oiで学ぶ電子工作 金丸隆志・著」の第6章のサンプルプログラムです。
読み込んだ値を角度に変換し、matplotlibを用いて1分間の出力値をグラフにアニメーションとして表示させたいのです(時間が経過するにつれて値が更新されてグラフが伸びていくようなイメージです)。

発生している問題・エラーメッセージ

現在起こっている問題は、グラフのフレームは表示されるのですが肝心のグラフがプロットされない点です。

該当のソースコード

python

1import RPi.GPIO as GPIO 2from time import sleep 3import numpy as np 4import matplotlib.pyplot as plt 5import matplotlib.animation as animation 6 7fig = plt.figure() 8inputval = [] 9 10def readadc(adcnum, clockpin, mosipin, misopin, cspin): #実装は省略 11 12for i in range(300): 13 inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS) 14 inputVal0 = inputVal0 * 270 / 4095 #出力値を角度に変換 15 y = inputVal0 16 inputVal1 = plt.plot(i*0.2, y) 17 inputval.append(inputVal1) 18 sleep(0.2) 19 20ani = animation.ArtistAnimation(fig, inputval, interval = 200) 21plt.show()

readadc関数はADコンバータからの値を読み込む関数で、半固定抵抗の値が0〜4095の範囲で返ってきます。

試したこと

以下のように簡単なコードに書き換えましたが、上と同じくグラフの縦軸・横軸は表示されましたがグラフの線が出てきません。

python

1from time import sleep 2import numpy as np 3import matplotlib.pyplot as plt 4import matplotlib.animation as animation 5 6 7fig = plt.figure() 8inputval = [] 9 10for i in range(10): 11 y = i 12 inputVal1 = plt.plot(i*0.2, y) 13 inputval.append(inputVal1) 14 15ani = animation.ArtistAnimation(fig, inputval, interval = 200) 16plt.show()

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

pythonのバージョンは3.7.3
matplotlibのバージョンは2.2.4です

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

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

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

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

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

guest

回答2

0

plt.plot(i*0.2, y) は i * 0.2, y ともにスカラー値であるため、グラフ上に点が1個だけ描画されている状態です。
なので、描画されているが、小さくて見えない (気づかない) だけだと思います。

折れ線グラフを描画したい場合は plot 関数には x の値一覧、y の値一覧を渡してあげる必要があります。
例えば、x**2 の関数を描画したい場合は

x = np.linspace(-2, 2, 100) で [-2, 2] の範囲に100個の点を作成し、
その各点に対応する y の値を y = x**2 のようにして求めます。

python

1import matplotlib.pyplot as plt 2import numpy as np 3 4# 1点 (1, 1) だけ描画される。 5plt.plot(1, 1) 6plt.show() 7 8# 折れ線が描画される。 9x = np.linspace(-2, 2, 100) 10y = x**2 11plt.plot(x, y) 12plt.show()

サンプルコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3import matplotlib.animation as animation 4 5 6fig = plt.figure() 7frames = [] 8 9for i in range(10): 10 y = np.linspace(0, i, 100) 11 x = y * 0.2 12 13 lines = plt.plot(x, y, "b-") 14 frames.append(lines) 15 16ani = animation.ArtistAnimation(fig, frames, interval=200) 17ani.save("result.gif") 18 19plt.show()

投稿2019/08/14 12:05

編集2019/08/14 13:33
tiitoi

総合スコア21956

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

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

okioki

2019/08/17 03:19

ありがとうございました!
guest

0

ベストアンサー

下記で見えるようにはなるかと思います。でも「点」です。

python

1inputVal1 = plt.plot(i*0.2, y, marker="D")

下記でグラフになります。

Python

1fig = plt.figure() 2inputval = [] 3x = [] 4y = [] 5 6for i in range(300): 7 inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS) 8 inputVal0 = inputVal0 * 270 / 4095 #出力値を角度に変換 9 x.append(i*0.2) 10 y.append(inputVal0) 11 inputVal1 = plt.plot(x, y) 12 inputval.append(inputVal1) 13 print(i*0.2,y) 14 15ani = animation.ArtistAnimation(fig, inputval, interval = 200) 16plt.show()

投稿2019/08/14 12:29

meg_

総合スコア10579

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

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

okioki

2019/08/17 03:19

ありがとうございます! 助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問