微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个包含一组数据的 Excel 表格。例如:AB2DE3G3ESS123、ABCDEFG3ESR222、ABCDEFG7ESS281、ABCDEFGSAG1262、ABCDEFGZ AG2201、ABCDEFG4AG1AA2、ABCDEFGAESR001。

当输入主机名时:AB2DE3G3ESS123,它必须连接到上面提到的所有其他节点。

每个数据为 14 个字符,其中第 9、第 10 和第 11 个字符确定设备类型,例如:ESS、ESR、AG1、AG2。 我想知道如何根据数据类型创建一组 4 种不同颜色的节点和边。 ESS - 红色, 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,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','#0000FF']
Labels: {491: 'ESS',6520: 'ESR',5203: 'ESS',199: 'AG1',1519: 'AG2',3619: 'AG1',3730: 'ESR'}
Nodes: [491,6520,5203,199,1519,3619,3730]

然后您可以将颜色列表传递给 node_colornx.draw_networkx_nodes() 参数,并将标签列表传递给 nx.draw_networkx_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,labels,# pass labels list
                        font_color='black',font_size=10)
plt.plot()

给出

colored_nodes_graph_no_edges

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。