データを視覚化する(Python の matplotlib を使って)
---
(使ってみた例)
👇️「うるう年」の周期を視覚化してみたときの例:
(経緯)
「うるう年が来る周期」をグラフとか図で「可視化、図化」して直感的に理解(わか)るように表現してみたい と思った
(→ 実行結果のプロット)
https://scrapbox.io/files/65eb8ef16f91790026a28c09.png
(コード)
code:is_leap_year.py
# !/usr/bin/env python
# -*- coding: utf-8 -*-
"""「うるう年」を判定するプログラム.
仕様:
* ある年が「うるう年か否か」を判定します。
* うるう年である場合、コンソールにメッセージを表示します(平年の場合は何もしない)。
* 「西暦年」と「うるう年の判定結果」のデータをプロットして、グラフを描画します。
* (これは、うるう年が周期的にやって来る間隔のデータを図化することで、結果を視覚的に理解しやすくする目的のためです)
"""
import matplotlib.pyplot as plt
import numpy as np
def is_leap_year(year_num):
"""「西暦年の数値」を引数として受け取り、「うるう年か否か」を判定した結果を返します."""
result = False
# (うるう年のルール)
# 1. 「西暦年が4で割り切れる年は原則として閏年」である。
# 2. ただし、「西暦年が100で割り切れる年は原則として平年」とする。
# 3. ただし、「西暦年が400で割り切れる年は、必ず閏年」である。
if year_num % 4 == 0:
result = True
if year_num % 100 == 0:
result = False
if year_num % 400 == 0:
result = True
return result
# データ生成
# 連番の数値を列挙して、西暦の各年が「うるう年」か否かを判定し、結果をディクショナリに格納
leapYearDict = dict() # 結果格納用のディクショナリ(key:西暦年, value:その年が閏年か否か)
for i in range(0, 3000, 1):
# 処理対象の西暦年がうるう年か否かを判定して、結果を格納
YEAR_RESULT = is_leap_year(i)
leapYearDict.setdefault(i, YEAR_RESULT)
if YEAR_RESULT is True:
print(str(i) + "年はうるう年です")
# データをプロット描画
# 「2行(縦に2つのプロット)」を「1列に」、「前面色はライトグレーで」、「各プロットのY軸は同一で」描画
fig, axs = plt.subplots(2, 1, facecolor="lightgrey", sharey=True)
# X軸にはディクショナリのKeyをプロット(西暦年の年数)
# Y軸にはディクショナリのValueをプロット(その西暦年が「うるう年」か否か)
x = leapYearDict.keys()
y = leapYearDict.values()
# 1つ目のプロット(広い範囲の年数を描画するプロット)
axs0.set_title('#1. plot of leap year') axs0.stairs(y, orientation='vertical') axs0.plot(x, y, '*', label='', color='blueviolet', alpha=1) axs0.xaxis.set_ticks(np.linspace(1600, 3000, num=20, dtype=int)) # 2つ目のプロット(短期間の範囲を描画)
axs1.set_title('#2. plot of leap year (X Range limited for #1)') axs1.stairs(y, orientation='vertical', baseline=0.5) axs1.plot(x, y, '*', label='', color='blueviolet', alpha=1) axs1.xaxis.set_ticks(np.linspace(2020, 2220, num=20, dtype=int)) # グラフのX軸Y軸の表示形式の定義など
plt.yticks(np.linspace(-1, 2, num=4, dtype=int),
labels='Normal year', 'Leap year', '')
plt.subplots_adjust(left=0.15, right=0.85, bottom=0.05, top=0.95)
plt.savefig('leapYearPlot.png', bbox_inches="tight", pad_inches=1)
# プロットを描画して表示
plt.show()
print("done.")
---
Matplotlibは、様々な種類のグラフを描画する能力を持つ、
プログラミング言語Pythonおよびその科学計算用ライブラリNumPyのためのグラフ描画ライブラリである。
(Matplotlib リファレンス)
(Python リファレンス)
---