Skip to main content

ViewX — v0.3.0

ViewX es una librería de visualización para Python enfocada en analistas de datos e ingenieros: gráficas interactivas y estáticas en una línea, dashboards HTML, reportes EDA, presentaciones y PDFs — todo con una API unificada y mínima.

Documentación completa + playground en línea: https://viewx.vercel.app/ (sitio Next.js en web/ de este repo — la Documentation_Page/ estática queda como archivo histórico).

import viewx as vx
df = vx.load_dataset("iris.csv")

vx.plot(df, x="sepal_length", y="petal_length")           # gráfica interactiva en 1 línea
vx.Dashboard.auto(df).save("dash.html")                   # dashboard automático
vx.DataMatrix(df).analyze().save("eda.html")              # reporte EDA interactivo
vx.Presentation.auto(df).save("slides.html")              # slides automáticas
vx.Report.auto(df).save("reporte.pdf")                    # PDF (requiere pdflatex)

Características principales

  • vx.plot(): una llamada para 14 tipos de gráfica, interactiva (Plotly) o estática (matplotlib).
  • API unificada: todos los motores exportan con .save(path) y .show().
  • Temas compartidos: un mismo nombre de tema (dark_enterprise, glass_ocean, …) funciona en dashboards, slides, EDA y gráficas. vx.set_theme() lo fija globalmente.
  • Modo automático: Dashboard.auto(), Presentation.auto(), Report.auto() analizan el DataFrame y eligen KPIs y gráficas por ti.
  • Pensado para datasets grandes: downsampling automático (>10k puntos), WebGL para scatter grandes, muestreo estratificado en el explorador EDA.
  • Ligero: núcleo con solo numpy + pandas + plotly. matplotlib y pylatex son extras opcionales.

Instalación

pip install viewx              # núcleo interactivo
pip install viewx[static]      # + gráficas estáticas (matplotlib)
pip install viewx[pdf]         # + reportes PDF (pylatex; requiere pdflatex)
pip install viewx[all]         # todo

Gráficas rápidas: vx.plot()

import viewx as vx

# Interactiva (Plotly). En notebook se muestra sola.
vx.plot(df, kind="bar", x="region", y="revenue", title="Ventas por región")

# El tipo se infiere de los dtypes si no pasas `kind`
vx.plot(df, x="date", y="revenue")            # datetime -> line
vx.plot(df, x="precio", y="margen")           # num-num -> scatter

# Estática (matplotlib) para papers / PDFs
vx.plot(df, kind="histogram", x="edad", static=True).save("hist.png")

# Objeto Chart: .save(), .show(), .fig (figura Plotly/matplotlib subyacente)
chart = vx.plot(df, kind="donut", x="pais", y="ventas")
chart.save("donut.html")

Tipos disponibles: line, bar, bar_h, scatter, area, pie, donut, histogram, box, violin, heatmap, funnel, treemap, bubble.

Series con más de 10.000 puntos se reducen automáticamente (desactivable con downsample=False); los scatter grandes usan WebGL.


Temas

Seis temas canónicos válidos en todos los motores: corporate_blue · dark_enterprise · modern_green · void_indigo · glass_ocean · cyberpunk_neon

vx.set_theme("dark_enterprise")     # tema global por defecto
vx.Dashboard.auto(df).save("a.html")            # usa el tema global
vx.Presentation.auto(df, theme="glass_ocean")   # o por artefacto

Dashboards HTML

import viewx as vx

# Automático: analiza el DataFrame y arma KPIs + gráficas
vx.Dashboard.auto(df, theme="modern_green", title="Ventas").save("dash.html")

# Manual: grid de 12 columnas
dash = vx.Dashboard(
    title="Manual Dashboard", theme="modern_green",
    cols=12, rows=9,
    navbar={"title": "Manual Dashboard", "items": [{"label": "Home", "link": "#"}]},
    authors=[{"name": "Data Team", "email": "data@acme.com"}],
    data_button=True, df=df,
)
dash.add_valuebox("Total Revenue", "$2.4M", icon_key="dollar", row=1, col=1, height=2, width=3)
dash.add_infobox(df=df, variable="revenue", info=["mean", "median", "std"], row=3, col=1, height=4, width=3)
dash.add_chart(vx.plot(df, kind="bar_h", x="region", y="revenue"),      # acepta Charts de vx.plot
               title="Revenue by Region", row=3, col=4, height=4, width=9)
