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

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

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

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

Raspberry Pi

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

解決済

グラフ横軸の時間目盛りの最小、最大を設定したい

F91_
F91_

総合スコア12

Matplotlib

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

Raspberry Pi

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

2回答

0評価

0クリップ

574閲覧

投稿2021/08/13 15:39

編集2021/08/22 14:05

前提・実現したいこと

機械稼働状況グラフの横軸表示を7:00スタートで24:00時終了としたい。
イメージ説明
グラフで機械が稼働している時間と停止している時間を可視化する事が目的です。
※青塗りつぶしが稼働中、無色は停止(y軸は1が最大、0が最小)
###ラズパイ光センサーのデータ記録方法
ラズパイ光センサーにて光を読み取った場合にラズパイ内のエクセルに書き込みし、matplotlibでエクセルデータ読み取り、リアルタイムにグラフ更新をかけています。このグラフにより、機械稼働状況の見える化を行っています。データ記録方法は稼働していた場合にシグナルタワーの稼働ランプを読み取り、現在時刻と1を記録、停止していた場合は停止ランプが作動するので現在時刻と0を記録、無人稼働の場合は稼働ランプと停止ランプの両方が点灯し、現在時刻と2列目に1と記録します。機械の電源が入っていない場合は記録がされないようにしています。光を読み取った時間を記録し、それをグラフにしているだけなのでその日の最初に読み取った時間がグラフにて表示される時間(画像では22:29スタート、終了23:38)となってしまってますが、グラフ表示はスタートを7:00、終了を24:00としたいです。※機械の電源が入っていない時間(シグナルタワーの点灯が全て消灯)も常に読み取るようにすることも考えましたが、休日など常に記録が続いてしまい、エクセルファイルが大量になってしまうので断念しました。
##機械稼働状況をシグナルタワーの点灯パターンにより記録しているコード

python

