使用从NetworkX图生成的Bokeh图上的节点排列标签

时间:2018-01-22 20:08:35

标签: python graph networkx bokeh

我正在尝试注释一个来自NetworkX的网络图,它在Bokeh中可视化。我能够成功地将标签添加到ColumnDataSource,并将它们显示在图中,但坐标似乎是错误的,因为标签没有与节点对齐。任何帮助将不胜感激。

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


def visualise_graph(G):
    plot = figure(title="Title", 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)
    return plot


def prepare_labels(G, plot):
    pos = nx.spring_layout(G)
    x, y = zip(*pos.values())
    node_labels = nx.get_node_attributes(N, 'label')
    source = ColumnDataSource({'x': x, 'y': y,
                               'label': [node_labels[i] for i in range(len(x))]})
    labels = LabelSet(x='x', y='y', text='label', source=source,
                      background_fill_color='white')
    plot.renderers.append(labels)
    return plot

 plot = visualise_graph(N)
 plot_w_labels = prepare_labels(N, plot)
 show(plot_w_labels)

3 个答案:

答案 0 :(得分:1)

我发现问题是我使用nx.spring_layout()来获取实际生成带有新坐标的新图形的坐标。相反,我使用.layout_provider.graph_layout从Bokeh图中提取坐标,现在它可以正常工作。

答案 1 :(得分:0)

我第一次在stackoverflow中发帖,所以不要开枪打我。必需的更改是这样的:

#draw graph with some layout
graph_renderer = from_networkx(graph_to_plot, nx.fruchterman_reingold_layout(graph_to_plot), scale=1, center=(0, 0))    
#x, y = zip(*pos.values())
x,y=zip(*graph_renderer.layout_provider.graph_layout.values())
graph_renderer.node_renderer.data_source.data['x']=x
graph_renderer.node_renderer.data_source.data['y']=y
.
.
label=LabelSet(x='x', y='y', text='index',level='glyph', source=graph_renderer.node_renderer.data_source)

答案 2 :(得分:0)

@ user2892709-这是给你的。

首先,使用graph_renderer.layout_provider.graph_layout

提取节点的坐标
graph_renderer = from_networkx(G, nx.spring_layout, scale=1, center=(0, 0))

pos = graph_renderer.layout_provider.graph_layout
x,y=zip(*pos.values())

然后将这些值添加到LabelSet()

source = ColumnDataSource({'x':x,'y':y, 'field': <your_node_list>})
labels = LabelSet(x='x', y='y', text='field', source=source)

最后,您可以使用以下方法将值添加到图形中:

plot.renderers.append(graph_renderer)
plot.renderers.append(labels)