計算機科学のブログ

for/inループ、シーケンス、インデックス、rangeではなくenumerateを使う、2つのリスト、zip関数、Matplotlibによる描画、日本語、フォント

奥村晴彦さん(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っぽく修正できてないかも。

追記、修正

コード

#!/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