# 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
````