termplot-rs 0.1.0

Una librería para renderizar gráficos en la terminal usando caracteres Braille.
Documentation

termplot

Crates.io Docs.rs License: MIT CI

Gráficos en consola (TUI) usando Unicode Braille (2×4 “píxeles” por carácter) y color ANSI. Permite dibujar scatter plots, líneas, barras, polígonos, círculos, rejillas, ejes, texto y animaciones en terminal, sin depender de GUI.

Ideal para logs, dashboards ligeros, debugging visual, CLI tools, demos y “plots” rápidos en SSH.


✨ Características

  • Canvas de alta densidad con Braille (2×4) → más resolución que ASCII clásico.
  • Color por celda de carácter (ANSI / TrueColor si tu terminal lo soporta).
  • Auto-Range (v0.8+): cálculo automático de escalas para tus datos.
  • Modo No-Color (v0.8+): renderizado sin códigos ANSI para logs planos y terminales antiguos.
  • Primitivas de dibujo:
    • set_pixel
    • line (Bresenham)
    • circle (punto medio)
    • set_char, set_char_vertical
  • Charts:
    • scatter() nube de puntos
    • line_chart() serie conectada
    • bar_chart() barras (con auto-ancho y protección de límites)
    • polygon() polígonos
    • pie_chart() “pie radar” (radios + contorno)
    • draw_grid() rejilla
    • draw_axes() ejes + etiquetas min/max
    • plot_function() plotea funciones f(x) directamente
    • text() capa de texto
  • Animación por frames sobrescribiendo el cursor (sin limpiar pantalla completa).

📦 Instalación

Crates.io

[dependencies]
termplot = "0.1"

Desde repo (path local)

[dependencies]
termplot = { path = "../termplot" }

🚀 Quick start

use termplot::ChartContext;
use colored::Color;

fn main() {
    let mut chart = ChartContext::new(60, 15);

    let points = vec![
        (0.0, 0.0),
        (10.0, 50.0),
        (20.0, 20.0),
        (40.0, 80.0),
    ];

    let (range_x, range_y) = ChartContext::get_auto_range(&points, 0.1);

    chart.draw_axes(range_x, range_y, Some(Color::White));
    chart.line_chart(&points, Some(Color::Cyan));

    println!("{}", chart.canvas.render());
}

🧪 Demo / Examples

El proyecto incluye una demo completa en examples/demo.rs.

cargo run --example demo

Tip: si quieres comprobar solo compilación del ejemplo:

cargo build --example demo

🧱 Renderizado

Estándar (con bordes)

println!("{}", chart.canvas.render());

Con título y sin bordes (dashboards minimalistas)

println!("{}", chart.canvas.render_with_options(false, Some("RENDIMIENTO CPU")));

No-Color (plain text / logs)

println!("{}", chart.canvas.render_no_color());

🧠 Conceptos básicos

El canvas se define en caracteres: (width, height). Cada carácter Braille contiene 2×4 subpíxeles, así que la resolución real es:

  • pixel_width = width * 2
  • pixel_height = height * 4

⚙️ Features

Actualmente:

  • render_no_color() produce salida sin ANSI (ideal para logs).
  • El crate usa colored para colorear el render estándar.

Nota: aunque colored puede estar definido como optional en Cargo.toml, el código todavía no está “feature-gated” por completo. En roadmap: soportar --no-default-features de forma limpia con cfg(feature="color").


✅ Compatibilidad (MSRV)

  • Rust edition 2024 (necesitas una toolchain que soporte 2024).
  • Terminal con buen soporte Unicode recomendado.

🧰 Desarrollo

cargo fmt
cargo clippy
cargo test
cargo run --example demo

Generar docs:

cargo doc --open

📦 Publicación (checklist rápida)

Antes de publicar en crates.io:

  1. Asegúrate de tener LICENSE (MIT) y README.md en el repo.

  2. Revisa Cargo.toml:

    • description, license, repository, homepage (si aplica)
    • keywords, categories (opcional pero recomendable)
  3. Ejecuta:

cargo fmt
cargo clippy
cargo test
cargo package

Y publica:

cargo publish

🗺️ Roadmap

  • Mejor manejo de límites en text() y bar_chart().
  • Cálculo de auto-range con padding configurable.
  • Renderizado sin color ANSI (render_no_color()).
  • Títulos centrados opcionales (render_with_options).
  • Hacer colored realmente opcional con cfg(feature="color").
  • Leyendas automáticas (Series A, B, C).
  • Histogramas de frecuencia.

📄 Licencia

MIT