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

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

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

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Python 3.x

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

1回答

444閲覧

pythonのグラフ表示

masa326

総合スコア0

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Python 3.x

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2023/10/30 16:07

実現したいこと

  • グラフの軸の表記を直したい

前提

ラズベリーパイに温度センサとCO2センサを接続して、取得した値をもとにグラフを作りたいです。
環境としてはthonnyを使っております。

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

画像のようになってしまい軸の表示が乱れてしまします。
イメージ説明

該当のソースコード

python3

1import RPi.GPIO as GPIO 2import time 3import mh_z19 4import re 5import math # Mathモジュール 6import smbus # SMBus用モジュール 7from matplotlib import pyplot as plt # グラフ描画ライブラリ 8 9def read_adt7410(): 10 word_data = bus.read_word_data(address_adt7410, register_adt7410) 11 data = (word_data & 0xff00)>>8 | (word_data & 0x00ff)<<8 12 if data & 0x8000 == 0: # 温度が正または0の場合 13 temperature = data * 0.0078125 14 else: # 温度が負の場合、 絶対値を取ってからマイナスをかける 15 temperature = ( (~data&0xffff) + 1)*(-0.0078125) 16 return temperature 17 18fig = plt.figure(figsize=(12,8)) # グラフのサイズを指定 19plt.rcParams["font.size"] = 20 # フォントサイズ 20plt.grid() # グリッドを表示 21X1, Y1, Y2= [], [], [] # XとYの空のリスト 22start_time = time.perf_counter() # プログラム開始時の現在の時刻 23 24ax1 = fig.subplots() 25ax2 = ax1.twinx() 26 27bus = smbus.SMBus(1) 28address_adt7410 = 0x48 29register_adt7410 = 0x00 30 31try: 32 bus.write_byte_data(0x48,0x03,0x80) 33 while True: 34 data_co2 = str(mh_z19.read()) 35 data_str = re.sub(r"\D", "", data_co2) 36 data_num = data_str[1:] 37 print(data_num) 38 data = float(data_num) 39 temp = read_adt7410() 40 41 42 if len(X1) > 300: # Xに10個以上格納されたら 43 del X1[0] # Xの0番目(リストの左端)を削除 44 X_max = X1[0] + 200 # X軸の最大値設定 45 del Y1[0] # Yの0番目(リストの左端)を削除 46 del Y2[0] 47 else: 48 X_max = 200 # Xのリストの要素が10個以下ならX軸の最大値は14とする 49 50 ax1.cla() # 画面をクリア 51 ax2.cla() 52 Y1.append(float(data)) # リストの末尾にアイテムを追加 53 Y2.append(temp) 54 X1.append(time.perf_counter() - start_time) # プログラム開始からの経過時間をリストの末尾に追加 55 ax1.plot(X1, Y1, label = "CO2") 56 ax2.plot(X1, Y2, label = "temperature") 57 58 ax1.set_xlabel("Time [s]") 59 ax1.set_ylabel("CO2 [ppm]") 60 ax2.set_ylabel("temperature [℃]") 61 62 ax1.set_xlim(X1[0], X_max) 63 ax2.set_xlim(X1[0], X_max) 64 ax1.set_ylim(0, 3000) 65 ax2.set_ylim(0, 40) 66 #plt.plot(X1, Y1, label = "CO2") # X,Yをプロット 67 #plt.plot(X2, Y2, label = "temperature") 68 #plt.ylim(0, 3000) # Y軸の表示範囲 69 #plt.xlim(X1[0], X_max) # X軸の表示範囲 70 #plt.xlabel('Time [s]') # X軸ラベル 71 #plt.ylabel('CO2 [ppm]') # Y軸ラベル 72 plt.legend() 73 plt.pause(0.1) # 更新時間間隔1秒で描画する 74 75except KeyboardInterrupt: 76 GPIO.clenup() 77 pass 78 79

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

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

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

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

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

thkana

2023/10/30 22:05

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14288228219 https://teratail.com/help#posted-otherservice 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。 また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」 対応してください。
bsdfan

2023/10/31 01:52

コードについてはすでに回答がついているので、おかしくなっている原因についてだけ。 fig.subplots() する前の Axes が存在しない状態で、plt.grid() を実行しているため、そこで余分な Axes が作成されてしまっているからです。plt.grid() を後ろにすればいいですが、ax1.grid() を使うほうがいいと思います。(pyplotのapiとオブジェクト指向のapiはできるだけ混在させないほうがいいです)
guest

回答1

0

以下、センサからの入力の代わりに乱数を使っています。

python

1import matplotlib.pyplot as plt 2import random 3import time 4 5_, ax1 = plt.subplots(figsize=(12,8)) # グラフのサイズを指定 6plt.rcParams["font.size"] = 20 # フォントサイズ 7X1, Y1, Y2= [], [], [] # XとYの空のリスト 8 9ax2 = ax1.twinx() 10 11start_time = time.perf_counter() 12 13while True: 14 if len(X1) > 300: # Xに10個以上格納されたら 15 del X1[0] # Xの0番目(リストの左端)を削除 16 X_max = X1[0] + 200 # X軸の最大値設定 17 del Y1[0] # Yの0番目(リストの左端)を削除 18 del Y2[0] 19 else: 20 X_max = 200 21 22 ax1.cla() 23 ax2.cla() 24 Y1.append(random.randint(0, 3000)) 25 Y2.append(random.randint(0, 40)) 26 X1.append(time.perf_counter() - start_time) 27 ax1.plot(X1, Y1, label = "CO2", color="red") 28 ax2.plot(X1, Y2, label = "temperature", color="blue") 29 30 ax1.set_xlabel("Time [s]") 31 ax1.set_ylabel("CO2 [ppm]") 32 ax2.yaxis.set_label_position("right") 33 ax2.set_ylabel("temperature [℃]") 34 35 ax1.set_xlim(X1[0], X_max) 36 ax2.set_xlim(X1[0], X_max) 37 ax1.set_ylim(0, 3000) 38 ax2.set_ylim(0, 40) 39 40 ax1.grid() 41 lines1, labels1 = ax1.get_legend_handles_labels() 42 lines2, labels2 = ax2.get_legend_handles_labels() 43 44 ax1.legend(lines1+lines2, labels1+labels2) 45 plt.pause(0.1)

イメージ説明

投稿2023/10/30 20:35

melian

総合スコア21118

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問