データを視覚化する(Python の matplotlib を使って)
---
(使ってみた例)
👇️「うるう年」の周期を視覚化してみたときの例:
(経緯)
「うるう年が来る周期」をグラフとか図で「可視化、図化」して直感的に理解(わか)るように表現してみたい と思った
/amatnikswriting/2024年3月6日 0時01分
(→ 実行結果のプロット)
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で割り切れる年は、必ず閏年」である。
# > 参考)https://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4#:~:text=%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%82%AA%E6%9A%A6%E3%81%A7%E3%81%AF%E3%80%81%E6%AC%A1%E3%81%AE%E8%A6%8F%E5%89%87%E3%81%AB%E5%BE%93%E3%81%A3%E3%81%A6400%E5%B9%B4%E9%96%93%E3%81%AB97%E5%9B%9E%E3%81%AE%E9%96%8F%E5%B9%B4%E3%82%92%E8%A8%AD%E3%81%91%E3%82%8B%E3%80%82
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.axis(1600, 3000, -0.5, 1.5)
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.axis(2020, 2150, -0.5, 1.5)
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.")
---
Python の matplotlib(マットプロットリブ)
Matplotlibは、様々な種類のグラフを描画する能力を持つ、
プログラミング言語Pythonおよびその科学計算用ライブラリNumPyのためのグラフ描画ライブラリである。
Matplotlibとは - わかりやすく解説 Weblio辞書
(Matplotlib リファレンス)
API Reference — Matplotlib 3.8.3 documentation
(Python リファレンス)
Python 言語リファレンス — Python 3.12.2 ドキュメント
---
#視覚化