plotagents 0.5.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/AGENTS.md +29 -5
  2. package/README.md +44 -15
  3. package/bin/plotagents.js +40 -14
  4. package/dist/plotagents-geo.js +1 -1
  5. package/dist/plotagents.js +6161 -757
  6. package/docs/api.md +23 -5
  7. package/docs/charts.md +229 -10
  8. package/docs/colorscales.md +46 -0
  9. package/docs/dashboards.md +79 -0
  10. package/docs/es/agents.md +102 -0
  11. package/docs/es/api.md +172 -0
  12. package/docs/es/charts.md +436 -0
  13. package/docs/es/colorscales.md +46 -0
  14. package/docs/es/dashboards.md +79 -0
  15. package/docs/es/getting-started.md +142 -0
  16. package/docs/es/rendering.md +47 -0
  17. package/docs/es/themes.md +116 -0
  18. package/docs/getting-started.md +6 -2
  19. package/docs/themes.md +39 -9
  20. package/index.d.ts +275 -20
  21. package/package.json +11 -4
  22. package/schema.json +1382 -53
  23. package/skills/plotagents/SKILL.md +105 -0
  24. package/src/axes.js +11 -3
  25. package/src/charts/bar.js +40 -21
  26. package/src/charts/categorical.js +31 -7
  27. package/src/charts/chord.js +6 -4
  28. package/src/charts/choropleth.js +287 -37
  29. package/src/charts/corr.js +512 -0
  30. package/src/charts/dist.js +39 -21
  31. package/src/charts/donut.js +4 -2
  32. package/src/charts/gantt.js +460 -0
  33. package/src/charts/heatmap.js +2 -2
  34. package/src/charts/kpi.js +11 -8
  35. package/src/charts/line.js +187 -43
  36. package/src/charts/network.js +557 -189
  37. package/src/charts/pointmap.js +602 -0
  38. package/src/charts/radar.js +7 -1
  39. package/src/charts/regplot.js +16 -4
  40. package/src/charts/sankey.js +42 -6
  41. package/src/charts/scatter.js +103 -23
  42. package/src/charts/sunburst.js +7 -6
  43. package/src/charts/table.js +882 -0
  44. package/src/charts/treemap.js +12 -9
  45. package/src/charts/wordcloud.js +177 -0
  46. package/src/colorscales.js +193 -0
  47. package/src/dashboard.js +451 -0
  48. package/src/dashed.js +1 -1
  49. package/src/data.js +4 -2
  50. package/src/facet.js +4 -3
  51. package/src/format.js +80 -25
  52. package/src/frame.js +101 -29
  53. package/src/geo/projection.js +76 -9
  54. package/src/geo/registry.js +87 -8
  55. package/src/hierarchy.js +6 -0
  56. package/src/i18n.js +107 -0
  57. package/src/index.js +92 -14
  58. package/src/infer.js +18 -1
  59. package/src/interact.js +157 -36
  60. package/src/lint.js +353 -11
  61. package/src/runtime.js +301 -101
  62. package/src/scale.js +82 -11
  63. package/src/schema.js +235 -36
  64. package/src/stats.js +76 -17
  65. package/src/svg.js +4 -1
  66. package/src/text.js +5 -0
  67. package/src/theme.js +101 -14