dissolution=1 #計測分解能[s] rate=0 def readadc(adcnum,clockpin,mosipin,misopin,cspin): if adcnum> 7 or adcnum<0: return -1 GPIO.output(cspin,GPIO.HIGH) GPIO.output(clockpin,GPIO.LOW) GPIO.output(cspin,GPIO.LOW) commandout=adcnum commandout |=0x18 commandout<<=3 for i in range(5): if commandout & 0x80: GPIO.output(mosipin,GPIO.HIGH) else: GPIO.output(mosipin,GPIO.LOW) commandout<<=1 GPIO.output(clockpin,GPIO.HIGH) GPIO.output(clockpin,GPIO.LOW) adcout=0 for i in range(13) GPIO.output(clockpin,GPIO.HIGH) GPIO.output(clockpin,GPIO.LOW) adcout<<=1 if i>0 and GPIO.input(misopin)==GPIO.HIGH: adcout |=0x1 GPIO.output(cspin,GPIO.HIGH) return adcout GPIO.setmode(GPIO.BCM) SPICS=8 SPIMISO=9 SPIMOSI=10 SPICLK=11 GPIO.setup(SPICLK,GPIO.OUT) GPIO.setup(SPIMOSI,GPIO.OUT) GPIO.setup(SPIMISO,GPIO.IN) GPIO.setup(SPICS,GPIO.OUT) today1=datetime.datetime.now() start=time.time() kikai='D-'+'32' try: while True: inputVal0=readadc(0,SPICLK,SPIMOSI,SPIMISO,SPICS) inputVal1=readadc(1,SPICLK,SPIMOSI,SPIMISO,SPICS) now=datetime.datetime.now() now6=now-datetime.timedelta(hours=6) nowday='{0:%Y%m%d}'.format(now6) nt1=now.strftime('%H:%M') nt='{0:%H%M}'.format(now) if inputVal0>2000 and inputVal1<2000: time1=time1+1 time2=time2+1 time10=time10+1 if time10 == 60: rcd=[] rcd.append(now.strftime('%H:%M')) rcd.append(1) rcd.append(0) f=open('mydata'+nowday+'.csv','a',newline='') wrtr=csv.writer(f,delimiter=',') wrtr.writerow(rcd) f.close() time10=0 data=pd.read_csv('mydata'+nowday+'.csv') x=data.iloc[:,0] x1=x.count() y=data.iloc[:,1] y1=y.sum() z=round(y1/x1*100,1) canvas1.create_text(85,20,text=('機械'),font=("",30,"roman"),tag='Y') canvas2.create_text(200,20,text=('稼働状況'),font=("",30,"roman"),tag='Y') canvas3.create_text(200,20,text=('本日の稼働率'),font=("",30,"roman"),tag='Y') canvas4.create_text(85,20,text=(kikai),font=("",30,"roman"),tag='Y') canvas5.create_text(100,20,text=('稼働中'),font=("",30,"roman"),tag='Y') canvas6.create_text(100,20,text=(''),font=("",30,"roman"),tag='Y') canvas7.create_text(200,20,text=(str(z)+'%'),font=("",40,"roman"),tag='Y') canvas1.update() canvas2.update() canvas3.update() canvas4.update() canvas5.update() canvas6.update() canvas7.update() canvas1.delete('Y') canvas2.delete('Y') canvas3.delete('Y') canvas4.delete('Y') canvas5.delete('Y') canvas6.delete('Y') canvas7.delete('Y') if inputVal1>2000 and inputVal0<2000 time1=time1+1 time3=time3+1 time7=time7+1 time11=time11+1 if time11 == 60: rcd=[] rcd.append(now.strftime('%H:%M')) rcd.append(0) rcd.append(0) f=open('mydata'+nowday+'.csv','a',newline='') wrtr=csv.writer(f,delimiter=',') wrtr.writerow(rcd) f.close() time11=0 data=pd.read_csv('mydata'+nowday+'.csv') x=data.iloc[:,0] x1=x.count() y=data.iloc[:,1] y1=y.sum() z=round(y1/x1*100,1) canvas1.create_text(85,20,text=('機械'),font=("",30,"roman"),tag='Y') canvas2.create_text(200,20,text=('稼働状況'),font=("",30,"roman"),tag='Y') canvas3.create_text(200,20,text=('本日の稼働率'),font=("",30,"roman"),tag='Y') canvas4.create_text(85,20,text=(kikai),font=("",30,"roman"),tag='Y') canvas5.create_text(100,20,text=(''),font=("",30,"roman"),tag='Y') canvas6.create_text(100,20,text=('停止中'),font=("",30,"roman"),tag='Y') canvas7.create_text(200,20,text=(str(z)+'%'),font=("",40,"roman"),tag='Y') canvas1.update() canvas2.update() canvas3.update() canvas4.update() canvas5.update() canvas6.update() canvas7.update() canvas1.delete('Y') canvas2.delete('Y') canvas3.delete('Y') canvas4.delete('Y') canvas5.delete('Y') canvas6.delete('Y') canvas7.delete('Y') if inputVal1<2000 and inputVal0<2000: time1=time1+1 time3=time3+1 time5=time5+1 elapsed_time=time.time()-start #(処理時間)=(処理が終わった時間)ー(処理を始めた時間) a=dissolution - elapsed_time sleep(a) start=time.time() except KeyboardInterrupt: #cntl+Cで停止 pass GPIO.cleanup()

光センサーにて記録しているエクセルデータ

ラズベリーパイ光センサーにて、60秒稼働稼働ランプを読み取った場合にエクセルデータ1列目に現在時刻、2列目に1、3列目に0と記録、停止ランプを60秒読み取った場合に1列目に現在時刻、2列目に0と記録、3列目に0、電源が入っていない場合は何も記録なし、無人稼働の場合(稼働ランプ、停止ランプが両方点灯)は2列目が0で3列目が1なります。
イメージ説明

エクセルデータをplotしている該当のソースコード

python

