Python から Graphviz を使う( pydot を日本語で出力)(10) からの引き続き、
An Introduction to GraphViz の Figure 4. A Month Calendar に挑戦してみる。このシリーズ長くなってきて、どこに何を書いたのか分からなくなってきたので、今後のことを考えて題名をまとまりごとに付けることにする。
とりあえず、多少汎用性のあるものを作ってから、カレンダーを入れたものを作り直す。
まず、頭の部分につながっている下の部分は、それぞれサブグラフとして作って、頭につなげる。そして、それができあがったら、カレンダーをリストとして使う。そして、色を付けるなどして完成させる。まずは、サブグラフを作って頭につなげるところまでやってみる。
要素のリストからサブグラフを作る
細かいところは考えずに大枠を考えて作ってみる。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
from pydot import Dot, Cluster, Node, Edge
import calendar
head_name = "200?年??月" # 頭の表示
# 列ごとのノードのダミー
node_list = [[u'日',u'月',u'火',u'水',u'木', u'金', u'土'],
['1', '2', '3', '4', '5', '6', '7'],
['8', '9', '10', '11', '12', '13', '14'],
['15', '16', '17', '18', '19', '20', '21'],
['23', '24', '25', '26', '27', '28', '29'],
['30', '31'],]
# グラフを用意する
g = Dot()
n = Node('node')
n.set_fontname('arialuni.ttf') # 日本語フォント指定
n.set_fontsize(9)
g.add_node(n)
# 列ごとにサブグラフを作る。
cluster = {}
for i, nodes in enumerate(node_list):
name = 'sub_%d' % i
cluster[i] = Cluster(graph_name=name)
edges = zip(nodes, nodes[1:])
g_nodes = [Edge(x[0], x[1]) for x in edges]
for n in g_nodes:
cluster[i].add_edge(n)
g.add_subgraph(cluster[i])
# リストの先頭をすべてヘッドにつなげる
top_node = [x[0] for x in node_list]
for n in top_node:
g.add_edge(Edge('head', n))
# 頭の属性を指定する
n = g.get_node('head')
n.set_label(head_name)
n.set_shape('Msquare')
g.write_png('calenda1.png')
次へ続く。
365日月の満ち欠けがわかるインテリアカレンダー♪月齢ムーンカレンダーPHASES OF THE MOON