api 文档:http://graphviz.readthedocs.io/en/stable/api.html#graph
最近在聚宽做每天收盘分析时,想做一个涨停传导路径,偶然了解到graphviz库,记录一下使用过程中的用法:
from graphviz import Digraph
dot = Digraph(comment='The Round Table')
#dot.attr('graph',rankdir='LR') #这个是关键,否则输出的是上下的
#添加圆点 A, A的标签是 King Arthur
dot.node('A', 'King Arthur')
#添加圆点 B, B的标签是 Sir Bedevere the Wise
dot.node('B', 'Sir Bedevere the Wise')
#添加圆点 L, L的标签是 Sir Lancelot the Brave
dot.node('L', 'Sir Lancelot the Brave')
dot.node('E', 'King Arthur')
#创建一堆边,即连接AB的边,连接AL的边。
dot.edges(['AB', 'BL','LE'])
输出如下图:
下面是我在聚宽中的代码:
from graphviz import Digraph
def plot_sparse_network(dot,data,key):
data = data.sort(columns = ['连板','时间'],axis = 0,ascending = [False,True])
lb_cnts = array(data.loc[:,'连板'])
lb_cnts_exdump = []
parent_node = None
for i in lb_cnts:
if i not in lb_cnts_exdump:
lb_cnts_exdump.append(i)
#从大到小排序,获得连板之王
lb_cnts_exdump.sort(reverse = True)
for i in range(len(lb_cnts_exdump)):
cnt = lb_cnts_exdump[i]
level_df = data[data['连板'] == cnt]
indexes = array(level_df.index)
for j in range(len(indexes)):
node_name = level_df.ix[j,'名称']
node_description = level_df.ix[j,'名称']
if j == 0:
node_description += str(cnt)
dot.node(node_name, node_description)
if parent_node:
dot.edge(parent_node,node_name,key)
if j == len(indexes)-1 :
#作为下一层的父节点
parent_node = level_df.ix[0,'名称']
dot = Digraph(comment='The Round Table')
dot.attr('graph',rankdir='LR')
最后的输出是
是不是还不错。
最关键的是
dot.attr('graph',rankdir='LR')
文档中:
attr
(kw=None, _attributes=None, **attrs)
Add a general or graph/node/edge attribute statement.
- kw – Attributes target (
None
or'graph'
,'node'
,'edge'
).- attrs – Attributes to be set (must be strings, may be empty).
第一个参数graph的话就是针对布局进行设置,node就是针对节点设置。
第二个就是朝向选择了
当初就是没加这句使得生存的图很扁!!