コード try: while True: inputVal0=readadc(0,SPICLK,SPIMOSI,SPIMISO,SPICS) inputVal1=readadc(1,SPICLK,SPIMOSI,SPIMISO,SPICS) now=datetime.datetime.now() now6=now-datetime.timedelta(hours=6) nowday='{0:%Y%m%d}'.format(now6) if inputVal0>2000: time1=time1+1 time2=time2+1 time10=time10+1 if time10 == 60: data=pd.read_csv('mydata'+nowday+'.csv') x=data.iloc[:,0] x1=x.count() y=data.iloc[:,1] y1=y.sum()#2行目の合計 z=round(y1/x1*100,1) w=round(y1/60,1) print('稼働時間'+str(w)+'時間') print('機械稼働率'+str(z)+'%') s='稼働時間'+str(w)+'時間'+'機械稼働率'+str(z)+'%' plt.xlabel("時刻") plt.ylabel("1=稼働,0=停止") plt.text(1000,0.4,s)#グラフにコメントを入れる plt.bar(x,y,width=1.0) plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(60)) plt.subplots_adjust(left=0.05, right=1, bottom=0.15, top=1) plt.draw() plt.pause(1) plt.clf() time10=0 else: if inputVal1>2000: time1=time1+1 time3=time3+1 time7=time7+1 time11=time11+1 print(now.strftime('%H:%M')) if time11 == 60: data=pd.read_csv('mydata'+nowday+'.csv') x=data.iloc[:,0] x1=x.count() y=data.iloc[:,1] y1=y.sum()#2行目の合計 z=round(y1/x1*100,1) w=round(y1/60,1) print('稼働時間'+str(w)+'時間') print('機械稼働率'+str(z)+'%') s='稼働時間'+str(w)+'時間'+'機械稼働率'+str(z)+'%' plt.xlabel("時刻") plt.ylabel("1=稼働,0=停止") plt.text(1000,0.4,s) plt.bar(x,y,width=1.0) plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(60)) plt.subplots_adjust(left=0, right=1, bottom=0.15, top=1) plt.draw() plt.pause(1) plt.clf() time11=0 else: time1=time1+1 time3=time3+1 elapsed_time=time.time()-start #(処理時間)=(処理が終わった時間)ー(処理を始めた時間) a=dissolution - elapsed_time sleep(1) start=time.time() except FileNotFoundError: pass

###plt.xlim(07:00,24:00)を入れた場合
7:00と24:00のデータがない場合もあるので8:06~8:23のデータを読み取りましたが、時刻の表示がありませんでした。作業者の機械稼働スタートが何らかの理由で7:30などになってしまう事もあり、逆に24時以前に機械電源オフとなり記録がなくなることもあります。常に7:00~24:00のデータがあるのであればxlimで対応出来ると思いました。
イメージ説明
イメージ説明

##ラズパイに保管しているエクセルデータ
イメージ説明

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

bsdfan

2021/08/17 08:41

csvから読み取った時刻データの型はどうなってますか? 文字列のままプロットしているのでは?
F91_

2021/08/18 03:53 編集

strftime('%H:%M')にてエクセル書き込みしてからそれをそのまま読み取っていますので文字列のままと考えています。plt.xlim(07:00,24:00)が数値に対して文字なので表示されないって事も考えられますかね?それも考えましたが、pd.read_csvにて読み取る際に数値への変換方法などあるか調べたりしていましたが上手くいっていません。
bsdfan

2021/08/18 05:25

文字列でplotすると、categoricalとして扱われるので、上限とか下限とかの概念が存在しません。 07:00~24:00までプロットしたかったら、x軸の値を '07:00'から'24:00'まで埋めてやらないといけません。(ppaulさんの回答の考え方) xlimで制御したいなら、なんらかの数値データに変換してやる必要があります。 が、pandasで時刻だけのデータを扱いにくいのと、24:00というのも時刻として扱えません(23:59までで24:00は翌日の00:00)ので、ちょっと面倒なところがありそうです。
F91_

2021/08/18 11:53

plotをstrftimeで変換せずに700~2400の数値でやってみたりしましたが、この場合760なども存在してしまい、グラフに空白が出来てさすがに時間として見づらいので断念しました。やはり変換方法を考えるしかなさそうですね・・・

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Matplotlib

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

Raspberry Pi

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。