for/inループ、シーケンス、インデックス、rangeではなくenumerateを使う、2つのリスト、zip関数、Matplotlibによる描画、日本語、フォント
私も(独立に)同じ問題をやってみました https://t.co/cAQgfGg2Co https://t.co/ibgJnf7LYT
— Haruhiko Okumura (@h_okumura) February 21, 2021
奥村晴彦さん(Haruhiko Okumura @h_okumura)の情報I試作問題のシミュレーションのコードのをちょっと修正して、Pythonistaっぽい(?)コードにしてみた。 追記有。
コード
#!/usr/bin/env python3
import matplotlib # 日本語のフォントを表示するために追加
import matplotlib.pyplot as plt
import numpy as np
# 日本語のフォントを表示するための設定
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['font.sans-serif'] = [
'Hiragino Maru Gothic Pro',
'Yu Gothic',
'Meirio',
'Takao',
'IPAexGothic',
'IPAPGothic',
'VL PGothic',
'Noto Sans CJK JP',
]
# rngは使わないからアンダースコアに変更
# rng = np.random.default_rng()
_ = np.random.default_rng()
# 使わないから代入自体を省いて
# np.random.default_rng()
# でもいいかも
t = np.arange(0, 1810, 10)
kokudou = np.random.randint(8, 13, size=181)
kendou = np.random.randint(3, 5, size=181)
plt.bar(t - 2, kokudou, width=3)
plt.bar(t + 2, kendou, width=3)
plt.xlim(-10, 255) # 見たい範囲(なければ全範囲)
plt.legend(['国道', '県道'])
# なんとなく読みやすいかと思って一行ごとに変更
# s_koku = s_ken = 0
s_koku = 0
s_ken = 0
kokudou_juutai = [s_koku]
kendou_juutai = [s_ken]
# 主に修正したくなった箇所
# for i in range(180):
# s_koku += kokudou[i]
# s_ken += kendou[i]
for i, (koku, ken) in enumerate(zip(kokudou[:-1], kendou)):
s_koku += koku
s_ken += ken
if i % 9 < 6:
s_koku = max(s_koku - 20, 0)
else:
s_ken = max(s_ken - 10, 0)
kokudou_juutai.append(s_koku)
kendou_juutai.append(s_ken)
plt.plot(t, kokudou_juutai, 'o-')
plt.plot(t, kendou_juutai, 's-')
plt.legend(['国道', '県道'])
# せっかくなのでSVGで保存
plt.savefig('sample.svg')
SVG
Pythonistaっぽいと思ったのは、Effective Pythonの1章(Pythonic思考)の項目7のrangeではなくenumerateを使うに影響されたから。Effective PythonのコードがPythonistaっぽいコードじゃなかったら、上記の修正はPythonistaっぽく修正できてないかも。
追記、修正
あと,np.random.randint() は書き間違いで rng.integers() にすべきところでした(修正済み)
— Haruhiko Okumura (@h_okumura) February 21, 2021
コード
#!/usr/bin/env python3
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['font.sans-serif'] = [
'Hiragino Maru Gothic Pro',
'Yu Gothic',
'Meirio',
'Takao',
'IPAexGothic',
'IPAPGothic',
'VL PGothic',
'Noto Sans CJK JP',
]
rng = np.random.default_rng()
t = np.arange(0, 1810, 10)
kokudou = rng.integers(8, 13, size=181)
kendou = rng.integers(3, 5, size=181)
plt.bar(t - 2, kokudou, width=3)
plt.bar(t + 2, kendou, width=3)
plt.xlim(-10, 255) # 見たい範囲(なければ全範囲)
plt.legend(['国道', '県道'])
s_koku = 0
s_ken = 0
kokudou_juutai = [s_koku]
kendou_juutai = [s_ken]
for i, (koku, ken) in enumerate(zip(kokudou[:-1], kendou)):
s_koku += koku
s_ken += ken
if i % 9 < 6:
s_koku = max(s_koku - 20, 0)
else:
s_ken = max(s_ken - 10, 0)
kokudou_juutai.append(s_koku)
kendou_juutai.append(s_ken)
plt.plot(t, kokudou_juutai, 'o-')
plt.plot(t, kendou_juutai, 's-')
plt.legend(['国道', '県道'])
plt.savefig('sample.svg')
SVG