Назначьте цвет узлу NetworkX на основе имени столбца - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь построить сетевой график, используя NetworkX и Bokeh. Я использую функцию NetworkX from_pandas_edgelist, чтобы добавить данные для графика. Я хотел бы закрасить узел графика на основе столбца в исходных данных ввода.

Фрейм данных relation выглядит следующим образом:

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)

Буду очень признателен за любую помощь.

1 Ответ

3 голосов
/ 26 марта 2019

После старого редактирования:

Не могу дать слишком много контекста, так как я не очень хорошо знаком с боке, но похоже, что вы можете использовать подход, аналогичный тому, что я делал изначально, просто вместо того, чтобы передать "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)


...