termplot-rs 0.1.1

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

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

### 1) Como dependencia (crates.io)

```toml
[dependencies]
termplot = "0.1"
````

### 2) Desde el repo (path local)

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

> Nota sobre features: actualmente `color` está activado por defecto. El modo “sin color”
> se refiere al **renderizado** (`render_no_color()`), no a compilar sin la dependencia `colored`.
> (En roadmap: hacer `colored` opcional de verdad mediante `cfg(feature="color")`.)

---

## 🧪 Demo / Examples

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

### Ejecutar la demo

```bash
cargo run --example demo
```

---

## 🚀 Quick start: Auto-Scaling (v0.8+)

Ahora no necesitas calcular los rangos manualmente. `termplot` lo hace por ti:

```rust
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)];

    // Calculamos rango automáticamente con 10% de margen
    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());
}
```

---

## 🧱 Opciones de Renderizado (v0.8+)

### 1) Renderizado estándar (con bordes y color)

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

### 2) Renderizado con título y sin bordes

Ideal para dashboards minimalistas.

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

### 3) Modo No-Color (Plain Text)

Para cuando necesitas guardar el output en un archivo de texto plano sin códigos ANSI.

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

---

## 🧠 Conceptos básicos

### Resolución real (píxeles virtuales)

El canvas se define en **caracteres**: `(width, height)`.
Pero cada carácter Braille contiene **2×4 subpíxeles**, por lo que la resolución real es:

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

---

## ✅ Ejemplos destacados

### 1) Barras con protección de límites

`bar_chart` ajusta automáticamente el ancho de las barras para que:

* cada barra use al menos 1 píxel,
* no desborde el canvas horizontalmente.

### 2) Auto-range con padding configurable

`ChartContext::get_auto_range(points, padding)` calcula rangos robustos incluso si:

* hay pocos puntos,
* el rango es casi cero (evita divisiones por 0),
* quieres margen visual con `padding`.

---

## 🎛️ Consejos de uso

* **Fuente**: usa una monoespaciada con buen soporte Unicode.
* **Terminal**: si quieres TrueColor, activa una terminal moderna.
* **Rendimiento**: para animaciones fluidas, mantén el canvas por debajo de `80×40` caracteres.

---

## 🗺️ Roadmap

* [x] Mejor manejo de límites en `text()` y `bar_chart()`.
* [x] Cálculo de auto-range con padding configurable.
* [x] Renderizado sin color ANSI (`render_no_color()`).
* [x] 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

````