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
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")
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
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)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| viewx-0.3.0.tar.gz | 4.7 MB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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.