问题描述
我正在尝试创建一个项目,在该项目中我从 Python 项目创建图表。 我有这个代码
import os
import sys
import re
import networkx as nx
from pyvis.physics import Physics
from radon.visitors import ComplexityVisitor
from pyvis.network import Network
rootDir ="/home/ask/Git/Zeeguu-API"
depth = int(sys.argv[1])
class directory:
def __init__(self,path,ParentDir = None,ChildrenDirs = [],PyChildren = []) -> None:
self.path = path
self.parentDir = ParentDir
self.pyChildren = ChildrenDirs
self.pyChildren = PyChildren
def getComplexityoffile(file : str):
f = open(file,"r")
s = f.read()
return ComplexityVisitor.from_code(s).total_complexity
def getParentOfDir(dir: str):
cutlast = dir.split("/")[:-1]
join = "/".join(cutlast)
if join:
return join
else:
return "./"
def extract_importandClass_from_line(unline):
x = re.search("^import (\S+)",unline)
x = re.search("^from (\S+)",unline)
return x.group(1)#,c.group(1).split('(')[0]
def getimportsforfile(file):
lines = [line for line in open(file)]
classes = []
all_imports = []
for line in lines:
try:
imports = extract_importandClass_from_line(line)
tmp = imports.rsplit('.',1)
importEnd = tmp[-1]
# importsimports
importsFormatted = imports.replace('.','/')
finalimport = importsFormatted[1:] if importsFormatted.startswith('/') else importsFormatted
all_imports.append(importsFormatted)
except:
continue
return all_imports
NodesAndComplexity = {} # (node/complexity in folder)
# ting jeg vil bruge til at holdestyr på dependencies
Map_Dirs_And_Files_To_displaybledirs = {}
pythonFile_to_imports = {} # (Fille importing,file/dir imported)
dirsFordisplay = set()
# mapping files to parent directories
parenDirtochildDir = {} # (parent,[list of children])
G = nx.DiGraph()
isRoot = True
for root,dirs,files in os.walk(rootDir):
pyfiles = list(filter(lambda a : a.endswith('.py'),files))
thisDir = root.replace(rootDir,'')
splitDIR = thisDir[1:].split("/")[:depth]
if not isRoot:
displayableDir = "/" + "/".join(splitDIR)
else:
displayableDir = "./"
isRoot = False
# if there is python files on this directory
referentialDIr = thisDir[1:] if thisDir.startswith('/') else thisDir
Map_Dirs_And_Files_To_displaybledirs[referentialDIr] = displayableDir
if (pyfiles):
accumulateComplexity = 0
for f in pyfiles:
filepath = root + "/"+ f
imports = getimportsforfile(filepath)
logFile = thisDir + "/" + f[:-3]
accumulateComplexity = accumulateComplexity + getComplexityoffile(filepath)
removedslashFromLogfile = logFile[1:] if logFile.startswith('/') else logFile
Map_Dirs_And_Files_To_displaybledirs[removedslashFromLogfile] = displayableDir
pythonFile_to_imports[removedslashFromLogfile] = imports
if displayableDir not in NodesAndComplexity:
NodesAndComplexity[displayableDir] = accumulateComplexity
else:
NodesAndComplexity[displayableDir] = NodesAndComplexity[displayableDir] + accumulateComplexity
if (displayableDir not in dirsFordisplay):
dirsFordisplay.add(thisDir)
G.add_node(displayableDir,Physics=False)
if not isRoot and displayableDir != "./":
parent = getParentOfDir(displayableDir)
G.add_edge(parent,displayableDir)
# setting node sizes
for importingfile,importlist in pythonFile_to_imports.items():
for importt in importlist:
if importt in Map_Dirs_And_Files_To_displaybledirs:
fromf = Map_Dirs_And_Files_To_displaybledirs[importingfile]
to = Map_Dirs_And_Files_To_displaybledirs[importt]
if fromf != to:
G.add_edge(Map_Dirs_And_Files_To_displaybledirs[importingfile],Map_Dirs_And_Files_To_displaybledirs[importt],color="red")
for node,complexity in NodesAndComplexity.items():
complexixtydisplay = complexity / 2
G.nodes[node]["size"] = complexixtydisplay
displayer = Network(directed=True,height="1500px",width="100%")
displayer.from_nx(G)
displayer.barnes_hut(overlap=1)
displayer.show_buttons(filter_=["physics"])
displayer.show("pik.html")
这很好地创建了图形。然而,当我创建它时,图表在我的屏幕上飞来飞去,无法真正看到它。
如果我删除 displayer.barnes_hut(overlap=1)
,那么它不会移动,但是节点都只是堆积在彼此的顶部,并且再次无法破译该图。
如何获得既保持(合理)静止又可读的图表?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)