我正在尝试使用NetworkX和Bokeh构建网络图。我正在使用NetworkX from_pandas_edgelist
函数为图形添加数据。我想根据初始数据输入中的列为图表的节点着色。
relation
DataFrame如下:
company client
Google AT&T
Google Cisco
Amazon Facebook
Amazon Snap
Amazon Microsoft
Apple Intel
Apple IBM
Apple Visa
上面的代码段只是DataFrame的一部分。
我希望company
的所有节点以不同的颜色返回client
。
下面的代码生成一个网络图,其中所有节点都是相同的颜色。
G=nx.from_pandas_edgelist(relation, 'company', 'client')
# Show with Bokeh
plot = Plot(plot_width=1000, plot_height=800,
x_range=Range1d(-1.1, 1.1), y_range=Range1d(-1.1, 1.1))
plot.title.text = "Company - Client Network"
node_hover_tool = HoverTool(tooltips=[("Company Name", "@index")])
plot.add_tools(node_hover_tool, BoxZoomTool(), ResetTool())
graph_renderer = from_networkx(G, nx.spring_layout, scale=1, center=(0, 0))
graph_renderer.node_renderer.glyph = Circle(size=20)
graph_renderer.edge_renderer.glyph = MultiLine(line_color="red", line_alpha=0.8, line_width=1)
plot.renderers.append(graph_renderer)
output_file("interactive_graphs.html")
show(plot)
任何人都可以提供的任何帮助将不胜感激。
旧编辑之后:
不能给出太多的上下文,因为我对bokeh并不是很熟悉,但看起来你可以使用类似于我最初做的方法而不是传递“color_map”你的绘图功能你必须把你的数据粘在这里graph_renderer.node_renderer.data_source.data['colors']
无论如何,这似乎做了这个工作,祝你好运。
relation = pd.DataFrame({
"company":["Google", "Google", "Amazon", "Amazon", "Amazon",
"Apple", "Apple", "Apple"],
"client":["AT&T", "Cisco", "Facebook", "Snap", "Microsoft",
"Intel", "IBM", "Visa"]})
G=nx.from_pandas_edgelist(relation, 'company', 'client')
colors = []
for node in G:
if node in relation["client"].values:
colors.append("blue")
else: colors.append("green")
plot = Plot(plot_width=1000, plot_height=800,
x_range=Range1d(-1.1, 1.1), y_range=Range1d(-1.1, 1.1))
plot.title.text = "Company - Client Network"
node_hover_tool = HoverTool(tooltips=[("Company Name", "@index")])
plot.add_tools(node_hover_tool, BoxZoomTool(), ResetTool())
graph_renderer = from_networkx(G, nx.spring_layout, scale=1, center=(0, 0))
graph_renderer.node_renderer.data_source.data['colors'] = colors
graph_renderer.node_renderer.glyph = Circle(size=20, fill_color='colors')
graph_renderer.edge_renderer.glyph = MultiLine(line_color="red", line_alpha=0.8, line_width=1)
plot.renderers.append(graph_renderer)
output_file("boo.html")
show(plot)