45

ノードと有向エッジの大きなグラフがあります。さらに、各ノードに割り当てられた値の追加リストがあります。

ここで、ノードの値に応じて各ノードの色を変更したいと思います。たとえば、非常に高い値の赤のノードと低い値の青のノードを描画します(ヒートマップと同様)。これはどういうわけか簡単に達成できますか?networkxを使用していない場合は、Pythonの他のライブラリも利用できます。

4

2 に答える 2

72
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_edges_from(
    [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
     ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')])

val_map = {'A': 1.0,
           'D': 0.5714285714285714,
           'H': 0.0}

values = [val_map.get(node, 0.25) for node in G.nodes()]

nx.draw(G, cmap=plt.get_cmap('viridis'), node_color=values, with_labels=True, font_color='white')
plt.show()

収量 ここに画像の説明を入力してください


の番号はvalues、のノードに関連付けられていG.nodes()ます。つまり、の最初の番号はvaluesの最初のノードに関連付けられG.nodes()、2番目の番号も同様に関連付けられます。

于 2012-11-22T17:57:32.510 に答える
8

ノードの属性を示す値のリストがあり、その属性のスケール感を与える特定のノードに色を割り当てたい一般的なケース(たとえば、赤から青)の場合、これが1つです。アプローチ:

import matplotlib as mpl
from matplotlib import pyplot as plt
from pylab import rcParams
import networkx as nx

G = nx.Graph()
G.add_edges_from([('A', 'D'), ('Z', 'D'), ('F', 'J'), ('A', 'E'), ('E', 'J'),('Z', 'K'), ('B', 'A'), ('B', 'D'), ('A', 'J'), ('Z', 'F'),('Z', 'D'), ('A', 'B'), ('J', 'D'), ('J', 'E'), ('Z', 'J'),('K', 'J'), ('B', 'F'), ('B', 'J'), ('A', 'Z'), ('Z', 'E'),('C', 'Z'), ('C', 'A')])

各ノードを特定の値にマッピングする次の辞書があるとします。

color_lookup = {k:v for v, k in enumerate(sorted(set(G.nodes())))}
# {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'J': 6, 'K': 7, 'Z': 8}

私たちができることは、ノードが取る最小値と最大値に基づいて範囲内mpl.colors.Normalizeの値を正規化し、次に正規化された値をカラーマップの色にマップすることです。ここでは次を使用します。color_lookup[0,1]matplotlib.cm.ScalarMappablempl.cm.coolwarm

low, *_, high = sorted(color_lookup.values())
norm = mpl.colors.Normalize(vmin=low, vmax=high, clip=True)
mapper = mpl.cm.ScalarMappable(norm=norm, cmap=mpl.cm.coolwarm)

rcParams['figure.figsize'] = 12, 7
nx.draw(G, 
        nodelist=color_lookup,
        node_size=1000,
        node_color=[mapper.to_rgba(i) 
                    for i in color_lookup.values()], 
        with_labels=True)
plt.show()

ここに画像の説明を入力してください

cmap別のカラーマップの場合は、次のパラメータを変更する必要がありますmpl.cm.ScalarMappable

mapper = mpl.cm.ScalarMappable(norm=norm, cmap=mpl.cm.summer)
nx.draw(G, 
        nodelist=color_lookup,
        node_size=1000,
        node_color=[mapper.to_rgba(i) 
                    for i in color_lookup.values()], 
        with_labels=True)
plt.show()

入手先:

ここに画像の説明を入力してください

degree同様に、すべてのノードを対応する次数にマッピングする辞書を定義し、上記と同じ手順を実行することで、ノードの色に基づいてノードの色を設定できます。

d = dict(G.degree)
# {'A': 6, 'D': 4, 'Z': 7, 'F': 3, 'J': 7, 'E': 3, 'K': 2, 'B': 4, 'C': 2}
low, *_, high = sorted(d.values())
norm = mpl.colors.Normalize(vmin=low, vmax=high, clip=True)
mapper = mpl.cm.ScalarMappable(norm=norm, cmap=mpl.cm.coolwarm)

nx.draw(G, 
        nodelist=d,
        node_size=1000,
        node_color=[mapper.to_rgba(i) 
                    for i in d.values()], 
        with_labels=True,
        font_color='white')
plt.show()

ここに画像の説明を入力してください

于 2020-04-01T21:43:15.207 に答える