実現したいこと
- グラフの軸の表記を直したい
前提
ラズベリーパイに温度センサと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
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14288228219
https://teratail.com/help#posted-otherservice
「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。 また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」
対応してください。
コードについてはすでに回答がついているので、おかしくなっている原因についてだけ。
fig.subplots() する前の Axes が存在しない状態で、plt.grid() を実行しているため、そこで余分な Axes が作成されてしまっているからです。plt.grid() を後ろにすればいいですが、ax1.grid() を使うほうがいいと思います。(pyplotのapiとオブジェクト指向のapiはできるだけ混在させないほうがいいです)
