Цветовые узлы Networkx по группам в Боке - PullRequest
0 голосов
/ 11 октября 2018

Я использую Bokeh (v0.13.0) для визуализации графиков networkx.Мои узлы индексируются / вводятся как строки или категориально.Я пытаюсь раскрасить свои узлы в зависимости от выбранных групп.Однако группа kwarg GroupFilter CDSView от Bokeh допускает только один строковый аргумент.Так что в моем случае я могу фильтровать только по одному узлу.Есть ли способ для группы принять более одной строковой аргумент?Если мои индексы / ключи являются целыми числами, я могу использовать IndexFilter для перечисления более одного индекса / ключа, но это не то, что мне нужно, поскольку все мои сетевые узлы идентифицируются по их строковым именам.

В моем простом примере нижеиз четырех узлов A, B, C, D узел B окрашен в красный цвет.Я также хотел бы, чтобы узел D тоже был окрашен в красный цвет.

Любые указатели, помощь и т. Д., Которые может дать любой, наиболее ценится!Спасибо!

import networkx as nx
from bokeh.io import show, output_file
from bokeh.plotting import figure
from bokeh.models import MultiLine, Circle
from bokeh.models import ColumnDataSource, CDSView, GroupFilter

from bokeh.models.graphs import from_networkx
from bokeh.palettes import Category10_4

N = [('A','B'), ('B','C'), ('B','D')]

G = nx.Graph(N)
plot = figure(x_range=(-1.1,1.1), y_range=(-1.1,1.1))
graph = from_networkx(G, nx.circular_layout, scale=1, center=(0,0))
graph.node_renderer.glyph = Circle(size=15, fill_color=Category10_4[0])
graph.node_renderer.selection_glyph = Circle(size=15,
                                             fill_color=Category10_4[2])
graph.node_renderer.hover_glyph = Circle(size=15,fill_color=Category10_4[1])

graph.edge_renderer.glyph = MultiLine(line_color="#CCCCCC", line_alpha=0.8,
                                       line_width=5)
graph.edge_renderer.selection_glyph = MultiLine(line_color=Category10_4[2],
                                                line_width=5)
graph.edge_renderer.hover_glyph = MultiLine(line_color=Category10_4[1],
                                            line_width=5)

plot.renderers.append(graph)
node_keys = list(graph.layout_provider.graph_layout.keys())
x, y = zip(*graph.layout_provider.graph_layout.values())
source = ColumnDataSource({'x': x, 'y': y,
                       'nkeys': [node_keys[i] for i in range(len(x))]})
view1 = CDSView(source=source, filters=[GroupFilter(column_name='nkeys',
                                         group='B')])
view = plot.circle(x="x", y="y", size=15, color='red', source=source,
                    view=view1)
plot.renderers.append(view)
show(plot)

enter image description here

...