package/docs/es/api.md ADDED
@@ -0,0 +1,172 @@
1
+ # Referencia de la API
2
+
3
+ ```js
4
+ import {
5
+ plot, safePlot, lint, describe, render, toHTML, configure,
6
+ dashboard, safeDashboard, renderDashboard, lintDashboard, planDashboard,
7
+ schema, dashboardSchema, toolDefinition, validatePalette, registerGeo, countWords,
8
+ } from 'plotagents';
9
+ ```
10
+
11
+ Los tipos completos están en [`index.d.ts`](../index.d.ts) y cada opción del spec, en [`schema.json`](../schema.json).
12
+
13
+ ## Dibujo
14
+
15
+ ### `plot(spec)`
16
+
17
+ Dibuja un gráfico y devuelve una cadena SVG. Funciona en Node, Deno, Bun y el navegador. Lanza un `PlotError` cuando el spec no se puede dibujar; el `hint` del error dice cómo corregirlo.
18
+
19
+ ```js
20
+ const svg = plot({ type: 'bar', data, x: 'region', y: 'sales', title: 'Biobío leads with 30%' });
21
+ ```
22
+
23
+ ### `safePlot(spec)`
24
+
25
+ La versión que debes exponer como herramienta de un agente: nunca lanza excepciones.
26
+
27
+ ```js
28
+ const { ok, svg, type, description, errors, warnings, suggestions } = safePlot(spec);
29
+ ```
30
+
31
+ | Campo | Significado |
32
+ |---|---|
33
+ | `ok` | `true` cuando el gráfico se dibujó. |
34
+ | `svg` | La cadena SVG, o `null`. |
35
+ | `type` | El tipo de gráfico resuelto (útil cuando `type` se infirió). |
36
+ | `description` | Texto alternativo del gráfico. |
37
+ | `errors` | Problemas que impiden dibujar el gráfico: `{ code, message, fix }`. |
38
+ | `warnings` | Problemas que vuelven el gráfico engañoso o difícil de leer. |
39
+ | `suggestions` | Mejoras de diseño, como un mejor título o `highlight`. |
40
+
41
+ ### `lint(spec)`
42
+
43
+ Revisa un spec sin dibujarlo y devuelve `{ ok, type, errors, warnings, suggestions }`. Los mensajes siguen el `locale` del spec (español por defecto, inglés con `locale: "en"`); cada uno trae un `fix` con el cambio que hay que hacer.
44
+
45
+ ### `dashboard(spec)` · `safeDashboard(spec)` · `renderDashboard(el, spec)`
46
+
47
+ Un dashboard HTML autocontenido con una disposición según buenas prácticas, colores compartidos, KPI y filtros. `safeDashboard` nunca lanza excepciones y devuelve `{ ok, html, plan, errors, warnings, suggestions }`; `renderDashboard` dibuja dentro de un elemento en el navegador; `lintDashboard` revisa; `planDashboard` devuelve las decisiones de disposición. Consulta [Tableros](dashboards.md).
48
+
49
+ ### `describe(spec)`
50
+
51
+ Devuelve una descripción en texto del gráfico, como "Mayor: Biobío con 1.240 (30%)…". El mismo texto va en el `<desc>` del SVG para los lectores de pantalla.
52
+
53
+ ## En el navegador
54
+
55
+ ### `render(target, spec, opts?)`
56
+
57
+ Dibuja dentro de un elemento (un selector CSS o un nodo del DOM) con tooltips, ancho adaptable, controles de tiempo cuando el spec los pide (`slider: true`), drill-down en treemaps y sunbursts, clic para enfocar en redes, fases plegables en Gantt y clics en la leyenda (shift + clic excluye una entrada; en treemaps y sunbursts, un clic hace zoom en la categoría).
58
+
59
+ ```js
60
+ const chart = plotagents.render('#chart', spec);
61
+ chart.update({ ...spec, highlight: 'Ñuble' }); // redraw
62
+ chart.destroy(); // remove listeners and markup
63
+ ```
64
+
65
+ | Opción | Significado |
66
+ |---|---|
67
+ | `controls` | `false` oculta los controles de tiempo aunque el spec los pida (`slider: true`). |
68
+
69
+ El controlador expone `svg` (el elemento `<svg>` actual) y `spec`.
70
+
71
+ ### `attach(root)`
72
+
73
+ Agrega tooltips a un contenedor que ya tiene un SVG de plotagents, por ejemplo uno generado en el servidor.
74
+
75
+ ### `toHTML(specs, opts?)`
76
+
77
+ Una página HTML autocontenida con uno o más gráficos interactivos y la biblioteca incluida.
78
+
79
+ | Opción | Por defecto | Significado |
80
+ |---|---|---|
81
+ | `title` | `"Gráficos"` | Título de la página. |
82
+ | `lang` | `"es"` | Idioma de la página. |
83
+ | `columns` | `1` | Con dos o más, los gráficos se ordenan en una grilla. |
84
+
85
+ ## Configuración
86
+
87
+ ### `configure(options)`
88
+
89
+ Define valores por defecto para todos los gráficos siguientes; el spec siempre tiene prioridad.
90
+
91
+ ```js
92
+ configure({ font: 'Poppins', textScale: 1.5, locale: 'en' });
93
+ configure(); // returns the current defaults
94
+ configure(null); // clears them
95
+ ```
96
+
97
+ Acepta cualquier opción del spec: `font`, `textScale`, `locale`, `theme`, `palette`, `ramp`, `colorScale`, `legend`, etc. Si un spec trae su propio objeto `theme`, este se combina sobre el global.
98
+
99
+ ### `registerTheme(name, theme)`
100
+
101
+ Registra un tema con nombre (combinado sobre `extends`, `papel` por defecto) para que `theme: name` y `configure({ theme: name })` puedan usarlo. Consulta [Temas](themes.md#your-own-theme-everywhere).
102
+
103
+ ```js
104
+ registerTheme('acme', { background: '#FFF', text: '#111', categorical: 'tab10', grid: { dash: '2 3' } });
105
+ configure({ theme: 'acme' });
106
+ ```
107
+
108
+ ### `colorScaleNames()` · `resolveColorScale(name)`
109
+
110
+ Todos los nombres de escalas de color agrupados por tipo (`sequential`, `diverging`, `cyclic`, `qualitative`), y las paradas de una escala: `{ name, stops, kind }`. `interpolateColor(stops, t)` devuelve el color en `t ∈ [0, 1]` (OKLab).
111
+
112
+ ### `validatePalette(colors, opts?)`
113
+
114
+ Revisa una paleta propia con las mismas pruebas que pasa la paleta incluida. Consulta [temas](themes.md#validating-a-palette).
115
+
116
+ ```js
117
+ validatePalette(['#223C6A', '#E69B0A', '#D21428'], { mode: 'light', surface: '#FFFFFF' });
118
+ // → { ok: false, checks: [{ name: 'lightness', status: 'fail', detail: '…' }, …] }
119
+ ```
120
+
121
+ ### `registerGeo(name, featureCollection, aliases?)`
122
+
123
+ Registra tu propio GeoJSON para que los specs puedan usar `geo: name`. Chile y el mundo vienen incluidos.
124
+
125
+ ## Para agentes
126
+
127
+ ### `toolDefinition({ name?, flavor? })`
128
+
129
+ Devuelve una definición de herramienta construida a partir del JSON Schema: `flavor: "anthropic"` (por defecto) entrega `{ name, description, input_schema }` y `flavor: "openai"` entrega `{ type: "function", function: { … } }`.
130
+
131
+ ```js
132
+ import Anthropic from '@anthropic-ai/sdk';
133
+ import { safePlot, toolDefinition } from 'plotagents';
134
+
135
+ const client = new Anthropic();
136
+ const res = await client.messages.create({
137
+ model: process.env.ANTHROPIC_MODEL,
138
+ max_tokens: 4096,
139
+ tools: [toolDefinition()],
140
+ messages: [{ role: 'user', content: 'Plot the distribution of service times per clinic: …' }],
141
+ });
142
+ const call = res.content.find((b) => b.type === 'tool_use');
143
+ const { ok, svg, errors } = safePlot(call.input);
144
+ // If !ok, send `errors` back as the tool_result: every error carries a `fix`.
145
+ ```
146
+
147
+ ### `schema`
148
+
149
+ El JSON Schema de un spec, publicado también como [`schema.json`](../schema.json) e importable como `plotagents/schema.json`.
150
+
151
+ ## Utilidades
152
+
153
+ | Exportación | Significado |
154
+ |---|---|
155
+ | `TYPES` | Todos los nombres de tipos de gráfico. |
156
+ | `themes`, `getTheme(t)`, `themeFor(spec)` | Los temas incluidos y el tema resuelto de un spec. |
157
+ | `palettes`, `ramps` | Paletas categóricas con nombre y rampas secuenciales y divergentes. |
158
+ | `timeValues(spec)` | Valores ordenados del campo `time`. |
159
+ | `makeFormat(fmt, locale, values)` | El formateador de números que usaría un gráfico. |
160
+ | `formatNumber(v, decimals, locale)`, `formatCompact(v, locale)` | Formato de números según el idioma. |
161
+ | `squarify(items, x, y, w, h)` | El algoritmo de disposición del treemap. |
162
+ | `bundleSource()` | Solo en Node: la versión para navegador como cadena, para incrustarla. |
163
+
164
+ ## Puntos de entrada del paquete
165
+
166
+ | Importación | Contenido |
167
+ |---|---|
168
+ | `plotagents` | Todo lo anterior (módulo ES). |
169
+ | `plotagents/schema.json` | El JSON Schema. |
170
+ | `plotagents/browser` | `dist/plotagents.js`: un `<script>` que define `window.plotagents`. |
171
+ | `plotagents/browser/geo` | `dist/plotagents-geo.js`: geometrías de Chile y del mundo para la versión de navegador. |
172
+ | `plotagents/geo/chile`, `plotagents/geo/world` | Las geometrías como módulos ES. |
@@ -0,0 +1,436 @@
1
+ # Referencia de gráficos
2
+
3
+ Cada gráfico recibe una especificación con `data` (filas) y los nombres de campo de cada rol. Las opciones de abajo son propias de cada tipo; las [opciones comunes](#common-options) valen para todos. Cada opción también está descrita en [`schema.json`](../schema.json).
4
+
5
+ ## Opciones comunes
6
+
7
+ | Opción | Significado |
8
+ |---|---|
9
+ | `type` | Tipo de gráfico o alias. Omítelo (o usa `"auto"`) para inferirlo de los datos. |
10
+ | `data` | Arreglo de objetos fila. También acepta `{ A: 1, B: 2 }` y arreglos de números. |
11
+ | `title` | El hallazgo, como una oración. Se divide en líneas; nunca se trunca. |
12
+ | `subtitle` | Cómo leer el gráfico: medida, unidad, período. |
13
+ | `source` | Fuente de los datos, en letra pequeña abajo a la derecha. |
14
+ | `series` / `hue` | Campo que divide los datos en grupos de color. |
15
+ | `highlight` | Un nombre o una lista: destaca esos y atenúa el resto. |
16
+ | `colors` | `{ "name": "#hex" }` para fijar el color de una entidad. |
17
+ | `format`, `xFormat`, `yFormat` | `"number" \| "compact" \| "percent" \| "currency" \| "integer"` o `{ prefix, suffix, decimals, currency }`. |
18
+ | `locale` | `"es"` (por defecto: `1.234,5`), `"en"` (`1,234.5`), `"pt"`, `"fr"` (`1 234,5`), `"de"` o `"auto"`: se reconoce a partir del título, el subtítulo, los nombres de columna y las categorías. Las tablas usan `"auto"` cuando omites `locale`. |
19
+ | `xLabel`, `yLabel` | Títulos de los ejes (horizontales, nunca rotados). |
20
+ | `xScale`, `yScale` | `"log"` donde tenga sentido. |
21
+ | `xDomain`, `yDomain` | `[min, max]` fijo. |
22
+ | `refLines` | `[{ y: 600, label: "Target" }]` (o `x`, o `value` para barras). |
23
+ | `facet` (`col`), `columns`, `sharey`, `sharex` | Múltiplos pequeños, un panel por valor. |
24
+ | `time`, `timeValue` | Un período a la vez: el más reciente por defecto, o `timeValue`. El período se agrega al subtítulo. |
25
+ | `slider`, `play` | Controles de tiempo en el navegador, **desactivados por defecto**. `slider: true` agrega botones de período cuando hay pocos períodos (≤ 8) y un deslizador mínimo cuando hay muchos; los gráficos de líneas y de áreas reciben un rango con dos tiradores. `"buttons"` o `"slider"` fuerzan uno; `play: false` oculta el botón de reproducir. |
26
+ | `compare` | Con `time`: compara contra `"previous"` (por defecto), `"first"`, un período dado o `false`. |
27
+ | `theme`, `palette`, `ramp` | Consulta [temas](themes.md). |
28
+ | `colorScale` (`cmap`) | Cualquier mapa de colores de matplotlib (`"viridis"`, `"RdBu_r"`…) o tu propia lista de colores. Consulta [escalas de color](colorscales.md). |
29
+ | `font`, `textScale` | Tipografía (nombre de Google Fonts, pila CSS o `{ family, import }`) y un multiplicador del tamaño del texto (alias `fontScale`, `labelScale`). Fíjalos para todos los gráficos con `configure()`. |
30
+ | `width`, `height`, `padding` | Píxeles. La altura es automática en barras horizontales, mapas de calor, tarjetas KPI y en treemaps, sunbursts y radares angostos. |
31
+ | `legend` | Posición: `"top"` (por defecto), `"bottom"`, `"left"`, `"right"` o `false` para ocultarla. Las leyendas laterales pasan abajo por debajo de 520 px. Fijar una posición también fuerza una leyenda donde el gráfico, de otro modo, rotularía las líneas directamente. |
32
+ | `exclude` | Un nombre o una lista: quita esas entradas de la leyenda (series, grupos del primer nivel) y recalcula ejes, proporciones y diseño. Los colores se mantienen y las entradas excluidas siguen en la leyenda, atenuadas y tachadas. |
33
+
34
+ ### En el navegador
35
+
36
+ - **Tooltips**: aparecen junto a la marca bajo el puntero, nunca sobre el título o el subtítulo, y no salen del gráfico. Su encabezado toma el color de la marca, con texto blanco u oscuro según el contraste.
37
+ - **Leyenda**: al pasar el puntero sobre una clave se destacan sus marcas; un clic fija el destaque. **Shift + clic** excluye esa entrada (haz clic de nuevo para recuperarla). En treemaps y sunbursts, un clic simple amplía todo el gráfico a esa categoría; haz clic otra vez, usa la ruta de navegación o presiona Esc para volver.
38
+
39
+ ## Comparar
40
+
41
+ ### `bar` · `column` · `barplot` · `count` (`countplot`)
42
+
43
+ `x` categoría, `y` valor. Columnas para pocas categorías cortas, barras horizontales cuando las etiquetas son largas o hay muchas; valores en la punta de las barras y sin eje cuando todas las barras tienen etiqueta.
44
+
45
+ | Opción | Significado |
46
+ |---|---|
47
+ | `stack` | `true` apila las series; `"percent"` apila al 100%. |
48
+ | `horizontal` | Fuerza la orientación. |
49
+ | `sort` | `"desc"` (por defecto para categorías), `"asc"`, `"none"`, `"alpha"`. Los años y las fechas mantienen su orden. |
50
+ | `top` | Conserva las N más grandes y agrupa el resto en "Otros" (automático sobre 40 categorías). |
51
+ | `ci`, `errorbar`, `estimator` | `barplot`: media ± IC del 95% (`"ci"`), barras de error `"sd"` o `"se"`. |
52
+ | `aggregate` | `"sum"` (por defecto), `"mean"`, `"max"`, `"min"`, `"count"`, `"first"`, `"last"`. `countplot` cuenta filas. |
53
+ | `labels` | `true`, `false` o `"auto"`. |
54
+ | `barWidth` | Grosor máximo de la barra en px. |
55
+
56
+ ## Tiempo
57
+
58
+ ### `line` · `area`
59
+
60
+ `x` fecha (`"2024-03"`, `"2024-03-15"`, `Date`), año o número; `y` valor o lista de campos (tabla ancha → series).
61
+
62
+ | Opción | Significado |
63
+ |---|---|
64
+ | `labels` | Etiquetas al final (activadas por defecto para cada serie que cabe; las etiquetas que chocan reciben líneas guía). |
65
+ | `annotations` | `[{ x: "2024-01", label: "New branch" }]`. |
66
+ | `index` | Lleva cada serie a base 100 en su primer valor. |
67
+ | `ci`, `errorbar`, `estimator` | `lineplot` de seaborn: media y banda de confianza cuando hay varias filas por x. |
68
+ | `curve` | `"linear"` (por defecto), `"smooth"` (monótona, nunca inventa picos), `"step"`. |
69
+ | `zero` | Fuerza el eje y a incluir el cero (activado por defecto en áreas y cuando cuesta poco). |
70
+ | `points` | Marcadores en cada punto (automático en series cortas). |
71
+ | `stack` | Áreas: `true` (por defecto con series), `"percent"` o `false` para superponerlas. |
72
+ | `fill` | Línea única: `false` quita el degradado suave. |
73
+ | `xRange` | Rango visible `[from, to]`; es lo que fija el deslizador de rango (`slider: true`). |
74
+
75
+ ## Proyectos
76
+
77
+ ### `gantt` (`timeline`, `roadmap`, `schedule`, `cronograma`)
78
+
79
+ Una fila por tarea: `task`, `start` y `end` (o `duration`). Fechas como `"2026-03-02"` o `"2026-03"`, o números simples para semanas o sprints. Las fechas con día son **inclusivas**: una tarea del 3 al 5 de marzo dura 3 días. Una fila sin `end`, o con `end` igual a `start`, es un hito y se dibuja como un rombo con su fecha.
80
+
81
+ El eje de tiempo va arriba, como en un calendario. Con `group`, cada fase abre con su nombre y una barra resumen delgada en su color, así que no hace falta leyenda. La parte rellena de cada barra es el avance; el resto queda en un tono claro del mismo color. Las dependencias son flechas delgadas en ángulo recto detrás de las barras.
82
+
83
+ ```js
84
+ plot({
85
+ type: 'gantt',
86
+ title: 'The project goes live on June 15; the ERP integration is the critical path',
87
+ data: [
88
+ { phase: 'Design', task: 'Data model', start: '2026-02-09', end: '2026-03-06', progress: 80 },
89
+ { phase: 'Build', task: 'ERP integration', start: '2026-03-16', end: '2026-04-30', progress: 10, after: 'Data model' },
90
+ { phase: 'Launch', task: 'Go-live', start: '2026-06-15' },
91
+ ],
92
+ task: 'task', start: 'start', end: 'end', group: 'phase', progress: 'progress', dependsOn: 'after',
93
+ today: '2026-03-12', locale: 'en',
94
+ });
95
+ ```
96
+
97
+ | Opción | Significado |
98
+ |---|---|
99
+ | `task`, `start`, `end` | Nombres de campo (se detectan cuando se llaman `task`/`tarea`, `start`/`inicio`, `end`/`fin`). |
100
+ | `duration` | Duración en vez de `end`: días en un eje de fechas, unidades en uno numérico. |
101
+ | `group` (`series`, `hue`) | Fase o equipo: una sección de color por valor. `groupHeaders: false` usa una leyenda de colores en su lugar. |
102
+ | `progress` | 0–1 o 0–100. Se muestra como la parte rellena, con el porcentaje dentro de la barra cuando cabe. |
103
+ | `dependsOn` | Campo con el nombre de la tarea predecesora, o varias: `"A, B"`. |
104
+ | `milestone` | Campo booleano que fuerza hitos. |
105
+ | `today` | Una fecha (o `true`) para la línea de "hoy", rotulada en el eje. `refLines: [{ x, label }]` agrega más. |
106
+ | `dashed`, `dashedLabel` | Achura las tareas tentativas: un campo (`dashed: "tentative"`), nombres o fases. |
107
+ | `highlight` | Destaca una tarea o una fase completa. |
108
+ | `sort` | `"start"` ordena las tareas por fecha (por defecto: el orden de los datos, agrupado por fase). |
109
+ | `rowHeight`, `xLabel`, `unit` | Alto de fila en px; título del eje y unidad para ejes numéricos. |
110
+ | `collapsed`, `collapsible` | Fases dibujadas como una sola fila resumen (avance ponderado por duración, rombos de hitos): una lista de nombres o `true`. En el navegador, un clic en una fase la pliega o despliega (Alt + clic actúa sobre todas); el eje de tiempo y la columna de nombres no se mueven. `collapsible: false` oculta los chevrones. |
111
+ | `critical`, `criticalColor` | Remarca la ruta crítica: tareas sin holgura a lo largo de `dependsOn` (días hábiles en fechas con día), con flechas de acento. |
112
+ | `weekends` | Franjas de fin de semana en planes con fechas de día de hasta 120 días; `false` las desactiva. |
113
+
114
+ `lint` advierte sobre tareas que terminan antes de empezar y sugiere una línea `today`. El texto alternativo nombra el período total, la tarea más larga, los hitos y el avance general ponderado por duración.
115
+
116
+ ## Relaciones
117
+
118
+ ### `scatter` · `bubble`
119
+
120
+ `x`, `y` numéricos; `size` para burbujas (proporcional al área); campo `label` con `labels` (número de puntos o lista de nombres) para etiquetas selectivas; `trend: true` agrega una recta de mínimos cuadrados con R².
121
+
122
+ ### `regplot` (`lmplot`) · `residplot` · `jointplot`
123
+
124
+ | Opción | Significado |
125
+ |---|---|
126
+ | `ci` | Nivel de la banda de confianza (95 por defecto, `false` para ocultarla). |
127
+ | `order` | Grado del polinomio. |
128
+ | `lowess` (+ `frac`) | Regresión local en vez de una recta. |
129
+ | `logx` | Ajusta `y ~ log(x)` y usa un eje x logarítmico. |
130
+ | `scatter` | `false` oculta los puntos. |
131
+ | `truncate` | Dibuja el ajuste solo dentro del rango de los datos (por defecto `true`). |
132
+ | `annotate` | Muestra R² y n. |
133
+ | `label`, `labels` | Nombra puntos seleccionados. |
134
+ | `kind` | `jointplot`: `"scatter"` o `"reg"`. |
135
+ | `marginal` | `jointplot`: `"hist"` o `"kde"`. |
136
+
137
+ ### `corr` (`correlation`, `corrplot`) · `clustermap`
138
+
139
+ Matriz de correlación de los campos numéricos, que la biblioteca calcula a partir de las filas (casos completos por pares, como `df.corr()`). Cada par aparece una vez, bajo la diagonal, en una escala divergente fija de −1 a 1, así que el mismo color significa la misma intensidad en todos los gráficos. Las etiquetas largas se giran 45°. El tooltip muestra r, n y el valor p.
140
+
141
+ ```js
142
+ plot({ type: 'corr', data, vars: ['income', 'schooling', 'poverty', 'density'], alpha: 0.05,
143
+ title: 'Where schooling is higher, income is higher (r = 0.85) and poverty lower (r = −0.81)' });
144
+ ```
145
+
146
+ | Opción | Significado |
147
+ |---|---|
148
+ | `vars` | Campos a relacionar, en orden. Por defecto: todos los campos numéricos. `y: [...]` también funciona. |
149
+ | `method` | `"pearson"` (por defecto) o `"spearman"` (rangos: relaciones monótonas, robusta ante valores atípicos). |
150
+ | `triangle` | `"lower"` (por defecto) o `"full"`. |
151
+ | `cluster` | Reordena por agrupamiento jerárquico (enlace promedio sobre 1 − r) y dibuja el dendrograma arriba. `type: "clustermap"` lo activa y muestra la matriz completa; `dendrogram: false` mantiene el orden sin el árbol. |
152
+ | `alpha` | Pone en gris los pares con p ≥ alpha (z de Fisher) y agrega una clave a la leyenda. |
153
+ | `order` | Orden de las variables (lista). |
154
+ | `highlight` | Una variable: su fila y su columna se mantienen y el resto se atenúa. |
155
+ | `labelsFor` | Nombres para mostrar, p. ej. `{ areas_verdes: "Green space" }`. |
156
+ | `x`, `y`, `value` | Dibuja una matriz que ya calculaste, en formato largo (una fila por par). |
157
+
158
+ ### `pairplot` (`pairs`, `splom`, `scattermatrix`)
159
+
160
+ Matriz de diagramas de dispersión: cada par como dispersión bajo la diagonal, la distribución de cada variable en la diagonal (histograma, o densidad con `hue`) y la r de Pearson sobre ella, teñida según la intensidad y dividida por grupo de `hue` cuando hay espacio. Los ejes se comparten por columna y por fila; las marcas de los ejes solo van en los bordes exteriores.
161
+
162
+ | Opción | Significado |
163
+ |---|---|
164
+ | `vars` | Campos a graficar (3–6 se leen mejor). Por defecto: los primeros 6 campos numéricos. |
165
+ | `hue` | Color por grupo, con leyenda. |
166
+ | `diag` | `"hist"` o `"kde"`. |
167
+ | `upper` | `"corr"` (por defecto), `"scatter"` o `false`. `corner: true` conserva solo el triángulo inferior. |
168
+ | `kind` | `"reg"` agrega una recta de mínimos cuadrados a cada panel de dispersión. |
169
+ | `radius`, `bins`, `panelSize` | Radio de los puntos, intervalos del histograma, tamaño máximo del panel. |
170
+
171
+ ### `radar` (`spider`)
172
+
173
+ Datos largos (`axis`, `value`, `series`) o anchos (`axes: [fields]`, una fila por serie con `label`). `normalize` escala cada eje a su propio máximo (los tooltips conservan los valores originales); `grid: "polygon" | "circle"`; `domain`. Funciona mejor con ≤ 4 series.
174
+
175
+ ## Distribuciones
176
+
177
+ ### `hist` (`histplot`) · `kde` (`kdeplot`) · `ecdf`
178
+
179
+ | Opción | Significado |
180
+ |---|---|
181
+ | `bins`, `binWidth` | Número o ancho de los intervalos (por defecto: Freedman–Diaconis, redondeado a bordes limpios). |
182
+ | `stat` | `"count"`, `"percent"`, `"density"`, `"probability"`. |
183
+ | `kde` | Superpone una curva de densidad sobre el histograma. |
184
+ | `multiple` | Con `hue`: `"layer"`, `"stack"`, `"dodge"`, `"fill"`. |
185
+ | `element` | `"bars"` o `"step"`. |
186
+ | `cumulative` | Distribución acumulada. |
187
+ | `fill`, `bwAdjust`, `cut`, `clip`, `rug` | Opciones de densidad. |
188
+ | `complementary` | `ecdf`: grafica 1 − F(x). |
189
+
190
+ ### `box` · `violin` · `strip` · `swarm` (`beeswarm`) · `point` (`pointplot`)
191
+
192
+ `x` categoría e `y` medida (intercámbialos, o usa `horizontal`, para la versión horizontal). Las etiquetas largas o muchas categorías cambian a horizontal de forma automática.
193
+
194
+ | Opción | Significado |
195
+ |---|---|
196
+ | `points` | Caja: superpone las observaciones. |
197
+ | `showMeans` | Marca la media. |
198
+ | `inner` | Violín: `"box"` (por defecto), `"quartiles"`, `"points"`, `"none"`. |
199
+ | `split` | Violín con dos niveles de `hue`: una mitad cada uno. |
200
+ | `scale` | Ancho del violín: `"width"`, `"area"`, `"count"`. |
201
+ | `jitter`, `dodge`, `radius` | Disposición de strip y swarm. |
202
+ | `estimator`, `errorbar` | Gráfico de puntos: `"mean"`/`"median"`/`"sum"` y `"ci"`/`"sd"`/`"se"`/`"pi"`. |
203
+ | `order`, `hueOrder` | Orden de las categorías y de los grupos. |
204
+
205
+ ## Partes de un todo
206
+
207
+ ### `treemap` · `sunburst`
208
+
209
+ `path: [level1, level2, …]` de cualquier profundidad (o `group` + `label`), `value`. Las filas con la misma ruta se suman.
210
+
211
+ | Opción | Significado |
212
+ |---|---|
213
+ | `depth` | Muestra solo los primeros N niveles. |
214
+ | `focus` | Ruta a la que entrar, p. ej. `["Mining"]`. En el navegador lo hace un clic en un grupo o en su clave de la leyenda (la categoría llena todo el gráfico), y la ruta de navegación o Esc te devuelven. |
215
+ | `exclude` | Grupos del nivel 1 que se dejan fuera; el resto llena el plano y las proporciones se recalculan. En el navegador lo hace Shift + clic en una clave de la leyenda. |
216
+ | `showValues` | Agrega los valores a las etiquetas. |
217
+ | `colorBy` | `"change"` colorea los rectángulos según el % de cambio respecto del período de comparación (crecimiento en tonos fríos, caída en cálidos); `"label"` colorea por elemento un treemap de un solo nivel. |
218
+ | `shade` | Pasos sutiles de luminosidad dentro de cada categoría. Desactivado por defecto: un color sólido por categoría. |
219
+ | `compareData` | Filas de un período anterior para calcular cambios sin `time`. |
220
+ | `hole`, `centerValue`, `centerLabel` | Centro del sunburst. |
221
+
222
+ Las áreas son exactas: no hay franjas de encabezado que le quiten espacio a un grupo. Las categorías se distinguen por un color sólido, una separación de 4 px entre grupos del nivel 1 (2 px y 1 px en niveles más profundos) y la leyenda, que muestra la proporción de cada grupo. Con `time`, cada rectángulo también muestra su cambio respecto del período anterior (▲ 12%). Los colores pertenecen al grupo del nivel 1 y se calculan sobre el árbol completo y todos los períodos, así que nunca cambian al entrar en un grupo ni al mover el deslizador.
223
+
224
+ ### `pyramid` (`populationpyramid`)
225
+
226
+ Grupos de edad (`age` o `y`), dos lados (`sex`, `series` o `hue`) y un valor. Barras enfrentadas con las edades en la columna central; `percent: true` para proporciones de la población; `compareData`, o `time` + `compare`, dibuja un año anterior como un contorno escalonado.
227
+
228
+ ### `donut` · `pie`
229
+
230
+ `label`, `value`. Más de `maxSlices` (6) se agrupan en "Otros".
231
+
232
+ | Opción | Significado |
233
+ |---|---|
234
+ | `labels` | `"auto"`, `"inside"`, `"outside"` (líneas guía), `"legend"`, `false`. |
235
+ | `half` | Semicírculo. |
236
+ | `thickness` | Grosor del anillo (el pie es `1`). |
237
+ | `sort` | `"desc"` o `"none"`. |
238
+ | `centerValue`, `centerLabel` | Centro de la dona. |
239
+
240
+ ## Mapas
241
+
242
+ ### `choropleth` (`map`) · `symbolmap` (`bubblemap`)
243
+
244
+ Las regiones de Chile (`geo: "chile"`, por defecto), los estados de EE. UU. (`geo: "usa"`) y los países del mundo (`geo: "world"`) vienen con la biblioteca, y **cualquier geometría propia** también funciona (ver abajo). `key` es el campo de los datos que se empareja y `value` la medida; un `value` de texto (un partido, un idioma, una zona) colorea por categoría con una leyenda de muestras de color. El emparejamiento es tolerante: nombres, códigos y alias, sin importar tildes, mayúsculas ni "Región de" ("RM", "Biobio", "XIII", "Aisén", "ARG", "EE.UU.", "TX", "Nueva York", "48").
245
+
246
+ **Estados Unidos.** 50 estados y DC en una proyección cónica equivalente de Albers (`albersUsa`, la misma composición que `d3.geoAlbersUsa`): Alaska (a 0,35×) y Hawái van en recuadros abajo a la izquierda con un marco fino punteado; Puerto Rico recibe su propio recuadro solo cuando los datos lo incluyen (`territories: true` lo fuerza). Cada estado muestra su código postal, más el valor cuando cabe; los estados pequeños del noreste (VT, NH, MA, RI, CT, NJ, DE, MD, DC) se rotulan en una columna a la derecha con líneas guía. `values: false` deja solo los códigos; `labels: false` los quita.
247
+
248
+ | Opción | Significado |
249
+ |---|---|
250
+ | `geo` | `"chile"`, `"usa"`, `"world"`, un nombre registrado con `registerGeo()`, un objeto GeoJSON o TopoJSON, o (en el navegador) una URL. |
251
+ | `featureKey`, `nameKey` | Propiedad de la geometría que se empareja, y la que tiene el nombre para mostrar (ambas se detectan si las omites). |
252
+ | `fitTo` | Amplía a regiones, a una caja `[lonMin, latMin, lonMax, latMax]` o a `"markers"`. |
253
+ | `markers`, `layers` | Puntos por lon/lat encima; líneas, polígonos o puntos GeoJSON adicionales sobre o bajo el mapa. |
254
+ | `scale`, `classes` | `"quantile"` (por defecto), `"equal"`, `"continuous"` o una lista de cortes; 5 clases por defecto. |
255
+ | `midpoint` / `diverging` | Clases divergentes en torno a un valor (p. ej. 0 para cambios). |
256
+ | `missing` | `"plain"` quita el achurado y la entrada "Sin datos" de la leyenda. |
257
+ | `labels`, `bars` | Chile recibe una columna de norte a sur con nombre, barra y valor; `bars: false` oculta las barras. Los mapas del mundo rotulan los N primeros. |
258
+ | `projection` | `"mercator"`, `"equalEarth"`, `"albersUsa"`, `"equirectangular"`, `"conic"`, `"identity"`, `"planar"` o `{ type, parallels, rotate }` (se elige de forma automática). |
259
+ | `borderColor`, `borderWidth` | Bordes de las regiones. |
260
+ | `dashed`, `dashedLabel` | Achura algunas regiones (cifras preliminares, zonas en disputa): nombres, códigos o un campo de los datos. Conservan el color de su clase. |
261
+ | `maxRadius` | `symbolmap`: radio del círculo más grande. |
262
+
263
+ #### Tu propia geometría: GeoJSON y TopoJSON
264
+
265
+ `geo` acepta lo que tengas: un `FeatureCollection` GeoJSON, un solo `Feature`, un arreglo de features o una geometría suelta, o un `Topology` TopoJSON (`geoObject` elige el objeto; por defecto, el primero). Los polígonos se rellenan, las líneas se trazan y los puntos se vuelven círculos coloreados por valor. En el navegador, `render()` también acepta una URL y la descarga una sola vez: `geo: "/maps/comunas.topojson"`. En Node, lee el archivo y pasa el objeto.
266
+
267
+ ```js
268
+ import { readFileSync } from 'node:fs';
269
+ const comunas = JSON.parse(readFileSync('comunas-biobio.geojson', 'utf8'));
270
+ plot({
271
+ type: 'choropleth',
272
+ geo: comunas, // properties: { CUT_COM: "08101", NOM_COM: "Concepción", … }
273
+ data: [{ comuna: 'Concepción', poverty: 7.1 }, { comuna: 'Coronel', poverty: 12.4 }],
274
+ key: 'comuna', value: 'poverty', // NOM_COM is found automatically
275
+ markers: { data: hospitals, lon: 'lon', lat: 'lat', label: 'name', legend: 'Hospital' },
276
+ layers: [{ geo: rivers, label: 'Biobío river', stroke: '#5BA3E0', width: 2 }],
277
+ fitTo: ['Concepción', 'Talcahuano', 'Hualpén'],
278
+ });
279
+ ```
280
+
281
+ - **Emparejamiento sin configuración.** Las filas se emparejan con las claves habituales (código, id, ISO-3, nombre, alias); si algunas filas no calzan, plotagents encuentra la propiedad de la geometría cuyos valores sí calzan (`NOM_COM`, `CUT_REG`, `GEOID`, `ADMIN`…). `featureKey` fuerza una. Los nombres para mostrar salen de `nameKey`, o de la primera de `name`, `NOMBRE`, `NAME_1`, `ADMIN` y similares.
282
+ - **Proyecciones.** Se eligen según la geometría: Mercator para un país o una región, Equal Earth para el mundo y un plano cartesiano simple cuando las coordenadas no son longitudes y latitudes (metros UTM, por ejemplo). Fija `projection` en `"equirectangular"`, `"conic"` (o `{ type: "conic", parallels: [-30, -45], rotate: 72 }`), `"identity"` (coordenadas en píxeles, y hacia abajo, para mapas dibujados a mano o de teselas) o `"planar"` (y hacia arriba).
283
+ - **Encuadre.** `fitTo` amplía a algunas regiones, a una caja `[lonMin, latMin, lonMax, latMax]` o a `"markers"`; el resto del mapa queda recortado como contexto. `tall: false` desactiva la columna lateral para formas alargadas.
284
+ - **Marcadores.** `markers: [{ lon, lat, label, value }]` o `{ data, lon, lat, label, size, color, legend, maxRadius }`: puntos encima, proporcionales al área cuando hay un `size`, con etiquetas ubicadas donde no chocan.
285
+ - **Capas.** `layers: [{ geo, label, stroke, width, fill, dash, opacity, below }]` superpone ríos, caminos, rutas, fallas o límites de distritos (o los dibuja bajo las regiones con `below: true`). Un `label` agrega una clave a la leyenda.
286
+ - **Estilo.** `borderColor`, `borderWidth`, `pointRadius`, `lineWidth`, `ramp` (una rampa secuencial con nombre o propia), `palette` y `colors` (categorías).
287
+ - **Regístrala una vez y úsala por nombre.** `registerGeo('biobio', comunas, ['comunas-biobio'])` y luego `geo: 'biobio'` en cada especificación, lo que mantiene cortas las llamadas a herramientas de un agente.
288
+
289
+ En el navegador (`render()` o `toHTML()`), los mapas son interactivos: al pasar el puntero se remarca la forma; un clic en una región la amplía hasta encuadrarla (vuelve con otro clic, doble clic, Esc o el botón de reinicio); Ctrl/⌘ + rueda amplía en torno al puntero (la rueda sola sigue desplazando la página, como recomienda `chartjs-plugin-zoom` con su `modifierKey`); el gesto de pellizcar amplía en pantallas táctiles; arrastrar desplaza el mapa ampliado; los botones +/− funcionan desde el teclado. Cada clase de color de la leyenda es una clave: pasa el puntero para iluminar sus regiones y haz clic para fijarlas. Con `time`, el color de cada región transita hacia el del período siguiente en vez de saltar, y la ampliación se mantiene mientras se reproduce el deslizador.
290
+
291
+ `lint` advierte sobre filas que no calzan con ninguna región o país. Fuentes: Natural Earth 1:110m (dominio público) para el mundo; Biblioteca del Congreso Nacional para las regiones de Chile (atribución en `src/geo/data/chile-regiones.js`); límites cartográficos 1:10m de la Oficina del Censo de EE. UU. (dominio público) vía us-atlas 3.0.1 para los estados de EE. UU. En el navegador, `dist/plotagents-geo.js` agrega las geometrías; `toHTML()` lo incluye solo cuando una página tiene un mapa.
292
+
293
+ ### `pointmap` (`dotmap`, `tilemap`)
294
+
295
+ Puntos por longitud/latitud sobre un mapa base real en Web Mercator. Los campos `lon`/`lat` se encuentran por nombre (lon, lng, longitude, longitud / lat, latitude, latitud). `size` → área del círculo (clave en la esquina, con el más grande rotulado); `hue` → colores por categoría con leyenda; `value` numérico → rampa secuencial (`midpoint` para divergente, `colorScale` para cualquier mapa de matplotlib). La ampliación y el centro se ajustan a los puntos (`zoom`, `center: [lon, lat]` para fijarlos).
296
+
297
+ ```js
298
+ plot({ type: 'pointmap', data: cities, lon: 'lon', lat: 'lat', size: 'population', label: 'city',
299
+ title: 'Santiago concentrates 40% of the population', source: 'INE' });
300
+ ```
301
+
302
+ | Opción | Significado |
303
+ |---|---|
304
+ | `tiles` | `"osm"` (por defecto, OpenStreetMap), `"esri-gray"`, `"esri-dark"`, `"carto-light"` / `"carto-dark"` (clave gratuita: carto.com/basemaps/apikey), `"mapbox-light"` / `"mapbox-dark"` (token público `pk.` en `tilesKey`; los tokens `sk.` se rechazan), `{ url, attribution, subdomains, maxZoom, retina }` o `false` (solo el contorno vectorial del mundo). |
305
+ | `tilesKey` | Clave o token para CARTO, Mapbox o Esri. |
306
+ | `tileStyle` | `"muted"` (por defecto) desatura las teselas y las tiñe con el tema (un mapa nocturno azul marino en `noche`); `"original"` las deja tal cual. |
307
+ | `tileOpacity`, `zoom`, `center` | Opacidad de las teselas, nivel de ampliación fijo y centro `[lon, lat]`. |
308
+ | `labels`, `labelValues` | Cuántos puntos nombrar (los 8 más grandes por defecto), o una lista; `labelValues: false` oculta los valores. |
309
+
310
+ La atribución siempre se dibuja. Las teselas son imágenes externas: se ven en SVG en línea, `render()` y `toHTML()`, **no** cuando el SVG se usa como `<img>`, se abre desde un conversor a PDF o sin conexión; en esos casos el contorno vectorial del mundo que está debajo sigue dando contexto. `await embedTiles(svg)` las incrusta como URI data: (no para OSM, cuya política de teselas prohíbe las descargas masivas; usa `esri-gray` o tu propio servidor). Para mucho tráfico, usa un proveedor con clave o tus propias teselas: los servidores de OSM son donados.
311
+
312
+ ## Formas discontinuas: estimaciones, proyecciones, cifras provisionales
313
+
314
+ Algunas cifras todavía no son firmes. En vez de un color nuevo (que se lee como una categoría nueva), plotagents mantiene el color de la forma y cambia su textura: un relleno achurado (franjas del color sobre un tono claro del mismo) y un contorno discontinuo con contraste 3:1. Las líneas reciben un trazo discontinuo con puntos huecos. Funciona en `bar`, `line`, `area`, `donut`/`pie`, `choropleth` y `symbolmap`.
315
+
316
+ | Opción | Significado |
317
+ |---|---|
318
+ | `dashed` | Un nombre de categoría, serie o región, o una lista (`["Texas", "Ohio"]`); un campo de los datos cuyas filas verdaderas van discontinuas (`"provisional"`, acepta `true`, `1`, `"sí"`, `"yes"`, `"x"`); `{ field, equals }`; o `true` para todo. |
319
+ | `dashedFrom` | En un eje de tiempo (`line`, `area`, `bar`): el primer x proyectado. La línea pasa a discontinua desde el último punto firme, los puntos proyectados son huecos, las áreas apiladas se achuran con el color de cada serie y una banda suave con `dashedLabel` marca el tramo. |
320
+ | `dashedLabel` | Qué significa: "Proyección", "Preliminar", "Estimación". Es la entrada de la leyenda (pasa el puntero para iluminar solo las formas discontinuas), la etiqueta de la banda y una línea en el tooltip. Por defecto es "Estimado"/"Estimate"; `lint` sugiere fijarlo. |
321
+
322
+ Esto sigue el consejo de Chart.js de usar patrones (como hace `patternomaly`) y `segment.borderDash` para los tramos proyectados, de modo que la distinción nunca depende solo del color.
323
+
324
+ ## Redes y flujos
325
+
326
+ ### `network` (`graph`)
327
+
328
+ Aristas en `data` (`from`, `to`, `value` opcional), `nodes` opcionales con `id`, `group` y `size`. Área del nodo ∝ peso (grado ponderado por defecto), color por grupo; las aristas se curvan con el color de su nodo de origen (`curveness`, por defecto 0.3; `0` = rectas) y miden 1 px de ancho sin un campo de valor. Los nodos más grandes llevan su nombre (tinta con halo, sin chocar entre sí ni con un nodo); todos los nombres están en el tooltip. Al pasar el puntero sobre un nodo se iluminan sus vecinos y sus aristas.
329
+
330
+ `layout` elige la disposición (todas deterministas, todas ajustadas al área):
331
+
332
+ | `layout` | Disposición |
333
+ |---|---|
334
+ | `force` (por defecto) | Dirigida por fuerzas (Barnes–Hut sobre 150 nodos). |
335
+ | `circular` (`circle`) | En torno a un círculo por grupo, con un espacio entre grupos y los nombres rotados hacia afuera. |
336
+ | `radial` | Un árbol desde `focus` (o el nodo más conectado); cada anillo es un paso más lejos. Los enlaces fuera del árbol son tenues. |
337
+ | `concentric` | Anillos por peso, el más grande al centro, por grupo dentro de cada anillo. |
338
+ | `clusters` | Un grupo en forma de girasol por grupo, con espacio ∝ √tamaño. |
339
+ | `tree` | El árbol radial extendido en plano (de izquierda → derecha en áreas anchas), con conectores en forma de S. |
340
+ | `grid` | Una cuadrícula ordenada por grupo y peso, con todos los nodos nombrados. |
341
+
342
+ `labels` (número, lista o `true`), `highlight` (un nodo y sus vecinos), `focus` (el id de un nodo: va al centro, o a la raíz en `radial`/`tree`, y se destaca con sus vecinos, todos rotulados; en el navegador lo hace un clic con una transición suave, y un segundo clic o Esc vuelve), `iterations`, `maxRadius`, `curveness`.
343
+
344
+ ### `chord`
345
+
346
+ Filas `from`, `to`, `value`, o `matrix` + `names`. `directed` (por defecto false), `sort`, `ribbonColor: "smaller" | "larger" | "source"`, `labelOrientation: "radial"`.
347
+
348
+ ### `flowchart` (`flow`, `diagram`)
349
+
350
+ `nodes` con `id`, `label`, `type` (`start`, `end`, `process`, `decision`, `data`, `note`), `lane` opcional (carriles) y `group`; `edges` (o `data`) con `from`, `to` y un `label` opcional ("Sí"/"No"). Diseño por capas con dirección automática (`direction: "TB" | "LR"`), conectores ortogonales con flechas y bucles que rodean por el costado. `nodeWidth`, `swimlanes: false`.
351
+
352
+ ## Cuadrículas, flujos y números
353
+
354
+ ### `heatmap`
355
+
356
+ Categorías `x`, `y` y `value`. Rampa secuencial por defecto; `midpoint` (o `diverging: true`) para una rampa divergente. Los valores se escriben en las celdas cuando caben.
357
+
358
+ ### `sankey`
359
+
360
+ `from`, `to`, `value` (también detecta `source`/`target`). El color parte en la primera etapa con más de un nodo y fluye aguas abajo.
361
+
362
+ ### `wordcloud` (`words`, `tagcloud`, `nube`)
363
+
364
+ Palabras con tamaño según su frecuencia, hechas con cuidado: todas horizontales; el **área** de cada palabra es proporcional a su conteo (el tamaño de la letra crece con la raíz cuadrada); una disposición en espiral determinista desde la palabra más frecuente hacia afuera, sin choques; un solo tono que se oscurece con la frecuencia, o un color por `series` con leyenda. Si las palabras importantes no caben, toda la nube se achica; las palabras que aun así no caben se nombran en el texto alternativo, nunca se cortan.
365
+
366
+ ```js
367
+ plot({ type: 'wordcloud', data, text: 'word', value: 'mentions', title: '“Data” dominates what companies ask for' });
368
+ plot({ type: 'wordcloud', text: openAnswers, title: '…', subtitle: 'Mentions in 312 open answers' }); // raw text
369
+ ```
370
+
371
+ | Opción | Significado |
372
+ |---|---|
373
+ | `text` | Campo con las palabras, o el texto en bruto que se cuenta (un string o una lista de strings). El texto en bruto descarta las palabras vacías en español e inglés y los números. |
374
+ | `textField` | Un campo de texto libre en cada fila (respuestas abiertas de encuestas): las palabras se cuentan entre todas las filas. |
375
+ | `value` | Peso de cada palabra (por defecto: 1 por fila, sumado). |
376
+ | `series` | Color por grupo, con leyenda. |
377
+ | `top` | Máximo de palabras a mostrar (por defecto 80). |
378
+ | `stopwords`, `minLength` | Palabras adicionales a ignorar; largo mínimo de palabra que se conserva (por defecto 3). |
379
+ | `minFont`, `maxFont` | Rango de tamaños de letra. |
380
+ | `highlight` | Palabras a destacar; el resto se atenúa. |
381
+
382
+ Una nube sirve para "qué aparece más" y no para "por cuánto". `lint` sugiere un gráfico de barras (`top: 15`) cuando hay pocas palabras y pide un `subtitle` que diga qué se contó.
383
+
384
+ ### `kpi`
385
+
386
+ `items: [{ label, value, delta, previous, period, good: "up" | "down", trend: [...], target, format }]`. El delta es una fracción (`0.12` → +12%); `good: "down"` para costos. Las tarjetas se reacomodan en filas equilibradas.
387
+
388
+ ## Tablas
389
+
390
+ ### `table` (`tabla`, `datatable`)
391
+
392
+ Para cuando quien lee necesita buscar el número exacto. Líneas finas entre filas y nada más; números alineados a la derecha en cifras tabulares con los mismos decimales en toda la columna; celdas vacías como un guion. Cada columna recibe el indicador que la explica.
393
+
394
+ ```js
395
+ plot({
396
+ type: 'table',
397
+ title: 'Two of six projects are already over budget',
398
+ data: projects,
399
+ columns: ['project', 'area',
400
+ { field: 'progress', type: 'progress' },
401
+ { field: 'spent', label: 'Spent / budget', type: 'progress', target: 'budget', good: 'down' },
402
+ 'status'],
403
+ sortBy: 'progress',
404
+ });
405
+ ```
406
+
407
+ | `type` de columna | Dibuja | Se infiere cuando |
408
+ |---|---|---|
409
+ | `bar` | Valor + barra de datos en una escala compartida (divergente en torno a 0) | Es la columna numérica principal (`value`/`y`, o el primer número); `bars: false` la desactiva |
410
+ | `delta` | ▲ / ▼ + cambio con signo, en verde o rojo según `good` (`"down"` para costos) | El campo se llama var, change, delta, growth, yoy, cambio, variación… |
411
+ | `heat` | Celda teñida con una escala secuencial (divergente cuando cruza el 0); `colorScale` por columna | No se infiere |
412
+ | `sparkline` | Minilínea, con el último punto en el color de acento | El campo contiene listas de números |
413
+ | `progress` | Porcentaje + medidor; contra `target` (campo o número) o como 0–1 / 0–100 | El campo se llama progress, avance, completion…, o meta/target/goal con fracciones |
414
+ | `badge` | Píldora de estado | Los valores son palabras de estado (done, at risk, late, in progress… en es/en/pt/fr/de): colores de bien, advertencia, crítico e información |
415
+ | `check` | ✓ o un guion, con una etiqueta accesible | Booleanos, o sí/no, yes/no… |
416
+ | `date` | Fecha legible en el idioma del gráfico | Fechas ISO |
417
+ | `link` | Enlace subrayado; solo `http(s)` y `mailto` reciben un `href` | URLs |
418
+ | `rank` | Posición según el orden actual | `rank: true` |
419
+ | `text`, `number` | Texto (se divide en 2–3 líneas) y números simples | Todo lo demás |
420
+
421
+ | Opción | Significado |
422
+ |---|---|
423
+ | `columns` | Orden y tipo: nombres de campo o `{ field, label, type, format, align, width, good, target, colorScale, total, lines }`. Omítelo para usar todos los campos. `x`/`label` elige la columna con el nombre de la fila e `y` una lista de columnas de valores. |
424
+ | `sortBy`, `sort` | Columna y dirección (`"desc"` para números, `"asc"` para texto por defecto). `sort: "-sales"` también funciona. Las celdas vacías siempre van al final. |
425
+ | `pageSize`, `page` | Hasta 15 filas se muestran completas; sobre eso, páginas de 10. `pageSize: false` muestra todo. El paginador son solo números y flechas (`11–20 / 248`, `‹ 1 2 3 … 25 ›`). |
426
+ | `query` | Conserva las filas que contienen esas palabras, sin importar tildes ni mayúsculas. |
427
+ | `total` | Fila de totales: suma los números, promedia porcentajes y avances, y deja en blanco los cambios. `{ sales: "mean" }` por columna; `totalLabel` le cambia el nombre. |
428
+ | `group` | Filas bajo una franja teñida por valor, con un conteo. |
429
+ | `highlight` | Las filas cuyo nombre coincide reciben un tinte y una marca de acento; las barras de las demás filas se atenúan. |
430
+ | `top` | Conserva las primeras N filas tras ordenar. |
431
+ | `cards` | `"auto"` (por defecto) convierte cada fila en una tarjeta cuando las columnas no caben (teléfonos): nombre y valor principal arriba, la barra debajo y las demás columnas como líneas etiqueta–valor. `true` siempre, `false` nunca. |
432
+ | `density`, `striped` | Filas `"compact"` / `"comfortable"`; franjas tipo cebra para tablas muy anchas. |
433
+
434
+ En el navegador, `render()` agrega un cuadro de búsqueda sobre 20 filas (`search: false` lo oculta; `true` lo fuerza), encabezados que ordenan con un clic (orden natural, invertido y luego el orden original) y botones de página; todos funcionan desde el teclado y anuncian `aria-sort` y `aria-current`. Al cambiar el tamaño se vuelve a dibujar con el nuevo ancho, así que una tabla se vuelve tarjetas en un teléfono y columnas otra vez en un computador.
435
+
436
+ El idioma de las pocas palabras que escribe una tabla (Total, Buscar, Sin resultados) y el formato de los números vienen de `locale`; sin él, la tabla reconoce el idioma a partir de su propio título, encabezados y categorías.