用接口数据生成词云与关系图

2017-10-15  本文已影响319人  c4a1d989518e

Python是非常适合用来处理数据的,当我在写我的接口框架的适合,我看着那些测试用例的数据,忽然想换个玩法。

接口数据生成词云

词云看起来好看,也直观,会根据不同词汇出现的比重大小,来在图片中呈现不同的大小。我的数据来自于我自己用yaml编写的yaml文件,里面有许多接口数据的字段。

image.png

有一点值得注意的是,我把所有接口字段拼接为一个list,然后用WordCloud是不能解析成功的。WordCloud解析的是一个完整的字符串,如一篇文章中出现的某个词的出现的频率。

bb=""
    for i in Atest:
        bb=bb+str(i)+" "
    wordcloud=WordCloud().generate(bb)

用上面这种方法可以把list中的接口字段,拼接成个彼此用空格隔开的字符串
绘制生成的词云可以用

plt.imshow(wordcloud,interpolation='bilinear')
    plt.axis("off")
    plt.show()

这样可以直接绘制出图片,显示出来,而我想要保存下图片来

wordcloud.to_file(os.getcwd()+"/myfiles/static/img/word.jpg")

生成接口依赖关系图

生成关系图,是用的graphviz。Graphviz 是基于 DOT 语言的绘图工具,可以绘制有向图、无向图、关系图、目录图、流程图等图形。

image.png
至于graphviz的用法,直接看这篇教程Python 使用 Graphviz 绘制关系图
这里的技术点,也是分两部分,一个是找出所有节点,另一个是找出节点之间的传递数据。
#生成接口关系list表
def cmp_hh(file_chart):
    file_chart=file_chart
    AD=cmp_relation(file_chart)
    #print AD
    list_have=[]
    for i in AD:
        list_a=AD[i][0]
        for a in AD:
            if a!=i:
                list_b=AD[a][1]
                list_c=[k for k in list_a if k in list_b]
                if list_c!=[]:
                    #a to i
                    list_has=[]
                    list_has.append(a)
                    list_has.append(i)
                    list_has.append(list_c)
                    list_have.append(list_has)
    return list_have

我就把所有元素都便利了一遍,通过一个for循环,找出对应关系。其中AD的的元素是啥?

{“接口名称”:[['入参‘],['响应数据'],“接口名称”:[['入参‘],['响应数据']}

最后处理出来后的list_have的数据格式是啥?

[ [”接口名称“,”接口名称“,[”接口传递的数据“] ] ,  [ ”接口名称“,”接口名称“,[”接口传递的数据“] ] ]

这一部分是造数据,接下来就调用下面的生成图像的函数

#用graphviz生成关系表
import graphviz as gv
import functools
graph=functools.partial(gv.Graph,format='svg')
digraph=functools.partial(gv.Digraph,format='svg')
def add_nodes(graph, nodes):
    for n in nodes:
        if isinstance(n, tuple):
           graph.node(n[0], **n[1])
        else:
           graph.node(n)
    return graph

def add_edges(graph, edges):
    for e in edges:
        if isinstance(e[0], tuple):
            graph.edge(*e[0], **e[1])
        else:
            graph.edge(*e)
    return graph


def mkgraph(list_one,list_two):
    root_note=os.getcwd()
    add_edges(
        add_nodes(digraph(),list_one),list_two
        ).render(root_note+'/myfiles/static/img/g4')

这一部分,在graphviz的文档中有示例,改改就行,然后在想办法调用

#list_one为去重,将接口元素去重,list_two是用来表示接口传递关系
    list_one=[]
    for i in a:
        list_one.append(i[0])
        list_one.append(i[1])
    list_one=list(set(list_one))
    list_two=[]
    for b in a:
        bet=""
        for c in b[2]:
            bet=bet+"+"+c

        list_two.append(((b[0],b[1]),{'label':bet}))
    mkgraph(list_one,list_two)
    return render(request,'chart.html')

参考文章:
Python 使用 Graphviz 绘制关系图

上一篇 下一篇

猜你喜欢

热点阅读