我正在尝试注释一个来自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)
答案 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)