18

特定の属性を持つノードのグラフがあり、ノードの外側のノードのラベルとしていくつかの属性を使用して、Python で networkx によってグラフを描画したいと考えています。

この目的を達成するためにコードを書く方法を教えてもらえますか?

コードに「interface_?」を生成するループがあります。ファイアウォール リスト (fwList) からの各入力の属性

for y in fwList:
    g.add_node(n, type='Firewall')
    print 'Firewall ' + str(n) + ' :' 
    for x in fwList[n]:
        g.node[n]['interface_'+str(i)] = x
        print 'Interface '+str(i)+' = '+g.node[n]['interface_'+str(i)]
        i+=1
    i=1
    n+=1

次に、後でノードとエッジを次のように描画します。

pos=nx.spring_layout(g)
nx.draw_networkx_edges(g, pos)
nx.draw_networkx_nodes(g,pos,nodelist=[1,2,3],node_shape='d',node_color='red')

後で他の形状と色のいくつかの新しいノードに拡張します。

単一の属性にラベルを付けるために、以下のコードを試しましたが、うまくいきませんでした

labels=dict((n,d['interface_1']) for n,d in g.nodes(data=True))

そして、ノードからテキストを出すために、私にはわかりません...

4

4 に答える 4

11

Aricの答えに加えて、pos辞書にx, yは値に座標が含まれています。したがって、それを操作できます。例は次のとおりです。

pos_higher = {}
y_off = 1  # offset on the y axis

for k, v in pos.items():
    pos_higher[k] = (v[0], v[1]+y_off)

次に、新しい位置でラベルを描画します。

nx.draw_networkx_labels(G, pos_higher, labels)

Gグラフ オブジェクトとlabels文字列のリストはどこにありますか。

于 2016-09-19T11:52:57.397 に答える
11

「pos」ディクショナリのノード位置にアクセスできます。そのため、matplotlib を使用して、好きな場所にテキストを配置できます。例えば

In [1]: import networkx as nx

In [2]: G=nx.path_graph(3)

In [3]: pos=nx.spring_layout(G)

In [4]: nx.draw(G,pos)

In [5]: x,y=pos[1]

In [6]: import matplotlib.pyplot as plt

In [7]: plt.text(x,y+0.1,s='some text', bbox=dict(facecolor='red', alpha=0.5),horizontalalignment='center')
Out[7]: <matplotlib.text.Text at 0x4f1e490>

ここに画像の説明を入力

于 2013-01-29T05:35:39.657 に答える
3

nudgeレイアウトをオフセットでシフトする関数を作成するのが好きです。

import networkx as nx
import matplotlib.pyplot as plt

def nudge(pos, x_shift, y_shift):
    return {n:(x + x_shift, y + y_shift) for n,(x,y) in pos.items()}

G = nx.Graph()
G.add_edge('a','b')
G.add_edge('b','c')
G.add_edge('a','c')

pos = nx.spring_layout(G)
pos_nodes = nudge(pos, 0, 0.1)                              # shift the layout

fig, ax = plt.subplots(1,2,figsize=(12,6))
nx.draw_networkx(G, pos=pos, ax=ax[0])                      # default labeling
nx.draw_networkx(G, pos=pos, with_labels=False, ax=ax[1])   # default nodes and edges
nx.draw_networkx_labels(G, pos=pos_nodes, ax=ax[1])         # nudged labels
ax[1].set_ylim(tuple(i*1.1 for i in ax[1].get_ylim()))      # expand plot to fit labels
plt.show()

三角形の 3 つのノードを並べた 2 つのグラフ表現。 左側のものは、networkx のデフォルトに従ってノードに直接配置されたラベルであり、右側のものは、ラベルがわずかに上にシフトしたものです。

于 2021-05-13T17:31:31.537 に答える
1

NetworkX のドキュメントには、およびパラメータをdraw_networkx_labels使用して、ラベルを手動で微調整することなく、すぐに使用できる簡単なソリューションが得られることも示されています。horizontalalignmentverticalalignment

ドキュメントから:

  • horizo​​ntalalignment ({'center', 'right', 'left'}) – 水平方向の配置 (default='center')

  • verticalalignment ({'center', 'top', 'bottom', 'baseline', 'center_baseline'}) – 垂直方向の配置 (default='center')

さらに便利なことに、これらの上位関数の引数はキーワード引数を受け入れ、それが下位レベルの関数に渡されるため、これを上位レベルの NetworkX 関数、nx.draw()または の 1 つ(またはそのバリアント) で使用できます。nx.draw_spectral

したがって、次のコードは、ノードの外側でラベルをプッシュ/ナッジするという、あなたが求めたことを実行する最小限の実行可能なコードです。

G = nx.DiGraph(name='Email Social Network')
nx.draw(G, arrowsize=3, verticalalignment='bottom')
# or:
nx.draw(G, arrowsize=3, verticalalignment='top')
plt.show()

その結果をverticalalignment以下に視覚化 します。ここに画像の説明を入力

于 2021-01-19T15:37:59.793 に答える