3279842 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

傀儡師の館.Python

傀儡師の館.Python

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

Recent Posts

Calendar

Keyword Search

▼キーワード検索

Category

Archives

2024.06
2024.05
2024.04
2024.03
2024.02
2024.01
2023.12
2023.11
2023.10
2023.09

Freepage List

Profile

kugutsushi

kugutsushi

Free Space

設定されていません。
2007.11.17
XML
カテゴリ:Python
Python から Graphviz を使う( pydot を日本語で出力)(6) でサブグラフを描いてみたが、subgraph の中にサブグラフがあるときはうまく描けるだろうかと試してみる。Graphviz のサイトにある Undirected Graph Clusters のようなものを。グラフの中にサブグラフが3つ。そのうち1つは他のサブグラフの中にある。骨組みとしては次のようなものになる。

graph G {
subgraph clusterA {
//
subgraph cluster C {
//
}
}
subgraph clusterB {
//
}
clusterC -- clusterB
}

なので、基本としては Python から Graphviz を使う( pydot を日本語で出力)(6) でやったようにサブグラフ A, B を作って、さらにその中に C を作ればよいかなと。まずは、プリミティブにグラフを作って、サブグラフをつないでみる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pydot import *

g = Dot('graph', graph_type='graph')

# 日本語フォント指定用のノードを追加する。
n = Node('node')
n.set_fontname('arialuni.ttf')
n.set_fontsize(9)
g.add_node(n)

# サブグラフを生成する。
cluster_a = Cluster(graph_name='sub01')
cluster_b = Cluster(graph_name='sub02')
cluster_c = Cluster(graph_name='sub03')

# サブグラフにエッジを追加する。
cluster_a.add_edge(Edge('田中', '鈴木'))
cluster_c.add_edge(Edge('山田', '小川'))
cluster_b.add_edge(Edge('杉山', '今田'))

# グラフにノードとエッジを追加する。
g.add_node(Node('高橋'))
g.add_edge(Edge('杉山', '小川'))
g.add_edge(Edge('高橋', cluster_b.get_name()))
g.add_edge(Edge(cluster_c.get_name(), cluster_b.get_name()))

# グラフに cluster_A, Cluster_B を追加。
g.add_subgraph(cluster_a)
g.add_subgraph(cluster_b)

# cluster_A に cluster_C を追加。
cluster_a.add_subgraph(cluster_c)

g.write_png('subgraph3.png', prog='fdp')

最後の行の、書き出し用のプログラムの指定は fdp を使わないと、ノードとサブグラフ間のエッジや、サブグラフ同士のエッジを描くことができないようだ。とりあえず、こんな感じになる(クリックで拡大)。

subgraph3.png

また、サブグラフを端点とするエッジ を描くやり方もあるようだ。

サブグラフを端点とするエッジを描くには、グラフ全体の compound 属性が true になっていなければなりません。その上で、エッジに対して、ltail/lhead 属性を付けて、どのサブグラフを端点とするのかを示します。

とかするようだ。

この場合のグラフ書き出しは fdp でなく、dot でいけるようだ。ただし、サブグラフとサブグラフを端点としてつないでいるエッジも、見かけ上はサブグラフとサブグラフをつないでいるけれども、あくまでもエッジはノード間で張るやり方。つなぎ先はいったんノードにしておいて、属性でどのサブグラフかを指定している。

元のプログラムに戻り、ちょっとえぐいのは、サブグラフの名前。生成時に "sub01" ~ "sub03" を指定しているが、これは内部的に勝手に "cluster_sub01" のように "cluster_" が付けられてしまう。そのため、後で名前を使うときには、get_name() で取り出し直さなければならない。これが嫌な場合は、生成時には名前を指定せずに、生成したあとに set_name() で指定するとかいうことになるかな。リストから自動生成するときには、そういうやり方をするようにしないとエッジの名前と実体の対応が取れなくなってしまう。

とりあえず、下のようなものができた。サブグラフを含むようなグラフを簡単に各方法については、おいおい考える。


なかのひと







お気に入りの記事を「いいね!」で応援しよう

Last updated  2007.11.17 20:48:20
コメント(0) | コメントを書く



© Rakuten Group, Inc.