dash.add_chart(data=df, chart_type="line", x="date", y="revenue",       # o data + chart_type
               title="Daily Trend", row=7, col=1, height=3, width=12)
dash.save("demo_manual.html")     # dash.show() para abrir en el navegador

DashBoardViewX


Presentaciones

from viewx import Presentation, Slide
from viewx.Slides import Title, Subtitle, BulletList, BarPlot, PlotlyChart

# Automática
Presentation.auto(df, title="Dataset Overview", theme="void_indigo").save("auto_slides.html")

# Manual
pres = Presentation("Demo ViewX Slides", theme="dark_enterprise")
pres.font("Inter").meta(author="ViewX", date="2026")

with Slide(title="Bienvenida", notes="Portada"):
    Title("Slides Engine").center("x").pos(top=10).zoom_in(duration=1.2)
    Subtitle("Presentaciones HTML desde Python").center("x").pos(top=26)
    BulletList(["Animaciones CSS", "Gráficos Plotly", "Componentes reutilizables"]).pos(left=8, top=42)

with Slide(title="Gráficos"):
    Title("Plotly integrado").pos(left=6, top=7)
    BarPlot(["A", "B", "C"], [24, 38, 31], title="BarPlot").pos(left=7, top=30).size(width="40%", height="50%")
    PlotlyChart.from_figure(vx.plot(df, kind="donut", x="region", y="revenue"))  # embebe un Chart

pres.save("viewx_slides_demo.html")

Reportes PDF

Requiere pip install viewx[pdf] y pdflatex en el sistema. Sin strings LaTeX: fracciones para anchos, colores CSS en cajas.

from viewx import Report

# Automático: reporte de calidad del dataset
Report.auto(df, title="Quality Report").save("reporte.pdf")

# Manual
r = Report(title="Reporte Técnico", author="Emmanuel Ascendra")
r.text("Este reporte demuestra el motor ViewX.", bold=True)

with r.section("Introducción"):
    r.text("ViewX genera documentos profesionales desde Python.")
    with r.subsection("Características"):
        r.bullets(["Texto estructurado", "Tablas", "Gráficos", "Cajas de información"])

with r.section("Resultados"):
    r.add_table(
        headers=["Modelo", "Accuracy", "F1"],
        rows=[["Regresión", 0.82, 0.79], ["Red neuronal", 0.94, 0.92]],
        caption="Comparación de modelos",
    )
    r.add_image("assets/ejemplo.png", caption="Imagen", width=0.6)   # fracción del ancho
    r.add_line_plot(x=[0, 1, 2, 3], y=[0, 1, 4, 9], caption="Crecimiento cuadrático")
    r.add_box("Observación", "Todo se genera desde Python.", color="#DBEAFE")  # color CSS

r.save("reporte_demo.pdf")

Report PDF


Análisis EDA con DataMatrix

from viewx import DataMatrix

dm = DataMatrix(df)
dm.clean_data(drop_duplicates=True, fill_na=True)
dm.analyze()

print(dm.summary())        # métricas clave
print(dm.alerts())         # advertencias de calidad
print(dm.highlights())     # fortalezas del dataset

dm.save("eda.html", theme="dark_enterprise")   # reporte completo con explorador interactivo
# En una línea: DataMatrix(df).analyze().save("eda.html")

El reporte incluye Overview, perfil por variable, correlaciones, explorador interactivo con filtros (muestreo estratificado para datasets grandes) y muestra paginada.


Integración StatsLibX y SynaptIX

ViewX es el motor de visualización y reportes del ecosistema GhostAnalyst, junto con StatsLibX (estadística) y SynaptIX (machine learning). Las tres comparten el mismo contrato de payload y cargadores de datasets, y cada una funciona por separado:

flowchart TD
    U["Datos crudos<br/>(CSV, DataFrame, arrays)"]
    SLX["StatsLibX<br/>estadistica + manejo de datos + simulacion"]
    SYN["SynaptIX<br/>modelos + evaluacion y mejora"]
    VX["ViewX<br/>dashboards, EDA, PDF, slides"]
    U --> SLX
    U --> SYN
    U --> VX
    SLX -->|"DataFrame / polars"| SYN
    SLX -->|"to_report_data() payload"| VX
    SYN -->|"to_report_data() payload"| VX
    SYN -->|"diagnostics() usa InferentialStats"| SLX
    VX -->|"HTML / PDF / slides"| U

