回答編集履歴

9

末尾に画像を追加

2021/08/23 04:36

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -695,3 +695,7 @@
695
695
  plt.show()
696
696
 
697
697
  ```
698
+
699
+
700
+
701
+ ![イメージ説明](ee5a68e8fe9b081164c1ee52fe31ae57.png)

8

回答の末尾に書き直したコードを追加

2021/08/23 04:36

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -615,3 +615,83 @@
615
615
  ~~とするとよいと思います。
616
616
 
617
617
  描画のためにかかる時間が加算されるので、これでも1秒おきにならないと思うので、その時は`plt.pause(1)`の数字を、1 -> 0.9 -> 0.8 -> 0.7 -> 0.6... とどんどん小さくして試してみるといいです。私の環境では、0.1 でもちゃんと描画されました。~~
618
+
619
+
620
+
621
+ ---
622
+
623
+
624
+
625
+ なるべく元のプログラムを変更しない形に書き直したコードを追記します。
626
+
627
+ 稼働率の計算・表示の部分のコードは削除してあります。データの補完の開始時刻は7:00にしてあります。
628
+
629
+
630
+
631
+ ```python
632
+
633
+ import datetime
634
+
635
+
636
+
637
+ import pandas as pd
638
+
639
+ import matplotlib.pyplot as plt
640
+
641
+ import matplotlib.dates as mdates
642
+
643
+
644
+
645
+ data=pd.read_csv('mydata'+nowday+'.csv', header=None, names=[0,1], index_col=0, parse_dates=True)
646
+
647
+ x=data.index
648
+
649
+ y=data.iloc[:,0]
650
+
651
+
652
+
653
+ d_today = datetime.date.today()
654
+
655
+ dt_start = datetime.datetime(d_today.year, d_today.month, d_today.day, 7, 0)
656
+
657
+ df_start = pd.DataFrame([[0, 0]], index=[dt_start])
658
+
659
+ d_tomorrow = d_today + datetime.timedelta(days=1)
660
+
661
+ dt_end = datetime.datetime(d_tomorrow.year, d_tomorrow.month, d_tomorrow.day)
662
+
663
+ df_end = pd.DataFrame([[0, 0]], index=[dt_end])
664
+
665
+ data = df_start.append([data, df_end])
666
+
667
+ data = data.asfreq('min', fill_value=0)
668
+
669
+
670
+
671
+ plt.figure(figsize=(12.8, 4.8))
672
+
673
+ plt.xlabel("時刻")
674
+
675
+ plt.ylabel("1=稼働,0=停止")
676
+
677
+ plt.bar(x,y,width=0.0007)
678
+
679
+ plt.gca().xaxis.set_major_locator(mdates.HourLocator(interval=1))
680
+
681
+ plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
682
+
683
+ plt.gca().set_xlim(
684
+
685
+ xmin=datetime.datetime(d_today.year, d_today.month, d_today.day, 7, 0),
686
+
687
+ xmax=dt_end
688
+
689
+ )
690
+
691
+ plt.gca().set_yticks([0, 1])
692
+
693
+ plt.tight_layout()
694
+
695
+ plt.show()
696
+
697
+ ```

7

回答に文言を追加

2021/08/23 04:11

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -524,7 +524,7 @@
524
524
 
525
525
 
526
526
 
527
- あるいは FileNotFoundError を利用して次のようにすることもできます。
527
+ あるいは FileNotFoundError を利用して次のようにすることもできます。この場合は条件としては、厳密には「ファイルがある、ファイルがない」になります。
528
528
 
529
529
 
530
530
 

6

回答の追記、および既存の回答の文章の修正

2021/08/20 22:42

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -504,7 +504,55 @@
504
504
 
505
505
 
506
506
 
507
+ 「観測結果をファイルに保存しているプログラム」と、「観測結果をグラフに表示しているプログラム」は別々とのことですが、おそらく「点灯パターンによってはグラフの読み込みをさせないようにしたかった」ために、前者のプログラムを後者に流用されたのだと思います。
508
+
509
+ しかしご自分でも書かれているように、「条件としては点灯がある、点灯がない(休日など)の2パターンで良」いのであれば、たとえば以下のようにプログラムを簡略化することができます。そうすればプロットのためのコードは、関数にするまでもなく、ひとつになります。
510
+
511
+
512
+
513
+ ```python
514
+
515
+ while True:
516
+
517
+ if inputVal0 > 2000 or inputVal1 > 2000:
518
+
519
+ # プロットのためのコード
520
+
521
+ sleep(60)
522
+
523
+ ```
524
+
525
+
526
+
527
+ あるいは FileNotFoundError を利用して次のようにすることもできます。
528
+
529
+
530
+
531
+ ```python
532
+
533
+ while True:
534
+
535
+ try:
536
+
537
+ # プロットのためのコード
538
+
539
+ except FileNotFoundError:
540
+
541
+ continue
542
+
543
+ finally:
544
+
545
+ sleep(60)
546
+
547
+ ```
548
+
549
+
550
+
551
+ ---
552
+
553
+
554
+
507
- (追記)すみません、グラフが描画されるのは約1分に1回でしたね。簡略化したプログラムでテストしていたら勘違いをしてしまいました。以下は取り消します。
555
+ (追記)すみません、以下は取り消します。グラフが描画されるのは約1分に1回でしたね。簡略化したプログラムでテストしていたら勘違いをしてしまいました。
508
556
 
509
557
 
510
558
 

5

間違えている箇所があったので打ち消し線で削除および補記

2021/08/20 22:26

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -504,7 +504,11 @@
504
504
 
505
505
 
506
506
 
507
+ (追記)すみません、グラフが描画されるのは約1分に1回でしたね。簡略化したプログラムでテストしていたら勘違いをしてしまいました。以下は取り消します。
508
+
509
+
510
+
507
- 質問文にプログラムの全体が掲載されていないので正確には分からないのですが、プログラムのループ構造の大枠は以下のようになっているのではないでしょうか?
511
+ ~~質問文にプログラムの全体が掲載されていないので正確には分からないのですが、プログラムのループ構造の大枠は以下のようになっているのではないでしょうか?~~
508
512
 
509
513
 
510
514
 
@@ -532,9 +536,9 @@
532
536
 
533
537
 
534
538
 
535
- この構造だと、プロットのプログラム中でも plt.pause(1) を行なっていますので、稼働中は sleep(1) と合わせて2秒おきにループが回ることになりますがそれで大丈夫ですか?
539
+ ~~この構造だと、プロットのプログラム中でも plt.pause(1) を行なっていますので、稼働中は sleep(1) と合わせて2秒おきにループが回ることになりますがそれで大丈夫ですか?~~
536
-
540
+
537
- もし1秒おきにループが回った方がいいなら、
541
+ ~~もし1秒おきにループが回った方がいいなら、~~
538
542
 
539
543
 
540
544
 
@@ -560,6 +564,6 @@
560
564
 
561
565
 
562
566
 
563
- とするとよいと思います。
567
+ ~~とするとよいと思います。
564
-
568
+
565
- 描画のためにかかる時間が加算されるので、これでも1秒おきにならないと思うので、その時は`plt.pause(1)`の数字を、1 -> 0.9 -> 0.8 -> 0.7 -> 0.6... とどんどん小さくして試してみるといいです。私の環境では、0.1 でもちゃんと描画されました。
569
+ 描画のためにかかる時間が加算されるので、これでも1秒おきにならないと思うので、その時は`plt.pause(1)`の数字を、1 -> 0.9 -> 0.8 -> 0.7 -> 0.6... とどんどん小さくして試してみるといいです。私の環境では、0.1 でもちゃんと描画されました。~~

4

説明を追加

2021/08/19 12:20

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -440,6 +440,10 @@
440
440
 
441
441
 
442
442
 
443
+ もうひとつ補足すると、`plt.gca()`で取得されるものと、`ax = fig.add_subplot()`の`ax`は、同じものです。
444
+
445
+
446
+
443
447
  ---
444
448
 
445
449
 

3

ラベルの文字列が間違っていたのでコードを訂正

2021/08/19 11:21

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -144,7 +144,7 @@
144
144
 
145
145
  )
146
146
 
147
- ax.set_xlabel("時 ", fontsize='large', labelpad=10)
147
+ ax.set_xlabel("時 ", fontsize='large', labelpad=10)
148
148
 
149
149
 
150
150
 

2

コードの一部を変更

2021/08/19 11:06

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -28,6 +28,8 @@
28
28
 
29
29
  "稼働時間 xx 時間 機械稼働率 xx %" の文字列については、現在の実際のプロットでどこに配置されているのか質問文からは分からなかったので、適当なところに配置しています。
30
30
 
31
+
32
+
31
33
  y軸のラベル "1=稼働,0=停止" は削除して、代わりに軸目盛りラベルを [0, 1] から [停止, 稼働] に変更しています。
32
34
 
33
35
 
@@ -84,17 +86,17 @@
84
86
 
85
87
 
86
88
 
87
- dt_now = datetime.datetime.now()
89
+ d_today = datetime.date.today()
88
-
90
+
89
- dt_start = datetime.datetime(dt_now.year, dt_now.month, dt_now.day, 0, 1)
91
+ dt_start = datetime.datetime(d_today.year, d_today.month, d_today.day, 0, 1)
90
92
 
91
93
  df_start = pd.DataFrame([[0, 0]], index=[dt_start])
92
94
 
93
95
 
94
96
 
95
- dt_tomorrow = dt_now + datetime.timedelta(days=1)
97
+ d_tomorrow = d_today + datetime.timedelta(days=1)
96
-
98
+
97
- dt_end = datetime.datetime(dt_tomorrow.year, dt_tomorrow.month, dt_tomorrow.day)
99
+ dt_end = datetime.datetime(d_tomorrow.year, d_tomorrow.month, d_tomorrow.day)
98
100
 
99
101
  df_end = pd.DataFrame([[0, 0]], index=[dt_end])
100
102
 
@@ -136,7 +138,7 @@
136
138
 
137
139
  ax.set_xlim(
138
140
 
139
- xmin=datetime.datetime(dt_now.year, dt_now.month, dt_now.day, 7, 0),
141
+ xmin=datetime.datetime(d_today.year, d_today.month, d_today.day, 7, 0),
140
142
 
141
143
  xmax=dt_end
142
144
 
@@ -272,9 +274,9 @@
272
274
 
273
275
  ```python
