Introspection

import_graph = introspection.build_import_graph(src_dir)
introspection.plot_treemap_with_imports(
file_tree, import_graph, padding=0.025, arrow_props={"color": "k"}
)

Star-shaped Euler diagram¶
An alternative to the nested-rectangle treemap: each directory becomes a convex star-shaped boundary (an Euler diagram) fitted by gradient descent, with files as rectangles and import edges overlaid the same way as above.
This is quite bad at the moment.
from vizopt.base import OptimConfig
euler = introspection.build_euler_diagram(
file_tree, padding=0.025, weight_area=10.0, weight_position_anchor=0.01
)
euler.optimize(OptimConfig(n_iters=15000, learning_rate=0.003))
introspection.plot_euler_diagram_with_imports(euler, import_graph)

class_hierarchy = nx.DiGraph()
for node in file_tree.nodes:
if file_tree.nodes[node]["is_dir"] or node.suffix != ".py":
continue
tree = introspection.parse_module_ast(src_dir / node)
class_hierarchy = nx.compose(class_hierarchy, introspection.build_class_hierarchy(tree))
sorted(class_hierarchy.edges)