ViewX recibe payloads de StatsLibX y de SynaptIX vía from_report_payload(). El contrato es el mismo: un dict con title, sections, tables y opcionales valueboxes/figures.

from statslibx import DescriptiveStats, to_report_data, load_iris
from viewx import from_report_payload

df = load_iris()
summary = DescriptiveStats(df).summary()

# Opción 1 — método directo en el resultado
summary.to_html("iris.html", theme="dark_enterprise", data=df)

# Opción 2 — pipeline manual
payload = to_report_data(summary, include_figures=True, data=df)
from_report_payload(payload, target="html", filename="iris.html")

Con SynaptIX (machine learning) funciona igual:

import synaptix as sx

df = sx.load_dataset("iris")
X, y = df.drop(columns="species"), df["species"]
model = sx.supervised.RandomForestClassifier().fit(X, y)

# Método directo en el resultado (requiere pip install synaptix[viewx])
model.evaluate(X, y).to_html("evaluacion.html", theme="dark_enterprise")

# O pipeline manual con el mismo contrato
payload = model.evaluate(X, y).to_report_data(include_figures=True)
from_report_payload(payload, target="presentation", filename="evaluacion.html")

Flujo completo del ecosistema (StatsLibX → SynaptIX → ViewX)

# pip install statslibx[viewx] synaptix[viewx,stats] viewx
from statslibx import DescriptiveStats, load_iris
import synaptix as sx
from viewx import from_report_payload

df = load_iris()

# 1. Estadística y calidad de datos (StatsLibX)
DescriptiveStats(df).summary()

# 2. Modelo y evaluación (SynaptIX)
X, y = df.drop(columns="species"), df["species"]
modelo = sx.supervised.RandomForestClassifier().fit(X, y)
evaluacion = modelo.evaluate(X, y)

# 3. Todo en un dashboard (ViewX)
payload = evaluacion.to_report_data(include_figures=True)
from_report_payload(payload, target="html", filename="analisis.html")

Portal con documentación y playground unificado de las tres librerías: Libraries_of_Emms (en este workspace).


Migración desde v0.2.x

Antes (v0.2.x) Ahora (v0.3.0)
HTML(...) Dashboard(...) (HTML sigue siendo alias)
dash.generate("f.html", show=True) dash.save("f.html") / dash.show()
HTML.auto_generate(df, template=...) Dashboard.auto(df, theme=...).save(path)
pres.export("f.html") pres.save("f.html")
Presentation.auto_generate(df, ...) Presentation.auto(df).save(path)
report.build("nombre") report.save("nombre.pdf")
Report(twoColumn=True) Report(two_column=True)
report.add_plot(x, y) report.add_line_plot(x, y)
with r.doc.create(r.add_section(...)) with r.section(...)
dm.generate_report(path, show=...) dm.save(path) / dm.show()
Temas de slides dark/ocean/… Alias que resuelven a los 6 temas canónicos

Los métodos antiguos siguen funcionando con DeprecationWarning.

Contribuciones

¡Todas las ideas, mejoras y plantillas son bienvenidas! ViewX está diseñado para crecer y evolucionar con la comunidad.

Contacto

ascendraemmanuel@gmail.com

Metadata

Release files for viewx 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for viewx 0.3.0
File Size Uploaded Provenance
viewx-0.3.0.tar.gz 4.7 MB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for viewx 0.3.0
File Interpreter ABI Platform
viewx-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 9.5 MB

Release files / viewx-0.3.0.tar.gz

Download URL viewx-0.3.0.tar.gz
Size 4.7 MB
Tags Source
SHA-256 checksum
How to use checksums
86632a6ffd1df83780d7b48dc6cafb86d9d86cf100f440bc5a78f4569dba8809
BLAKE2b-256 checksum
How to use checksums
35a066f48397900c86445ce2317ca088500aef8b97cfb9a6a282c9e5ddb5db00
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release files / viewx-0.3.0-py3-none-any.whl

Download URL viewx-0.3.0-py3-none-any.whl
Size 4.8 MB
Tags Python 3
SHA-256 checksum
How to use checksums
8a76c1b38f75399706eebcc931220874d6eeec488a57d7ad15b2115383941353
BLAKE2b-256 checksum
How to use checksums
e75edf6b913d27b15cdaf3599f2e0c70069752ae2a04f82e7a4ccd4a79984584
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Security for viewx 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page