9886e2905d
draw_join_graph_figure (datascience, grupo eda): dibuja el join graph de la base como una matplotlib Figure real (networkx spring_layout seed=42, nodos = tablas, hubs destacados, flechas dirigidas con etiqueta from_col->to_col + cardinalidad). Nunca lanza: devuelve una Figure de error si algo falla; entrada vacia -> Figure 'Sin relaciones FK detectadas'. render_automatic_eda_folder ahora inserta esa Figure (bloque Figure lazy via make) en el capitulo de relaciones cuando hay edges, ademas del texto Mermaid (util para el MD/LLM). Antes solo se volcaba el texto del grafo; ahora el PDF/PPTX muestran el diagrama dibujado. Tests nuevos: la Figure real se construye con edges y se omite sin edges. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.7 KiB
5.7 KiB
id, name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, example, tested, tests, test_file_path, file_path, params, output
| id | name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | example | tested | tests | test_file_path | file_path | params | output | |||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| draw_join_graph_figure_py_datascience | draw_join_graph_figure | function | py | datascience | 1.0.0 | impure | def draw_join_graph_figure(join_graph: dict, title: str = None) -> "matplotlib.figure.Figure" | Rasteriza el join graph de una base (relaciones FK inter-tabla, salida de build_join_graph) a un matplotlib.figure.Figure: nodos circulares con el nombre de cada tabla (hubs en color de acento cálido, el resto neutro) y aristas dirigidas etiquetadas from_col→to_col (más la cardinalidad si viene). Es la contrapartida dibujada del string Mermaid para que el capítulo de relaciones del informe AutomaticEDA muestre un diagrama real. Layout networkx spring_layout determinista (seed=42), backend Agg sin abrir ventanas; defensivo: nunca lanza y nunca hace I/O. |
|
false | error_go_core |
|
from draw_join_graph_figure import draw_join_graph_figure join_graph = { "nodes": [ {"table": "customers", "out_degree": 0, "in_degree": 1, "role": "dimension"}, {"table": "orders", "out_degree": 1, "in_degree": 0, "role": "fact"}, ], "edges": [ {"from_table": "orders", "from_col": "customer_id", "to_table": "customers", "to_col": "id", "cardinality": "N:1"}, ], "hubs": ["orders"], } fig = draw_join_graph_figure(join_graph, title="Relaciones FK") fig.savefig("/tmp/join_graph.png") | true |
|
python/functions/datascience/draw_join_graph_figure_test.py | python/functions/datascience/draw_join_graph_figure.py |
|
Un matplotlib.figure.Figure (figsize 7x5) con un único Axes que contiene el diagrama node-link dirigido: tablas como nodos circulares etiquetados (hubs en acento cálido #DD8452, resto en azul neutro #4C72B0) y FKs como flechas dirigidas con etiqueta from_col→to_col (+ cardinalidad). Si join_graph no tiene nodos ni aristas (o es None/{}), devuelve igualmente una Figure con el texto centrado "Sin relaciones FK detectadas."; ante cualquier fallo interno devuelve una Figure con un mensaje genérico (nunca lanza). El caller rasteriza/cierra la figura; la función no la muestra ni la guarda. |
Ejemplo
from draw_join_graph_figure import draw_join_graph_figure
# `join_graph` es la salida de build_join_graph (nodes + edges + hubs).
join_graph = {
"nodes": [
{"table": "customers", "out_degree": 0, "in_degree": 1, "role": "dimension"},
{"table": "orders", "out_degree": 2, "in_degree": 0, "role": "fact"},
{"table": "products", "out_degree": 0, "in_degree": 1, "role": "dimension"},
],
"edges": [
{"from_table": "orders", "from_col": "customer_id",
"to_table": "customers", "to_col": "id", "cardinality": "N:1"},
{"from_table": "orders", "from_col": "product_id",
"to_table": "products", "to_col": "id", "cardinality": "N:1"},
],
"hubs": ["orders"], # `orders` se pinta en color de acento (tabla de hechos)
}
fig = draw_join_graph_figure(join_graph, title="Relaciones FK")
# El renderer del informe lo rasteriza; aquí solo persistimos para inspección.
fig.savefig("/tmp/join_graph.png")
Cuando usarla
Úsala en el capítulo de relaciones de un informe AutomaticEDA cuando quieras un
diagrama dibujado del esquema relacional, no solo el bloque Mermaid pegable.
Pásale directamente la salida de build_join_graph (nodes + edges + hubs)
y obtienes una matplotlib.figure.Figure lista para que el renderer perezoso la
rasterice. Es la pareja visual del string Mermaid: Mermaid sirve para pegar en
Markdown/docs que lo soporten; esta función produce la imagen real (PNG/PDF) que
va embebida en informes que no renderizan Mermaid.
Gotchas
- Impura por matplotlib. Fija el backend
Aggal importar — no abre ventanas ni depende de un display. Segura de llamar en lotes desde el renderer. - Layout determinista (
seed=42). Usanx.spring_layout(G, seed=42), así que la misma entrada produce el mismo diagrama (test reproducible). Para grafos de 0/1 nodos usa una posición fija centrada en vez del spring layout. - No hace I/O. No llama
plt.show()ni guarda a disco — solo devuelve laFigure. Quien la consume la rasteriza y la libera (plt.close(fig)) para no acumular memoria en informes con muchas tablas. - Devuelve una Figure, NO un dict. A diferencia de
build_join_graph(que devuelve el dict del grafo), esta función devuelve el objeto de figura ya dibujado. - Defensiva, nunca lanza.
None,{}, claves ausentes o items malformados se manejan sin error: en el peor caso devuelve unaFigurecon "Sin relaciones FK detectadas." (vacío) o un mensaje genérico (fallo interno). No la envuelvas en try/except por miedo a un raise — no lo hay.