"我还想更简单的画点图"

2019-04-07 22:07:59 +08:00
 thautwarm

前段时间因为需要画很多很多的点图, 觉得就算用上 graphviz 还是要写很多的重复代码.

然后我灵机一动, 发现只需要很少的代码就能简化 graphviz 的使用.

于是就有了这个项目: https://github.com/thautwarm/graphviz-artist

之前每次画图前都要查文档, 现在就不用了, 如果你有一个支持 mypy 的 Python 自动补全工具(pycharm 等)的话.

大概的感觉就是

import graphviz_artist as ga
# 创建图
g = ga.Graph(directed=True)

然后点和线的属性都用 attr 子模块来索引,这样你只要输入attr.就能选自己想要的属性.

g.new就是创建点

n1 = g.new(attr.Label('hey'), attr.Shape.diamond)
n2 = g.new(attr.Label('hey'), attr.Shape.hexagon)
n3 = g.new(attr.Label('you'), attr.Shape.star)

然后可以用>, <, ==来创建点到点之间的线.

directed = attr.Directed() # 属性, 表示有方向

# `attr.Label` 表示一个在点或者线上显示的文本
edge_label = attr.Label("passed_here")


# `attr.Penwidth` 确定线的粗细
edge_size = attr.Penwidth(2.)

# `a < b[b_to_c_attrs...] > c`, 其实就是 a <- b, 然后 b -> c, 只是 b->c 的线上有 b_to_c_attrs 这些属性 
_ = n3[directed, edge_label, edge_size] > n1[directed] == n2 > n3

然后显示图

g.view()

个人感觉是简单的代码, 但是用起来有点舒服....

4695 次点击
所在节点    Python
29 条回复
thautwarm
2019-04-08 01:32:07 +08:00
@aleung 啊,我说了你不要不开心啊。
我觉得你这个用起来,要写的和 python 的 graphviz 库差不多,还是有点麻烦的。。11L 赖哥在帖子里有链接。
我看到你还需要 jdk,这里 js 应该也是有 csv parser 的吧,总觉得这样依赖也有点多😂。
我这么说,你千万别不开心啊!
thautwarm
2019-04-08 01:34:41 +08:00
@azh7138m 抽象和目的不一样。但它是一个可行的后端。。谢谢你告知这个,不用下载 graphviz 也能画简洁风格点图的东西!
baojiweicn2
2019-04-08 02:55:54 +08:00
我居然想到了多年以前拿到了一坨屎的代码,实在看不出他们的层级关系了,我搞了个 xmind 的 api,画了张类关系图[手动狗头]。
楼主的这种图,感觉 matplotlib 好像也能画? 不明觉厉。先 star。
logozy
2019-04-08 07:03:25 +08:00
Star 一个
thautwarm
2019-04-08 09:22:30 +08:00
@logozy 谢啦
thautwarm
2019-04-08 09:26:06 +08:00
@baojiweicn2 matplotlib 应该是能作为一个后端的,见 networkx 这个库。但是问题在于自动处理点和线位置这个问题上,graphviz 非常好。而 networkx,点多了会挤成一片。。
谢谢 star(比心
uyhyygyug1234
2019-04-08 09:52:47 +08:00
@baojiweicn2 同学这个有没有博客介绍一下啊
baojiwei
2019-04-08 10:18:40 +08:00
@uyhyygyug1234 具体的代码已经找不到了,那时候我还是个小菜鸟的时候,还在写 odoo,这个框架是 orm 学习了 OO 的里面很多特性,很魔,orm 里面有__inherits 的属性,可以把 table 直接 inherit 下来(包括数据以外键的形式 inherits 下来,唉),除此之外,还被各位大佬们写了很魔的写了企业级总线 [居然没有用任何 mq 框架,自己写的] 。(其实就是一坨复杂的一塌糊涂的 [我觉得设计的思想很好的,但是码力有点飘的] ,看着很香的 shi~~)。带我的大佬看我连这个都看不懂 [唉,手动叹气] ,就让我画结构图了。
结果我画了三天也没画出来。主要是,这些 table 除了可以继承之外,居然还可以多重继承,继承还有依赖,还有原生 many2many。后来耍了个巧,找了个 xmind 的工具画出来了。
思路基本是:导入 orm 环境,找每个 class 的父类和子类,继承和多重继承关系,外键和约束关系等等。然后调 xmind 的 api 生成图,把关系画出来。然后写 pgsql 的钩子,找到对应的表。
然后写了半年 odoo,感觉每次洗澡吹头的时间越来越短了。就走了。( MD,他们现在已经 D 轮了)
走了之后,据说这个脚本用的还不错。主要是每次上线的时候,因为框架自己加的 table 实在太多了,测试找数据都要崩溃了。所以每次都要先跑一次脚本,新生产一个 xmind 和以前的比较一下,才知道这帮幺蛾子开发大佬们又加了哪些表。

我找了下当初用的轮子应该是这个:[xmind-sdk-python]( https://github.com/xmindltd/xmind-sdk-python)
不过我发现有这个更好的有意思的项目(已送 star):[xmind2testcase]( https://github.com/zhuifengshen/xmind2testcase)
大佬可以了解下,感觉用 sqlalchemy 也是可以这么玩的。celery tasks 估计也可以这么玩,他有一个中间件会检查各个 tasks 的依赖,抽出来应该就可以画图了
python 代码如果 OO 写的好的话,应该也是可以这样玩的。如果 OO 写的不好,估计出来的结果不一定会好。
uyhyygyug1234
2019-04-09 10:51:01 +08:00
@baojiwei 赞!!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/552774

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX