Python: 如何使用graphviz套件繪製流程圖?如何調整node的xlabel位置,讓其位於node的正下方或正上方?

加入好友
加入社群
Python: 如何使用graphviz套件繪製流程圖?如何調整node的xlabel位置,讓其位於node的正下方或正上方? - 儲蓄保險王

本文參考:
Graphviz graph positioning xlabels
code(使用xlabel,位置自動於node的左下角):

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 14 19:46:44 2024

@author: SavingKing
"""


from graphviz import Digraph

# 创建一个有向图
dot = Digraph()

# 设置图形的属性
dot.attr('graph', forcelabels='true', rankdir='LR', ranksep='1', nodesep='0.5')

# 设置所有节点的默认样式
dot.attr('node', shape='box')

# 添加具有特定属性的节点
dot.node('start', xlabel='start', xlp='0,0', shape='doublecircle', label=' ')
dot.node('fault', xlabel='fault', shape='doublecircle', label=' ')
dot.node('complete', xlabel='complete', shape='doublecircle', label=' ')

# 添加边
dot.edge('requested', 'fault')
dot.edge('requested', 'progress')
dot.edge('start', 'requested')
dot.edge('progress', 'fault')
dot.edge('progress', 'progress')
dot.edge('progress', 'complete')

# 保存和/或显示图形
dot.render('my_graph', format='png', view=True)

生成的流程圖:

Python: 如何使用graphviz套件繪製流程圖?如何調整node的xlabel位置,讓其位於node的正下方或正上方? - 儲蓄保險王

node中使用xlabel參數,
xlabel位置自動放在node的左下方
如何調整到node下方?
使用無邊框的子圖(peripheries='0')騰出空間
固定node大小( fixedsize='true' ),
使用多個\n
將node的label擠出去node之外
視覺效果就像node之正下方
有一個xlabel
未使用子圖的話
最邊緣,被擠出去node外面的label
會被消失
code:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 14 19:57:21 2024

@author: SavingKing
"""


from graphviz import Digraph

# 创建一个有向图
dot = Digraph()
dot.attr(rankdir='LR')
dot.attr('graph', ranksep='1', nodesep='0.5')

# # 添加一個子圖用於模擬空間以在節點下方放置標簽,
#沒使用子圖的話,最下方超出node的label會被截斷
with dot.subgraph(name='cluster_space') as c:
    c.attr(peripheries='0')  # 設置子圖的邊界為0使其不可見
    c.attr('node', shape='box')  # 設置子圖中所有節點的形狀為盒型

    # 添加節點通過在標簽中添加換行符來在節點下方留出空間
    c.node('start', label='\n\n\n\nstart', shape='doublecircle', fixedsize='true')
    c.node('requested')
    c.node('progress')
    c.node('complete', label='\n\n\n\ncomplete', shape='doublecircle', fixedsize='true')
    c.node('fault', label='\n\n\n\nfault', shape='doublecircle', fixedsize='true')

    # 添加邊
    c.edge('requested', 'fault')
    c.edge('requested', 'progress')
    c.edge('start', 'requested')
    c.edge('progress', 'fault')
    c.edge('progress', 'progress')
    c.edge('progress', 'complete')

# 保存並查看圖形
dot.render('style_graph', format='png', view=True)

輸出的圖檔:

Python: 如何使用graphviz套件繪製流程圖?如何調整node的xlabel位置,讓其位於node的正下方或正上方? - 儲蓄保險王

會觸發一些warning:
Warning: node ‘start’, graph ‘%3’ size too small for label
Warning: node ‘complete’, graph ‘%3’ size too small for label
Warning: node ‘fault’, graph ‘%3’ size too small for label
只要視覺效果正常,
無須理會,就是故意固定node大小
使用\n , 把label擠出去node

將start移到多個\n之前:
c.node('start', label='start\n\n\n\n\n', shape='doublecircle', fixedsize='true')
則可以做出label在node上方的效果:

Python: 如何使用graphviz套件繪製流程圖?如何調整node的xlabel位置,讓其位於node的正下方或正上方? - 儲蓄保險王

無顏色的子圖(color=’transparent’)
當你設置子圖的color屬性為transparent,你是在指定這個子圖的邊框顏色為透明。這意味著子圖的邊框仍然存在,但是因為顏色透明,所以在視覺上看不到它。
這種設置通常用於你想保留子圖的結構和布局特性,但不希望其邊框幹擾視覺效果的場合。
無邊框的子圖(peripheries=’0’)
設置peripheries=’0’是在告訴Graphviz,這個子圖不應該有任何外圍邊框。這直接移除了子圖的所有邊框,與邊框的顏色無關。
這種方式常用於完全消除邊框的影響,使得子圖的內容看起來就像直接放置在主圖中一樣,沒有任何分割或邊界的跡象。
實際效果區別
無顏色的子圖 依然保持邊框的物理空間和結構,只是在視覺上看不到邊框。這對圖的布局有影響,因為布局算法仍然考慮到這些邊框的存在。
無邊框的子圖 完全沒有邊框,不僅在視覺上看不到,圖的布局算法也不會考慮邊框的占位。
使用場景
如果你的目的是讓子圖與周圍元素融為一體,而不顯示任何分界線,應該使用peripheries=’0’。
如果你想讓子圖保持一定的結構,但不希望邊框影響視覺效果,可以使用color=’transparent’。
這樣的選擇依賴於你對圖形的具體需求和預期的視覺表現。在許多情況下,這兩個屬性可以結合使用,以達到既無視覺邊框又考慮到布局的效果。

推薦hahow線上學習python: https://igrape.net/30afN

 

加入好友
加入社群
Python: 如何使用graphviz套件繪製流程圖?如何調整node的xlabel位置,讓其位於node的正下方或正上方? - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *