График: встроенные в маркеры диаграммы рассеяния / сетевого графика - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь визуализировать байесовскую сеть и хотел бы наложить простой график, показывающий распределение предельной вероятности вместо маркера / узла.

Например, *

import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
import networkx as nx

G = nx.DiGraph([
    ('Rain', 'Grass_Wet'),
    ('Sprinkler', 'Grass_Wet'),
    ('Rain', 'Sprinkler')])

app = dash.Dash(__name__)

def generate_network_graph(G):        
    pos = nx.drawing.layout.spectral_layout(G)
    # Add additional attribute specifying node position
    label_col = 'label'
    for node in G.nodes:
        G.nodes[node]['pos'] = list(pos[node])
        G.nodes[node][label_col] = node
    # Define Figure
    traceRecode = []  # contains edge_trace, node_trace, middle_node_trace

    index = 0
    for edge in G.edges:
        x0, y0 = G.nodes[edge[0]]['pos']
        x1, y1 = G.nodes[edge[1]]['pos']
        #weight = float(G.edges[edge]['TransactionAmt']) / max(edge1['TransactionAmt']) * 10
        trace = go.Scatter(x=tuple([x0, x1, None]), y=tuple([y0, y1, None]),
                           mode='lines')
        traceRecode.append(trace)
        index = index + 1

    node_trace = go.Scatter(x=[], y=[], hovertext=[], text=[], mode='markers+text', textposition="bottom center", marker={'size': 20})

    index = 0
    for node in G.nodes():
        x, y = G.nodes[node]['pos']
        node_trace['x'] += tuple([x])
        node_trace['y'] += tuple([y])
        index = index + 1

    traceRecode.append(node_trace)

    figure = {
        "data": traceRecode,
        "layout": go.Layout(title='Bayesian Network', showlegend=False, hovermode='closest',
                            margin={'b': 40, 'l': 40, 'r': 40, 't': 40},
                            xaxis={'showgrid': False, 'zeroline': False, 'showticklabels': False},
                            yaxis={'showgrid': False, 'zeroline': False, 'showticklabels': False},
                            height=600

                            )}
    return figure

def create_bar_plot():
    figure = go.Figure(go.Bar(
            x=[0.6, 0.4],
            y=['Yes', 'No'],
            orientation='h'))

    return figure


app.layout = html.Div(
    [
        html.Div(
            # className="six columns",
            children=[dcc.Graph(id="my-graph", figure=generate_network_graph(G))],
        ),
        html.Div(children=[dcc.Graph(id="my-graph2", figure=create_bar_plot())]),
    ]
)

if __name__ == '__main__':
    app.run_server()

будет генерировать первый выход.

Now

Но мне нужно либо вставлять, либо перекрывать столбцы на каждом узле, показывая распределение предельной вероятности этого узла. Я хотел бы иметь возможность получать сетевую ориентацию от networkx, так как это очень важно для моего приложения. Сеть достаточно велика, и невозможно непосредственно указать местоположение барплота.

Desiredoutput

1 Ответ

0 голосов
/ 27 февраля 2020

В python нет функциональности для создания встроенных гистограмм узлов (для альтернативы - manual.cytoscape.org/en/stable/Styles.html, см. Учебное пособие 6: Диаграммы узлов) - Но p ie диаграммы могут быть созданы с использованием da sh -cytoscape, как показано ниже

При добавлении следующего блока в таблицу стилей Cytoscape по умолчанию da sh будет создан узел со следующим стилем

default_stylesheet = [{
    "selector": "node",
    "style": {
        "background-color": "green",
        "pie-size": "80%",
        "pie-1-background-color": "#E8747C",
        "pie-1-background-size": f"mapData(Yes, 0, 1, 0, 100)",
        "pie-2-background-color": "#74CBE8",
        "pie-2-background-size": f"mapData(No, 0, 1, 0, 100)",
    }]

enter image description here

Da sh -cytoscape позволяет использовать все большинство стилевых вариантов cytoscape js, указанных в ссылках, которые могут быть достаточными для вашего конкретного варианта использования

Полезные ссылки:

https://js.cytoscape.org/demos/pie-style/ https://dash.plot.ly/cytoscape

...