274
276
 
275
- dt_now = datetime.datetime.now()
277
+ d_today = datetime.date.today()
276
-
278
+
277
- dt_start = datetime.datetime(dt_now.year, dt_now.month, dt_now.day, 0, 1)
279
+ dt_start = datetime.datetime(d_today.year, d_today.month, d_today.day, 0, 1)
278
280
 
279
281
  df_start = pd.DataFrame([[0, 0]], index=[dt_start])
280
282
 
@@ -296,9 +298,9 @@
296
298
 
297
299
  ```python
298
300
 
299
- dt_tomorrow = dt_now + datetime.timedelta(days=1)
301
+ d_tomorrow = d_today + datetime.timedelta(days=1)
300
-
302
+
301
- dt_end = datetime.datetime(dt_tomorrow.year, dt_tomorrow.month, dt_tomorrow.day)
303
+ dt_end = datetime.datetime(d_tomorrow.year, d_tomorrow.month, d_tomorrow.day)
302
304
 
303
305
  df_end = pd.DataFrame([[0, 0]], index=[dt_end])
304
306
 

1

説明を追加

2021/08/19 10:51

投稿

etherbeg
etherbeg

スコア1195

test CHANGED
@@ -7,3 +7,553 @@
7
7
 
8
8
 
9
9
  で、グラフに表示するX軸の範囲を設定することができます。
10
+
11
+
12
+
13
+ ---
14
+
15
+
16
+
17
+ 以下プロット例です(plt.xlim()ではなくax.set_xlim()を使用していますが、やっていることは同じです)。
18
+
19
+
20
+
21
+ ![イメージ説明](e3ab69d6017e1ca879cfecd2994298bc.png)
22
+
23
+
24
+
25
+ データは「matplotlibにて読み取っているエクセルデータ」に貼っていただいたものを使っていますが(データの読み込みに使っているのはmatplotlibではなくpandasでしょう)、実際には記録自体がされていない時間もあるとのことなので(「光センサーにて記録しているエクセルデータ」の図も23:27と23:28が欠けている)、8時台の連続した2分、9時台からも1分のデータを間引いています。
26
+
27
+
28
+
29
+ "稼働時間 xx 時間 機械稼働率 xx %" の文字列については、現在の実際のプロットでどこに配置されているのか質問文からは分からなかったので、適当なところに配置しています。
30
+
31
+ y軸のラベル "1=稼働,0=停止" は削除して、代わりに軸目盛りラベルを [0, 1] から [停止, 稼働] に変更しています。
32
+
33
+
34
+
35
+ 上記プロットのコードは以下です。
36
+
37
+
38
+
39
+ ```python
40
+
41
+ import datetime
42
+
43
+ from io import StringIO
44
+
45
+
46
+
47
+ import pandas as pd
48
+
49
+ import matplotlib.pyplot as plt
50
+
51
+ import matplotlib.dates as mdates
52
+
53
+
54
+
55
+ operation_data = """7:58 1 0
56
+
57
+ 7:59 1 0
58
+
59
+ 8:00 1 0
60
+
61
+ 8:01 1 0
62
+
63
+ 8:02 1 0
64
+
65
+ (中略)
66
+
67
+ 10:18 1 0
68
+
69
+ 10:19 1 0
70
+
71
+ 10:20 1 0
72
+
73
+ 10:21 1 0
74
+
75
+ 10:22 1 0"""
76
+
77
+
78
+
79
+ data = pd.read_csv(StringIO(operation_data), sep='\s+', header=None, names=[0,1], index_col=0, parse_dates=True)
80
+
81
+ data = data.asfreq('min', fill_value=0)
82
+
83
+ observed_data_num = len(data)
84
+
85
+
86
+
87
+ dt_now = datetime.datetime.now()
88
+
89
+ dt_start = datetime.datetime(dt_now.year, dt_now.month, dt_now.day, 0, 1)
90
+
91
+ df_start = pd.DataFrame([[0, 0]], index=[dt_start])
92
+
93
+
94
+
95
+ dt_tomorrow = dt_now + datetime.timedelta(days=1)
96
+
97
+ dt_end = datetime.datetime(dt_tomorrow.year, dt_tomorrow.month, dt_tomorrow.day)
98
+
99
+ df_end = pd.DataFrame([[0, 0]], index=[dt_end])
100
+
101
+
102
+
103
+ data = df_start.append([data, df_end])
104
+
105
+ data = data.asfreq('min', fill_value=0)
106
+
107
+
108
+
109
+ running_data_num = data[0].sum()
110
+
111
+ operation_rate = round(running_data_num / observed_data_num * 100, 1)
112
+
113
+ operation_time = round(observed_data_num / 60, 1)
114
+
115
+ operation_info = f"稼働時間 {operation_time} 時間 機械稼働率 {operation_rate} %"
116
+
117
+
118
+
119
+ fig = plt.figure(figsize=(12.8, 4.8))
120
+
121
+ ax = fig.add_subplot()
122
+
123
+
124
+
125
+ ax.text(0.5, 1.03, operation_info, transform=ax.transAxes, fontsize=12, horizontalalignment="center")
126
+
127
+
128
+
129
+ ax.bar(data.index, data[0], width=0.0007)
130
+
131
+
132
+
133
+ ax.xaxis.set_major_locator(mdates.HourLocator(interval=1))
134
+
135
+ ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
136
+
137
+ ax.set_xlim(
138
+
139
+ xmin=datetime.datetime(dt_now.year, dt_now.month, dt_now.day, 7, 0),
140
+
141
+ xmax=dt_end
142
+
143
+ )
144
+
145
+ ax.set_xlabel("時 間", fontsize='large', labelpad=10)
146
+
147
+
148
+
149
+ ax.set_yticks([0, 1])
150
+
151
+ ax.set_yticklabels(["停止", "稼働"])
152
+
153
+
154
+
155
+ plt.tight_layout()
156
+
157
+ plt.show()
158
+
159
+ ```
160
+
161
+
162
+
163
+ データの扱いについては説明が必要かと思いますので、以下に説明します。
164
+
165
+
166
+
167
+ ```python
168
+
169
+ data = pd.read_csv(StringIO(operation_data), sep='\s+', header=None, names=[0,1], index_col=0, parse_dates=True)
170
+
171
+ ```
172
+
173
+
174
+
175
+ `header=None`でデータの1行目が列名として読み込まれることを防ぎます。
176
+
177
+ `names=[0,1]`で列名を振り直します(後でDataFrameを結合するために必要)。
178
+
179
+ `index_col=0, parse_dates=True`で時間の列を日付型(datetime64[ns]型)のインデックスとして読み込みます。日付は自動的に今日の日付が設定されます。
180
+
181
+
182
+
183
+ 読み込み結果は次のようになります。
184
+
185
+
186
+
187
+ ||0|1|
188
+
189
+ |:--|:--:|--:|
190
+
191
+ |2021-08-19 07:58:00|1|0|
192
+
193
+ |2021-08-19 07:59:00|1|0|
194
+
195
+ |2021-08-19 08:00:00|1|0|
196
+
197
+ |2021-08-19 08:01:00|1|0|
198
+
199
+ |2021-08-19 08:02:00|1|0|
200
+
201
+ |...|||
202
+
203
+ |2021-08-19 10:18:00|1|0|
204
+
205
+ |2021-08-19 10:19:00|1|0|
206
+
207
+ |2021-08-19 10:20:00|1|0|
208
+
209
+ |2021-08-19 10:21:00|1|0|
210
+
211
+ |2021-08-19 10:22:00|1|0|
212
+
213
+
214
+
215
+ ```python
216
+
217
+ data = data.asfreq('min', fill_value=0)
218
+
219
+ observed_data_num = len(data)
220
+
221
+ ```
222
+
223
+
224
+
225
+ `data.asfreq('min', fill_value=0)`で、欠落しているインデックス(記録が行われていない時間)を分単位で補完し、値を 0 で埋めます。たとえば
226
+
227
+
228
+
229
+ ||0|1|
230
+
231
+ |:--|:--:|--:|
232
+
233
+ |...|||
234
+
235
+ |2021-08-19 08:26:00|1|0|
236
+
237
+ |2021-08-19 08:29:00|1|0|
238
+
239
+ |...|||
240
+
241
+
242
+
243
+ の箇所は
244
+
245
+
246
+
247
+ ||0|1|
248
+
249
+ |:--|:--:|--:|
250
+
251
+ |...|||
252
+
253
+ |2021-08-19 08:26:00|1|0|
254
+
255
+ |2021-08-19 08:27:00|0|0|
256
+
257
+ |2021-08-19 08:28:00|0|0|
258
+
259
+ |2021-08-19 08:29:00|1|0|
260
+
261
+ |...|||
262
+
263
+
264
+
265
+ と補完されます。
266
+
267
+
268
+
269
+ `observed_data_num = len(data)`でデータ数(何分観測したか)を取得しておきます。
270
+
271
+
272
+
273
+ ```python
274
+
275
+ dt_now = datetime.datetime.now()
276
+
277
+ dt_start = datetime.datetime(dt_now.year, dt_now.month, dt_now.day, 0, 1)
278
+
279
+ df_start = pd.DataFrame([[0, 0]], index=[dt_start])
280
+
281
+ ```
282
+
283
+
284
+
285
+ その日の 0 時 1 分のデータを作成します。値は 0 で埋めます。df_startの内容は以下です。
286
+
287
+
288
+
289
+ ||0|1|
290
+
291
+ |:--|:--:|--:|
292
+
293
+ |2021-08-19 00:01:00|0|0|
294
+
295
+
296
+
297
+ ```python
298
+
299
+ dt_tomorrow = dt_now + datetime.timedelta(days=1)
300
+
301
+ dt_end = datetime.datetime(dt_tomorrow.year, dt_tomorrow.month, dt_tomorrow.day)
302
+
303
+ df_end = pd.DataFrame([[0, 0]], index=[dt_end])
304
+
305
+ ```
306
+
307
+
308
+
309
+ その日の翌日の 0 時 0 分のデータを作成します。値は 0 で埋めます。df_endの内容は以下です。
310
+
311
+
312
+
313
+ ||0|1|
314
+
315
+ |:--|:--:|--:|
316
+
317
+ |2021-08-20 00:00:00|0|0|
318
+
319
+
320
+
321
+ ```python
322
+
323
+ data = df_start.append([data, df_end])
324
+
325
+ data = data.asfreq('min', fill_value=0)
326
+
327
+ ```
328
+
329
+
330
+
331
+ その日の 0 時 1 分のデータと、観測済みのデータと、翌日の 0 時 0 分のデータを結合します。
332
+
333
+
334
+
335
+ ||0|1|
336
+
337
+ |:--|:--:|--:|
338
+
339
+ |2021-08-19 00:01:00|0|0|
340
+
341
+ |2021-08-19 07:58:00|1|0|
342
+
343
+ |2021-08-19 07:59:00|1|0|
344
+
345
+ |2021-08-19 08:00:00|1|0|
346
+
347
+ |2021-08-19 08:01:00|1|0|
348
+
349
+ |2021-08-19 08:02:00|1|0|
350
+
351
+ |...|||
352
+
353
+ |2021-08-19 10:18:00|1|0|
354
+
355
+ |2021-08-19 10:19:00|1|0|
356
+
357
+ |2021-08-19 10:20:00|1|0|
358
+
359
+ |2021-08-19 10:21:00|1|0|
360
+
361
+ |2021-08-19 10:22:00|1|0|
362
+
363
+ |2021-08-20 00:00:00|0|0|
364
+
365
+
366
+
367
+ `data.asfreq('min', fill_value=0)`で再び、欠落しているインデックスを補完し、値を 0 で埋めます。結果として次のようなデータが完成します。
368
+
369
+
370
+
371
+ ||0|1|
372
+
373
+ |:--|:--:|--:|
374
+
375
+ |2021-08-19 00:01:00|0|0|
376
+
377
+ |2021-08-19 00:02:00|0|0|
378
+
379
+ |2021-08-19 00:03:00|0|0|
380
+
381
+ |2021-08-19 00:04:00|0|0|
382
+
383
+ |2021-08-19 00:05:00|0|0|
384
+
385
+ |...|||
386
+
387
+ |2021-08-19 07:58:00|1|0|
388
+
389
+ |2021-08-19 07:59:00|1|0|
390
+
391
+ |2021-08-19 08:00:00|1|0|
392
+
393
+ |2021-08-19 08:01:00|1|0|
394
+
395
+ |2021-08-19 08:02:00|1|0|
396
+
397
+ |...|||
398
+
399
+ |2021-08-19 23:56:00|0|0|
400
+
401
+ |2021-08-19 23:57:00|0|0|
402
+
403
+ |2021-08-19 23:58:00|0|0|
404
+
405
+ |2021-08-19 23:59:00|0|0|
406
+
407
+ |2021-08-20 00:00:00|0|0|
408
+
409
+
410
+
411
+ このデータをプロットします。
412
+
413
+
414
+
415
+ プロットのコードについては説明は省略させていただきますが、1箇所だけ補足しますと、
416
+
417
+
418
+
419
+ ```pyton
420
+
421
+ ax.bar(data.index, data[0], width=0.0007)
422
+
423
+ ```
424
+
425
+
426
+
427
+ 日付型のデータをX軸にすると、`width=1.0`は 24 時間の幅になります。
428
+
429
+ ここではひとつのデータは1分の幅になって欲しいので、
430
+
431
+
432
+
433
+ 1 ÷ (24 × 60) = 0.00069444
434
+
435
+
436
+
437
+ で 0.0007 がほぼ1分の幅となります。
438
+
439
+
440
+
441
+ ---
442
+
443
+
444
+
445
+ プログラム中にまったく同じコード(プロットのためのコード)が2つ出てくるので、関数にくくり出して一つだけにするとよいと思います。
446
+
447
+ また、描画のたびにFigureとAxesを生成するのではなく、最初に一つだけ作って、それを最後まで使うとよいと思います。以下のような感じです。
448
+
449
+
450
+
451
+ ```python
452
+
453
+ def plot_operation(fig, ax):
454
+
455
+ data = pd.read_csv(StringIO(operation_data), sep='\s+', header=None, names=[0,1], index_col=0, parse_dates=True)
456
+
457
+
458
+
459
+ (中略)
460
+
461
+
462
+
463
+ #fig = plt.figure(figsize=(12.8, 4.8)) # <- 削除
464
+
465
+ #ax = fig.add_subplot() # <- 削除
466
+
467
+ ax.cla() # <- 追加
468
+
469
+
470
+
471
+ (中略)
472
+
473
+
474
+
475
+ plt.tight_layout()
476
+
477
+ plt.draw()
478
+
479
+ plt.pause(1)
480
+
481
+
482
+
483
+ fig = plt.figure(figsize=(12.8, 4.8))
484
+
485
+ ax = fig.add_subplot()
486
+
487
+ while True:
488
+
489
+ plot_operation(fig, ax)
490
+
491
+ sleep(1)
492
+
493
+ ```
494
+
495
+
496
+
497
+ ---
498
+
499
+
500
+
501
+ 質問文にプログラムの全体が掲載されていないので正確には分からないのですが、プログラムのループ構造の大枠は以下のようになっているのではないでしょうか?
502
+
503
+
504
+
505
+ ```python
506
+
507
+ while true:
508
+
509
+ if inputVal0>2000:
510
+
511
+ # プロットのプログラム
512
+
513
+ else:
514
+
515
+ if inputVal0>2000:
516
+
517
+ # プロットのプログラム
518
+
519
+ else:
520
+
521
+ pass
522
+
523
+ sleep(1)
524
+
525
+ ```
526
+
527
+
528
+
529
+ この構造だと、プロットのプログラム中でも plt.pause(1) を行なっていますので、稼働中は sleep(1) と合わせて2秒おきにループが回ることになりますがそれで大丈夫ですか?
530
+
531
+ もし1秒おきにループが回った方がいいなら、
532
+
533
+
534
+
535
+ ```python
536
+
537
+ while true:
538
+
539
+ if inputVal0>2000:
540
+
541
+ # プロットのプログラム
542
+
543
+ else:
544
+
545
+ if inputVal0>2000:
546
+
547
+ # プロットのプログラム
548
+
549
+ else:
550
+
551
+ sleep(1)
552
+
553
+ ```
554
+
555
+
556
+
557
+ とするとよいと思います。
558
+
559
+ 描画のためにかかる時間が加算されるので、これでも1秒おきにならないと思うので、その時は`plt.pause(1)`の数字を、1 -> 0.9 -> 0.8 -> 0.7 -> 0.6... とどんどん小さくして試してみるといいです。私の環境では、0.1 でもちゃんと描画されました。