如何通过从excel文件获取数据,使用networkx库在python中创建节点

如何通过从excel文件获取数据,使用networkx库在python中创建节点,python,excel,graph,networkx,edges,Python,Excel,Graph,Networkx,Edges,我有一张excel表格,里面有一组数据。例如:AB2DE3G3ESS123,ABCDEFG3ESR222,ABCDEFG7ESS281,ABCDEFGSAG1262,ABCDEFGZAG2201,ABCDEFG4AG1AA2,ABCDEFGAESR001 输入主机名时:AB2DE3G3ESS123,它必须与上述所有其他节点连接 每个数据由14个字符组成,其中第9、10和11个字符决定设备的类型,例如:ESS、ESR、AG1、AG2。 我想知道如何根据数据类型创建一组4种不同颜色的节点和边。 ES

我有一张excel表格,里面有一组数据。例如:AB2DE3G3ESS123,ABCDEFG3ESR222,ABCDEFG7ESS281,ABCDEFGSAG1262,ABCDEFGZAG2201,ABCDEFG4AG1AA2,ABCDEFGAESR001

输入主机名时:AB2DE3G3ESS123,它必须与上述所有其他节点连接

每个数据由14个字符组成,其中第9、10和11个字符决定设备的类型,例如:ESS、ESR、AG1、AG2。 我想知道如何根据数据类型创建一组4种不同颜色的节点和边。 ESS-Red, ESR-蓝, AG1-绿色, AG2-橙

我编写了一个程序,可以读取excel文件并创建具有边的节点,但无法根据设备类型修改节点颜色。所有节点都具有相同的颜色。代码如下:

#!/usr/bin/env python

"""
Draw a graph with matplotlib.
You must have matplotlib for this to work.
"""

try:
    import matplotlib
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt
except:
    raise

import email.utils
import math
import os
import smtplib
from email import encoders
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from pprint import pprint
import networkx as nx
import openpyxl
import pandas as pd
import pymongo
from openpyxl import Workbook
from openpyxl.cell import WriteOnlyCell
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment
from openpyxl.utils import get_column_letter
# from l3_snmp_support import *
# from email.MIMEMultipart import MIMEMultipart #python2


def draw_sample_diagram(filename, hostname):
    data = pd.read_excel(r"/z/apps/prithvi/DUMMY.xlsx", sheet_name='Sheet1', header=None)

    data = data.loc[data[0] == hostname].values.flatten().tolist()

    if data:
        G = nx.Graph()

        for i, v in enumerate(data):
            if i == 0:
                G.add_node(data[i])
            else:
                G.add_edge(data[i - 1], data[i])

        pos = nx.circular_layout(G, 2)
        nx.draw_networkx_nodes(G, pos,
                               nodelist=data,
                               node_color='ORANGE',
                               node_size=500,
                               label="ESS")
        nx.draw_networkx_labels(G, pos,
                                font_color='black',
                                font_size=10)
        nx.draw_networkx_edges(G, pos)
        plt.savefig(filename, bbox_inches="tight")
        print("Nodes created")
    else:
        print("No data found")


draw_sample_diagram("sample.png", input("Enter Hostname: "))

这里的关键步骤是在节点上迭代并生成颜色和标签的列表。以下是您提供的数据示例:

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt


color_map = {'ESS':'#CC0000',
          'ESR': '#0000FF',
          'AG1':'#009900', 
          'AG2':'#FF8000'}

hosts = ['AB2DE3G3ESS123',
         'ABCDEFG3ESR222',
         'ABCDEFG7ESS281',
         'ABCDEFGSAG1262',
         'ABCDEFGZAG2201',
         'ABCDEFG4AG1AA2',
         'ABCDEFGAESR001']

colors = []
labels = {}
nodes = []

for host in hosts:
    node = np.random.randint(10000)
    nodes.append(node)
    dev_type = host[8:11]
    labels[node] = dev_type
    if dev_type in color_map.keys():
        colors.append(color_map[dev_type])
        
print("Colors:", colors)
print("Labels:", labels)
print("Nodes:", nodes)
哪张照片

Colors: ['#CC0000', '#0000FF', '#CC0000', '#009900', '#FF8000', '#009900', '#0000FF']
Labels: {491: 'ESS', 6520: 'ESR', 5203: 'ESS', 199: 'AG1', 1519: 'AG2', 3619: 'AG1', 3730: 'ESR'}
Nodes: [491, 6520, 5203, 199, 1519, 3619, 3730]
然后,您可以将颜色列表传递给
nx.draw\u networkx\u nodes()
node\u color
参数,并将标签列表传递给
nx.draw\u networkx\u labels()

G = nx.Graph()
G.add_nodes_from(nodes)
pos = nx.circular_layout(G, 2)
nx.draw_networkx_nodes(G,
                       pos,
                       node_color=colors, # pass colors list
                       node_size=500)
nx.draw_networkx_labels(G,
                        pos,
                        labels, # pass labels list
                        font_color='black',
                        font_size=10)
plt.plot()