Подключение узлов, использующих петли в Graphviz - PullRequest
0 голосов
/ 07 апреля 2019

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

Примерные данные

DS      PNL        Type           Load
DS-1    PNL-101    Normal Power   Room 1, Room 2, Room 3
DS-1    PNL-102    Normal Power   Room 4, Room 5
DS-1    PNL-103    Emergency      Room 6, Room 7
DS-1    PNL-104    Emergency      Room 8
DS-2    PNL-201    Emergency      Office 1, Office 2
DS-2    PNL-202    Normal Power   Office 3, Workshop
DS-2    PNL-203    Light          Corridors
DS-3    PNL-301    Normal Power   Equipment 1, Equipment 2
DS-4    None       Normal Power   Road

Данные в формате Excel, которые я импортировал как pandas dataframe.Я хочу создать график так, чтобы он отображал «PNL», подключенный к «DS», и «Load», подключенный к каждому «PNL».Мне нужно разделить столбец «Загрузить» по разделителю «,», чтобы получить отдельные нагрузки, например, Комната 1, Комната 2, Комната 3 для DS-1 - PNL-101.

Я пробовал приведенный ниже код, которыйделает работу в некоторой степени.Он создает график, но проблема в том, что каждый PNL связан с каждой нагрузкой (что неверно).

Например, если я хочу построить график для всех экземпляров, которые содержат DS-2, ожидаемыйГрафик должен, например, DS-2, связанный с PNL-202, PNL-202 и PNL-203 (чего я достиг).Аналогично, PNL-201 должен соединяться только с Office 1 и Office 2. PNL-202 должен быть подключен к Office 3 и Workshop.PNL-203 должен соединяться только с Коридором.

import numpy as np
import pandas as pd
import matplotlib as plt
import networkx as nx
#import pygraphviz as pgv
from graphviz import Graph, Digraph
import graphviz # https://www.graphviz.org/doc/info/shapes.html

df = pd.read_excel('data.xlsx')

g = Graph(format='png')

def show_impact(item):
    '''
    Input: The partial string to search in the dataframe df.
           All the rows which contains the string "item", are extracted to 
           form another dataframe df0.
    Output: Plot the graph of the extracted small dataframe.
    '''
    # Search all rows that contains the string "item".
    s = df.stack() # convert entire data frame into a series of values
    df0 = df.iloc[s[s.str.contains(item,na=False)].index.get_level_values(0)]

    # Load column to list of individual locations
    loc = df0['Load'].str.split(',',expand=True).values.tolist()

    # Draw Nodes First
    for i, row in df0.iterrows():
        for j, col in enumerate(df0):

            # Draw DS Nodes
            g.node(str(row['DS']), style='filled', shape='rect', color='#FF5733') 
            # Draw PNL nodes
            g.node(str(row['PNL']), style='filled', shape='rect', color='#FFC300') 
            # Draw Load nodes
    for k in loc:
            for l in k:
                g.node(str(l), style='filled', shape='rect', color='#C0C0C0') 


    # Edges (DS-PNL)
    for i, row in df0.iterrows():
        g.edge(str(row['DS']), str(row['PNL']), color='red', label='')
    # Edges (PNL-Loads)    
    for i, row in df0.iterrows():
        for k in loc:
            for l in k:
                g.edge(str(row['PNL']), str(l), color='red', label='')

    g.view()

show_impact('DS-2')
...