项目背景与目标
中秋节不仅是传统节日,也是天文观测的绝佳时机。利用 Python 进行月相计算与可视化,既能验证数学模型,又能通过 Web 技术呈现动态效果。本项目旨在构建一个包含精确天文算法、Matplotlib 绘图及前端交互的完整系统。
核心特性包括基于朔望月周期的精确计算、Web 界面自动生成、星空流星特效以及多维度图表展示。
技术架构与实现思路
依赖与环境
主要依赖 numpy 处理数值计算,matplotlib 负责图形绘制,标准库 datetime 和 base64 辅助日期与图片编码。
# pip install numpy matplotlib
项目结构
moon-phase-visualizer/
├── moon_calculator.py # 核心计算引擎
├── generate_html.py # HTML 生成器
└── moon_phase_2025_mid_autumn.html # 输出文件
核心算法逻辑
月相变化周期约为 29.53 天。我们选定 2025 年 9 月 25 日作为参考新月点,通过计算目标日期与参考点的时间差,结合模运算映射到 0-1 的相位值。前半周期代表新月到满月,后半周期代表满月回到新月。
计算引擎 (moon_calculator.py)
这里需要特别注意时间精度的处理,使用 total_seconds() 比直接减天数更准确。同时,针对 Matplotlib 的中文字体显示问题,做了多字体回退策略(微软雅黑 -> 黑体 -> 其他)。
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import math
import base64
import io
import warnings
from matplotlib import patches
warnings.filterwarnings('ignore')
plt.switch_backend('Agg')
# 优化中文字体设置
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
class MoonPhaseCalculator:
():
.lunar_cycle =
.reference_new_moon = datetime(, , )
():
days_since_new_moon = (date - .reference_new_moon).total_seconds() / ( * )
cycle_position = (days_since_new_moon % .lunar_cycle) / .lunar_cycle
cycle_position <= :
phase = cycle_position *
:
phase = - (cycle_position * )
phase
():
mid_autumn_2025 = datetime(, , )
((date - mid_autumn_2025).days) ==


