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

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()

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

4843 次点击
所在节点    Python
29 条回复
scriptB0y
2019-04-07 23:24:59 +08:00
Cool, 已赞。红姐要不要试试我集成 jupyter 的一个 dot-kernel ?直接写 dot 语言,比写 Python 还省事一些,还能实时渲染出来。https://github.com/laixintao/jupyter-dot-kernel ☺️
Sparetire
2019-04-07 23:43:29 +08:00
是红大大!
thautwarm
2019-04-08 00:03:10 +08:00
@scriptB0y dot-kernel 省事啊。但是你可能不好搞自动补全。。
thautwarm
2019-04-08 00:03:44 +08:00
@Sparetire 啊,您好,我是一个可怜的失足少女
thautwarm
2019-04-08 00:06:21 +08:00
@scriptB0y 嘛,居然是赖兄(逃
scriptB0y
2019-04-08 00:09:53 +08:00
@thautwarm 是啊,自动补全会很难搞,自动缩进我都还没搞定呢 😂 不过 dot 蛮简单的,我用的时候一般都拷贝拷贝 🤪
zhuangzhuang1988
2019-04-08 00:11:11 +08:00
都不爱 F#了。
thautwarm
2019-04-08 00:14:31 +08:00
@scriptB0y 你这个能不能像 pandas 表格显示那样,把 dot 集成到 python 里啊?我还不会写 notebook extension,有空看一下你的代码。其实我还想着支持 d3 之类的后端,这样以后画点图都可以用 py。
zwh2698
2019-04-08 00:25:45 +08:00
@thautwarm 你是失足少女?我拯救呢,要不要让我拯救?
secondwtq
2019-04-08 00:35:04 +08:00
这 operator ... 没事跟 Haskell 学这些没用的歪门邪道
scriptB0y
2019-04-08 00:35:28 +08:00
@thautwarm 没太懂你的意思唉,Graphviz 本身就支持 jupyter 的: https://graphviz.readthedocs.io/en/stable/manual.html#jupyter-notebooks

我是觉得用 Python 写 dot 太啰嗦了,毕竟 dot 本身是描述图的一个最小的语言,集成到 Python 里面之后要兼顾 Python 的语法来描述图了。d3 如果有 Python 封装的话在 jupyter 里面应该也是可以直接使用的。
thautwarm
2019-04-08 00:48:28 +08:00
@scriptB0y 啊,sorry,我忘了它本身支持 jupyter nb 的事了。

那等于我们是针对相同问题的不同方案。graphviz 的那个 python 包 API 用起来很 self-repeating,所以我整的是这一个
EDSL,你就直接写 dot 了。

直接写 dot 对于会 dot 的人来说就没有学习曲线了,dot 本来也简单,所以挺好的。

我主要考虑的方面是智能提示,原文也说了嘛,就是忘记写法每次查文档很烦。

我之前还想用类似办法,搞一个用 python 生成 css 样式的库。但是一来自己没硬性需求,二来工作量大,就没坚持下去。
thautwarm
2019-04-08 00:52:39 +08:00
@secondwtq 咱在世界 FP 领域最权威的教授手下读研,Haskell 是信仰也是必修。你说 Haskell 没用,我听起来就像是你说我削尖脑袋肝这些年是白肝。。。不说了太失败了,让我哭会儿睡了。
linde
2019-04-08 00:55:49 +08:00
不明觉厉~~,上手了感觉比用工具画图还快!
secondwtq
2019-04-08 00:56:14 +08:00
@thautwarm 我应该加个狗头的
thautwarm
2019-04-08 00:57:20 +08:00
@secondwtq 啊,抱歉抱歉。v2 木有表情包看来不只是我一个人难受 www
thautwarm
2019-04-08 00:59:50 +08:00
@linde 有啥不足的就发 issue 呀!到时候加了 d3 才叫舒服。
看一个 d3 效果? https://github.com/lfkdsk/rbnfrbnf-pretty/
azh7138m
2019-04-08 01:14:27 +08:00
如果说简单的话,为啥不用
https://bramp.github.io/js-sequence-diagrams/
http://flowchart.js.org/
这种类型的东西?
linde
2019-04-08 01:15:58 +08:00
@thautwarm 这效果真 NB,只能膜拜,不敢提 issue。 哈哈哈哈~~ 给大佬送冰可乐。

aleung
2019-04-08 01:20:33 +08:00
哈哈,搭车推广一下我的工具:用 Excel 表格生成 digraph,也是嫌 dot 繁琐的一个解决方案。
https://github.com/aleung/depgraph

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

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

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

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

© 2021 V2EX