背景
通过Graphviz来表达timeline比较形象,如果一年365天都按照竖向太长,按照每个月比较形象,如何做到?
python生成Graphviz的年表
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
msi=int(sys.argv[1])
dsi=int(sys.argv[2])
mei=int(sys.argv[3])
dei=int(sys.argv[4])
year="23"
mdays=[31,28,31, 30,31,30, 31,31,30, 31,30,31]
def gen_mon(msi,mei,dsi,dei):
print("\nnode [fontsize=20, shape=box, style=filled fillcolor=lightgreen];")
for m in range(msi, mei+1):
if m == msi:
ds=int(dsi)
else:
ds=1
if m==mei:
de=dei
if de > mdays[m-1]:
de = mdays[m-1]
else:
de=mdays[m-1]
print("\n{:>02}.{:>02}".format(year,m))
def gen_day(msi,mei,dsi,dei):
print("\nnode [fontsize=20, shape=box, style=filled fillcolor=lightgray];")
for m in range(msi, mei+1):
if m == msi:
ds=int(dsi)
else:
ds=1
if m==mei:
de=dei
if de > mdays[m-1]:
de = mdays[m-1]
else:
de=mdays[m-1]
print("\n{:>02}.{:>02}->".format(year,m))
for i in range(ds, de+1):
if i!=de:
print("{:>02}{:>02}->".format(m,i))
else:
print("{:>02}{:>02}".format(m,i))
def gen_rank_same(msi,mei,dsi,dei):
print("# rank")
print("\nnode [fontsize=20, shape=box, style=filled fillcolor=cyan];")
for m in range(msi, mei+1):
if m == msi:
ds=int(dsi)
else:
ds=1
if m==mei:
de=dei
if de > mdays[m-1]:
de = mdays[m-1]
else:
de=mdays[m-1]
print("\n#{:>02}.{:>02}".format(year,m))
septimelist=[3,6,9,12]
seasonlist=[3,6,9,12]
for i in range(ds, de+1):
if (m in seasonlist) and (i == 30):
print("{ rank=same; %02d%02d -> season_%02d%02d}" %(m,i, m,i))
elif (m in septimelist) and (i==22):
print("{ rank=same; %02d%02d -> jieqi_zhifen%02d%02d}" %(m,i, m,i))
else:
print("{ rank=same; %02d%02d }" %(m,i))
def gen_head():
print("digraph timeline {")
print('size = "7,8";')
def gen_tail():
print("}")
def gen_total():
gen_head()
gen_mon(msi, mei, dsi, dei)
gen_day(msi, mei, dsi, dei)
gen_rank_same(msi, mei, dsi, dei)
gen_tail()
def main():
gen_total()
main()
执行命令:
python m.py 1 1 12 31 > 1.gv
参数说明:
m.py [startm] [startmday] [endm] [endmday]
效果
综述
使用Graphviz的->默认竖向结构以及->连成串形成多级。
然后另起一行又从第一行开始串,组合成了特殊效果。
暂且定义为yearline模式,使用YL模式能够清晰的表达以及记录。
还能用它表达一些事情的关键节点,一目了然。