作為日臣埃可視化作品之一,今天分析一下自97年開始十厢,60年內(nèi)每次生日與立春(the Beginning of Spring)和雨水(the Rains)兩個節(jié)氣的相隔天數(shù)贯卦,看看哪一年會有重合的運氣。
立春甘桑,十二節(jié)令之首拍皮,舊稱正月節(jié);雨水跑杭,十二中氣立始铆帽。立春后,繼之雨水德谅,東風解凍锄贼、散而為雨,后鴻雁來女阀,草木萌動宅荤。而正月初十這天屑迂,常是在立春與雨水之間不定。
這與農(nóng)歷歷法相關(guān)冯键,農(nóng)歷紀年取月相朔望變化惹盼,參考太陽回歸年長度,設(shè)置閏月調(diào)整惫确,使之相適應(yīng)手报。因此農(nóng)歷和公歷不同,需要天文臺進行校準改化。立春常對應(yīng)公歷2月3掩蛤、4日,雨水常對應(yīng)公歷2與18陈肛、19日揍鸟,但正月初十與公歷時間對應(yīng)就比較混亂了。
1句旱、統(tǒng)計立春阳藻、雨水與正月初十對應(yīng)的公歷日期
Python
中有一些公歷與農(nóng)歷相轉(zhuǎn)換的工具,如zhdate
谈撒,sxtwl
腥泥。但我是用百度查表查出來的,以如下格式存儲成BirthdayRecord.csv
啃匿。對于日期間隔的計算蛔外,采用EXCEL
計算,使用Python
中的Pandas
計算也可以溯乒。
年份 | 歷年生日 | 歷年立春 | 歷年雨水 | 立春間隔 | 雨水間隔 | 節(jié)氣間隔 |
---|---|---|---|---|---|---|
1997 | 1997/2/16 | 1997/2/4 | 1997/2/18 | -12 | 2 | 14 |
1998 | 1998/2/6 | 1998/2/4 | 1998/2/19 | -2 | 13 | 15 |
2夹厌、Python繪圖展示
a、導(dǎo)入需要的包
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
# 一些matplotlib畫圖的設(shè)置
large = 16; med = 12; small = 10
params = {'axes.titlesize': large,
'legend.fontsize': med,
'figure.figsize': (10, 6),
'axes.labelsize': large,
'axes.titlesize': med,
'xtick.labelsize': med,
'ytick.labelsize': med,
'figure.titlesize': large}
plt.rcParams.update(params)
# 設(shè)置使用漫畫繪圖模式橙数,禁用可以返回普通模式
plt.xkcd()
b、處理數(shù)據(jù)
data = pd.read_csv("BirthdayRecord.csv", encoding="gb2312")
# 查看data的統(tǒng)計信息
data.info()
獲得輸出結(jié)果
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 60 entries, 0 to 59
Data columns (total 7 columns):
年份 60 non-null int64
歷年生日 60 non-null object
歷年立春 60 non-null object
歷年雨水 60 non-null object
立春間隔 60 non-null int64
雨水間隔 60 non-null int64
節(jié)氣間隔 60 non-null int64
dtypes: int64(4), object(3)
memory usage: 3.4+ KB
c帅戒、成圖
fig, ax = plt.subplots(figsize=(12,6), dpi=100)
# 畫出間隔
for i in range(len(data)):
# 設(shè)置顏色
color1 = plt.cm.rainbow(np.abs(data.loc[i, "立春間隔"])/60 +0.7)
color2 = plt.cm.rainbow(np.abs(data.loc[i, "雨水間隔"])/30-0.5)
# 畫點
ax.scatter(data.loc[i, "年份"], data.loc[i, "立春間隔"], color=color1, marker="o", s=np.abs(data.loc[i, "立春間隔"])+15, zorder=5, label="the Beginning of Spring" if i==2 else None)
ax.scatter(data.loc[i, "年份"], data.loc[i, "雨水間隔"], color=color2, marker="p", s=np.abs(data.loc[i, "雨水間隔"])+15, zorder=5, label="the Rains" if i==4 else None)
# 畫圖例
# 畫直線
ax.plot(data["年份"], data["立春間隔"], color="red", linestyle="-", linewidth=0.5, alpha=0.3, zorder=0)
ax.plot(data["年份"], data["雨水間隔"], color="blue", linestyle="-", linewidth=0.4, alpha=0.3, zorder=0)
# 畫直線
ax.hlines(0, 1996, 2056, color="gray", linestyle="--", linewidth=1, alpha=1, zorder=20)
ax.vlines(2020, -24, 23, color="gray", linestyle="--", linewidth=1, alpha=1, zorder=20)
# 畫星星
zeroData = data[data["立春間隔"]==0]
ax.scatter(zeroData["年份"], zeroData["立春間隔"], marker="v", color="red", alpha=0.5, zorder=40)
# 畫星星
zeroData = data[data["雨水間隔"]==0]
ax.scatter(zeroData["年份"], zeroData["雨水間隔"], marker="^", color="blue", alpha=0.6, zorder=40)
# 設(shè)置坐標軸范圍
ax.set_xlim(1996, 2057)
ax.set_ylim(-31, 26)
# 設(shè)置x軸間隔
plt.xticks([data.loc[x, "年份"] for x in range(0, len(data), 6)])
# 設(shè)置文字
ax.set_xlabel("Year")
ax.set_ylabel("Interval /d")
ax.set_title("the Interval Between Birthday and the Two Solar Terms Each Year", size=large)
# 設(shè)置坐表軸隱藏
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 設(shè)置圖例
ax.legend(loc="lower center", ncol=2)
# ax.grid(alpha=0.3, color="gray", zorder=10)
# 保存圖片
plt.savefig("生日間隔統(tǒng)計.jpg", dpi=300)
成品圖
生日間隔統(tǒng)計.jpg
3灯帮、討論
- 由于
UbuntuServer
沒有部分中文字體的版權(quán),所以用英語標注了一下逻住; - 2020年之后的節(jié)氣間隔是推測出的钟哥,由于農(nóng)歷本身需要天文臺掛測,所以只是做個參考瞎访;
- 立春與雨水的間隔變化很規(guī)律腻贰,但具體什么規(guī)律就沒有深究,有學(xué)歷法的同學(xué)可以私信一下扒秸;
- 紅色與藍色三角形代表重合的年份播演,然而并沒有幾次冀瓦。
- 最后轉(zhuǎn)載請注明出處!P纯尽翼闽!