程序员如何画图?

经常写完文章, 收到的第一个问题是: 你的图是用啥画的; 其实自己也经常问别人. 最近强化了一下这方面的知识, 总结一下.

特指写文章或者做架构设计中用到的图.

画图的场景

个人将画图的场景分为两种: PPT/文章中使用和系统中使用

  • PPT/文章中使用, 特指在 PPT 演示或者技术文章/文档中使用, 这种画图场景有几个特点
    • 美观. 审美能力不行也不能作为马虎了事的借口,用心与不用心总是有差别的
    • 一次性. 基本上一个场景仅需要画一次
    • 手动. 可以使用任何工具, 手动各种摆放, 着色.
  • 系统中使用, 特指在自己的系统中需要通过程序, 将一些流程通过可视化的方式展现. 这种场景有如下特点:
    • 程序画图, 因此选择的是画图的 library 而不是 GUI 软件(感觉是废话)
    • 调色/摆位等需求, 必须要 library 支持, 但对于我这种对前端 GUI 相关开发能力极度弱的人来说, library 不支持也只有换一个, 找不到替代也只有忍了; 而使用画图软件, 大不了自己手动摆放, 虽然耗时费力, 但至少是可以完成的.

可能有人觉得系统中画图需求不多, 个人感觉还是有必要的. 经常遇到费劲开发了一个系统, 遇到各路用户问问题. 如果有办法在系统中将执行流程直接生成流程图, 你好我好大家好.

PPT/文章画图

GUI 画图工具有很多可选, 个人比较推荐的是 OmniGraffle, 在线工具推荐 lucidchart. 当然, 我也见过用 KeyNote 画出漂亮的系统图的, 工具不重要, 关键看人(说多了都是泪)

程序画图

重点说一下程序画图. 最近反省了一下, 画图最多的就是那几个:

  • 块图. 经常用来表示系统间关系的.


    块图
  • 序列图. 用来表示程序间调用关系


    序列图
  • 网络图. 用于网络相关的领域.


    网络图

没了. 真的没了. 会这几个就可以行走江湖了.
然后, 推荐两个 library: blockdiaggraphviz.

blockdiag

blockdiag 是一个神奇的 python libary. 可以通过使用类似 graphviz 的语法, 画出 块图, 序列图, 网络图, 活动图. 还提供了一个交互式的 shell, 用于调试上述几种图. 例如, shell 中输入:

blockdiag {
 A -> B -> C;
 B -> D;
}

立即的到如下图:


点击右上角切换成序列图, 输入如下内容:

seqdiag {
  // simple notation
  browser  -> webserver [label = "GET /index.html"];
  browser <-- webserver;

  browser  -> webserver [label = "POST /blog/comment"];
              webserver  -> database [label = "INSERT comment"];
              webserver <-- database;
  browser <-- webserver;
}

有可以轻松得到如下序列图:


但是说好的 library 呢? 以 seqdiag 为例,

安装

$ pip install seqdiag

命令行使用

$ seqdiag -Tsvg simple.diag

程序使用

import tempfile
from seqdiag import parser, builder, drawer
import os


def generate_svg_sequence_diagram(text):
    """

    :param text:
    :return:
    """
    tree = parser.parse_string(text)
    _, filename = tempfile.mkstemp(suffix='.svg')
    diagram = builder.ScreenNodeBuilder.build(tree)
    draw = drawer.DiagramDraw("SVG", diagram, filename=filename)
    draw.draw()
    draw.save()
    with open(filename) as f:
        svg_content = f.read()
    os.remove(filename)
    return svg_content

Graphviz

Graphviz 可谓是一代画图神器, 通过官网的示例图就知道有多强大. blockdiag 也是参考 Graphviz 的实现. 通过类似的语法描述, 生成所需的图形. 对于颜色的选择, 可以参考文档中 Colors 一节, 非常全面.

官网示例图

程序方面, 同名的 graphviz library 可以使用 pip install graphviz 安装, 非常方便. 示例python 程序如下:

from graphviz import Digraph
dot = Digraph(comment='demo dot graph', format='svg')
dot.node('A', 'King Arthur')
dot.node('B', 'Sir Bedevere the Wise')
dot.node('L', 'Sir Lancelot the Brave')

dot.edges(['AB', 'AL'])
dot.edge('B', 'L', constraint='false')

总结

既然有了 library 可以画图, 强烈建议在自己的系统中将一些复杂的流程化的事情通过根据当前系统状态画出图的方式展现给用户, 可以避免很多疑惑.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容