Python、networkx、pyvis:如何更改节点标签字体大小

问题描述 投票:0回答:3

我一直在为一个简单的问题而苦苦挣扎。如何更改某种类型节点的标签大小?我的节点是交换机及其端口。我希望交换机节点的标签字体比端口节点的字体更大。我正在使用 networkx 和 pyvis 来绘制我的数据。

我本质上希望在添加节点(lsysname、rsysname、lswname)时具有更大的字体大小,例如25.我希望当我添加端口作为节点时字体大小为默认的12。 这是可能吗?如果是,我将如何更改下面的代码?

这是我的代码:

#!/usr/bin/env python3
import pandas as pd
from pyvis.network import Network
import networkx as nx
import re

nt = nx.Graph()
nt = Network(height='750px', bgcolor='#222222')

# set the physics layout of the network
nt.barnes_hut(gravity=-80000, central_gravity=0.3, spring_length=10, spring_strength=0.002, damping=0.09, overlap=0)

got_dataLLDP = pd.read_csv('switchLLDPgraph.csv', sep='|')
got_dataPortDescr = pd.read_csv('switchPortDescr.csv', sep='|')

#lsystemname and rsystemname are SWITCHES
#lportnode and rportnode are PORTS
lsystemname = got_dataLLDP['Local SystemName']
lsystemdescr = got_dataLLDP['Local SystemDescr']
lportnode = got_dataLLDP['Local PortNode']
lportlabel = got_dataLLDP['Local PortLabel']

rsystemname = got_dataLLDP['Remote SystemName']
rsystemdescr = got_dataLLDP['Remote SystemDescr']
rportnode = got_dataLLDP['Remote PortNode']
rportlabel = got_dataLLDP['Remote PortLabel']

#lswitchname are SWITCHES
#lswitchport are PORTS
lswitchname = got_dataPortDescr['SW Name']
lswitchport = got_dataPortDescr['Local PortNode']
lswitchportstate = got_dataPortDescr['PORT STATE']

edge_dataLLDP = zip(lsystemname, lsystemdescr, lportnode, lportlabel, rsystemname, rsystemdescr, rportnode, rportlabel)
edge_dataPortDescr = zip(lswitchname, lswitchport, lswitchportstate)

for e in edge_dataLLDP:
    lsysname = e[0]
    lpnode = e[2]
    lplabel = e[3]
    rsysname = e[4]
    rpnode = e[6]
    rplabel = e[7]

    nt.add_node(lsysname, lsysname, size=100, shape='triangle', color='#1abc9c')
    nt.add_node(lpnode, lplabel, size=25, color='#DFFF00')
    nt.add_node(rsysname, rsysname, size=100, shape='triangle', color='#1abc9c')
    nt.add_node(rpnode, rplabel, size=25, color='#DFFF00')
    nt.add_edge(lsysname, lpnode, value=0.05, color='#DFFF00')
    nt.add_edge(lpnode, rpnode, value=0.03, color='#FFFFCC')
    nt.add_edge(rsysname, rpnode, value=0.05, color='#DFFF00')

for f in edge_dataPortDescr:
    lswname = f[0]
    lswport = f[1]
    lswportstate = f[2]
    
    pattern = '\!Description'
    result = re.search(pattern, lswport)
    
    nt.add_node(lswname, lswname, size=100, shape='triangle', color='#1abc9c')
    if lswportstate == 'Up': 
        if result:
            nt.add_node(lswport, lswport, size=25, color='#EA580C')
            nt.add_edge(lswname, lswport, value=0.035, color='#EA580C')
        else:
            nt.add_node(lswport, lswport, size=25, color='#00FF00')
            nt.add_edge(lswname, lswport, value=0.035, color='#00FF00')
    if lswportstate == 'Down':
        if result:
            nt.add_node(lswport, lswport, size=25, color='#EA580C')
            nt.add_edge(lswname, lswport, value=0.035, color='#FF0000')
        else:
            nt.add_node(lswport, lswport, size=25, color='#FF0000')
            nt.add_edge(lswname, lswport, value=0.035, color='#FF0000')

nt.show_buttons()
nt.show('nx.html')
python fonts label networkx pyvis
3个回答
1
投票

问题中的代码相当复杂,因此以下代码片段使用了更简单的设置。关键思想是为节点(和标签)生成固定位置,然后根据某些条件将这些位置子集为小字体和大字体的单独位置。

import networkx as nx

G = nx.Graph()
G.add_edge(1, 2)
G.add_edge(1, 3)
G.add_edge(1, 5)
G.add_edge(2, 3)

# generate layout
pos = nx.spring_layout(G)

# generate positions for labels
nodes_small_font = [1, 5]
pos_small = {k: v for k, v in pos.items() if k in nodes_small_font}

nodes_large_font = [2, 3]
pos_large = {k: v for k, v in pos.items() if k in nodes_large_font}

nx.draw(G, pos)
nx.draw_networkx_labels(G.subgraph(nodes_small_font), pos_small, font_size=35)
nx.draw_networkx_labels(G.subgraph(nodes_large_font), pos_large, font_size=75)

0
投票

试试这个 -

nt.add_edge(lswname, lswport, value=0.035, color='#FF0000', font='20px arial black')

0
投票

嗯,文档没有提到这一点,但我找到了给定的调用:

g = Network(width=1900, height=1000)
g.from_nx(your_network_graph)
for n in g.nodes:
    n["size"] = 100
    n["font"]={"size": 100}
g.barnes_hut()
g.toggle_physics(True)
g.write_html("viz.html")

同样,您可以更改边缘标签的大小:

for e in g.edges:
    if "label" in e:
        e["font"]={"size": 100}
© www.soinside.com 2019 - 2024. All rights reserved.