web-dev-qa-db-ja.com

ボケネットワークプロットへのノードラベルの追加

次のコードを使用して、インタラクティブなボケネットワークグラフを作成しています。ボケプロットのノードにノードの名前を追加するにはどうすればよいですか?

from bokeh.io import show, output_notebook
from bokeh.models import Plot, Range1d, MultiLine, Circle, HoverTool, TapTool, BoxSelectTool
from bokeh.models.graphs import from_networkx, NodesAndLinkedEdges, EdgesAndLinkedNodes
from bokeh.palettes import Spectral4
from bokeh.models import LabelSet

plot = Plot(plot_width=900, plot_height=500,
            x_range=Range1d(-1.1,1.1), y_range=Range1d(-1.1,1.1))
plot.title.text = "Graph Interaction Demonstration"

plot.add_tools(HoverTool(tooltips=None), TapTool(), BoxSelectTool())

graph_renderer = from_networkx(G, nx.circular_layout, scale=1, center=(0,0))

graph_renderer.node_renderer.glyph = Circle(size=15, fill_color=Spectral4[0])
graph_renderer.node_renderer.selection_glyph = Circle(size=15, fill_color=Spectral4[2])
graph_renderer.node_renderer.hover_glyph = Circle(size=15, fill_color=Spectral4[1])
graph_renderer.node_renderer.glyph.properties_with_values()
graph_renderer.Edge_renderer.glyph = MultiLine(line_color="#CCCCCC", line_alpha=0.8, line_width=5)
graph_renderer.Edge_renderer.selection_glyph = MultiLine(line_color=Spectral4[2], line_width=5)
graph_renderer.Edge_renderer.hover_glyph = MultiLine(line_color=Spectral4[1], line_width=5)

graph_renderer.selection_policy = NodesAndLinkedEdges()
graph_renderer.inspection_policy = EdgesAndLinkedNodes()

plot.renderers.append(graph_renderer)

show(plot)

結果のボケネットワークxグラフ: enter image description here

12
Kate Lewis

私もやりたかった、ノードのインタラクティブなラベルを意味していると思います。これを実現するには、いくつかの行を変更する必要があります。

hover = HoverTool(tooltips=[("Name:", "@name")])
plot.add_tools(hover, TapTool(), BoxSelectTool(), WheelZoomTool())
...
graph_renderer.inspection_policy = NodesAndLinkedEdges()

次に、ノードのデータソースを変更します。

graph_renderer.node_renderer.data_source.data['name'] = [name1, ... ,nameN]

(データソースはすでに存在します。これは、唯一のキーが「インデックス」、ノードの番号付きリストである辞書です。したがって、名前のリストなど、同じ長さのリストとこれらのリストを参照するキーをさらに追加できます。 '@key'を介してアクセスできます)

9
Paddy Alton

@SergioLuceroの回答が不完全すぎて質問に回答できないことがわかりました。コード・サンプルが機能していません。

ただし、@ ifearthenightによって作成されたコードと回答を使用して(この質問から: NetworkXグラフから生成されたBokeh図のノードでラベルを並べる )実際の例を作成することができました。

from bokeh.io import show, output_notebook
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, LabelSet
from bokeh.models.graphs import from_networkx
output_notebook()

G = nx.karate_club_graph()

plot = figure(title="Karate Club Graph", tools="", x_range=(-1.5, 1.5),
          y_range=(-1.5, 1.5), toolbar_location=None)
graph = from_networkx(G, nx.spring_layout)
plot.renderers.append(graph)

x, y = Zip(*graph.layout_provider.graph_layout.values())
node_labels = nx.get_node_attributes(G, 'club')
source = ColumnDataSource({'x': x, 'y': y,
                           'club': [node_labels[i] for i in range(len(x))]})
labels = LabelSet(x='x', y='y', text='club', source=source,
                  background_fill_color='white')

plot.renderers.append(labels)
show(plot)
2
Tom Hemmes

ホットトピック!!私はちょうどそれを手に入れたと思います。彼らはもっとPythonの方法かもしれませんが、私がしたことは

  1. 関連するラベルを使用してデータソースを作成します
  2. Pos = nx.circular_layout(G)を使用してグラフから位置を取得します
  3. これらの位置をデータソースに追加します
  4. 位置とソースからLabelSetを作成します

レオナルド、Gが作成される行がありません。私はkarate_club_graphを取りました、そしてこれは私のために働きます:

from bokeh.models import ColumnDataSource
pos = nx.circular_layout(G)
x,y=Zip(*pos.values())

source = ColumnDataSource({'x':x,'y':y,'kid':['Joe %d' %ix for ix in range(len(x))]})
labels = LabelSet(x='x', y='y', text='kid', source=source)

plot.renderers.append(labels)
1
Sergio Lucero