Ejes y rejilla
ChartCuántos ticks salen y cómo se escriben los números («axis-y»); de qué están hechas las categorías del eje X y la rejilla de fondo («axis-x» y la prop «grid» del gráfico). Elegir mal la escala del eje X cambia lo que el gráfico dice.
Uso básico
Un eje Y con 5 ticks formateados en euros, y un eje X de categorías: band es lo que sale por defecto cuando el dato no trae fechas.
| Categoría | Ingresos |
|---|---|
| Ene | 1.240 € |
| Feb | 3.180 € |
| Mar | 2.470 € |
| Abr | 4.910 € |
| May | 4.300 € |
| Jun | 6.120 € |
<x-kore::chart :data="$ventas" x="mes" aria-label="Ingresos mensuales">
<x-kore::chart.line y="ingresos" label="Ingresos" curve="monotone" />
<x-kore::chart.axis-y :ticks="5" format="currency" />
<x-kore::chart.axis-x />
</x-kore::chart><x-kore::chart :data="$ventas" x="mes" aria-label="Ingresos mensuales">
<x-kore::chart.line y="ingresos" label="Ingresos" curve="monotone" />
<x-kore::chart.axis-y :ticks="5" format="currency" />
<x-kore::chart.axis-x />
</x-kore::chart>Formato del eje Y
format acepta number (el default), currency, percent y compact. El número que hay detrás no cambia: solo cómo se escribe.
format="number" (default)
| Categoría | ingresos |
|---|---|
| Ene | 1.240 |
| Feb | 3.180 |
| Mar | 2.470 |
| Abr | 4.910 |
| May | 4.300 |
| Jun | 6.120 |
format="currency"
| Categoría | ingresos |
|---|---|
| Ene | 1.240 € |
| Feb | 3.180 € |
| Mar | 2.470 € |
| Abr | 4.910 € |
| May | 4.300 € |
| Jun | 6.120 € |
format="percent"
| Categoría | tasa |
|---|---|
| Ene | 12,4 % |
| Feb | 18,1 % |
| Mar | 15,7 % |
| Abr | 22,3 % |
format="compact"
| Categoría | total |
|---|---|
| Ene | 128k |
| Feb | 184k |
| Mar | 157k |
| Abr | 203k |
<x-kore::chart.axis-y format="number" />
<x-kore::chart.axis-y format="currency" />
<x-kore::chart.axis-y format="percent" />
<x-kore::chart.axis-y format="compact" /><x-kore::chart.axis-y format="number" />
<x-kore::chart.axis-y format="currency" />
<x-kore::chart.axis-y format="percent" />
<x-kore::chart.axis-y format="compact" />Dominio fijo con min y max
Sin min/max, el dominio se deduce del dato y se reajusta cada vez que cambian los valores. Con ellos fijo, el rango queda clavado — imprescindible en un gráfico que se actualiza solo: un eje que se reescala cada dos segundos porque el dato subió un punto es ilegible, porque lo que parece moverse es el eje, no la línea.
Autoescala (sin min/max)
| Categoría | Conversión |
|---|---|
| Ene | 12,4 % |
| Feb | 18,1 % |
| Mar | 15,7 % |
| Abr | 22,3 % |
Dominio fijo (min=0 max=100)
| Categoría | Conversión |
|---|---|
| Ene | 12,4 % |
| Feb | 18,1 % |
| Mar | 15,7 % |
| Abr | 22,3 % |
Contrato, no pista: a diferencia de ticks, min/max no se redondean por debajo de lo que pides. Es el único par de props del eje Y que es una promesa exacta.
{{-- Autoescala: el dominio sale del mínimo y el máximo del dato (aprox. 12-22) --}}
<x-kore::chart.axis-y format="percent" />
{{-- Dominio fijo: un porcentaje va de 0 a 100 y punto --}}
<x-kore::chart.axis-y format="percent" :min="0" :max="100" />{{-- Autoescala: el dominio sale del mínimo y el máximo del dato (aprox. 12-22) --}}
<x-kore::chart.axis-y format="percent" />
{{-- Dominio fijo: un porcentaje va de 0 a 100 y punto --}}
<x-kore::chart.axis-y format="percent" :min="0" :max="100" />Categorías y números en el eje X
La misma serie, con la misma columna X (0, 5, 12, 20, 33). A la izquierda, band (el default): los cinco puntos quedan igual de separados, aunque sus valores no lo estén. A la derecha, scale="linear": el hueco entre 20 y 33 se ve más ancho que el hueco entre 5 y 12, porque lo es.
band (default)
| Categoría | Valor |
|---|---|
| 0 | 12 |
| 5 | 18 |
| 12 | 15 |
| 20 | 27 |
| 33 | 24 |
scale="linear"
| Categoría | Valor |
|---|---|
| 0 | 12 |
| 5 | 18 |
| 12 | 15 |
| 20 | 27 |
| 33 | 24 |
auto nunca promociona a linear por su cuenta. Unos años escritos como enteros (2022, 2023, 2024) son categorías, no una recta numérica: colocarlos en una escala lineal le cambiaría el gráfico a quien no ha pedido nada. Si quieres linear, hay que escribirlo.
{{-- band (default): cada fila en su banda, equiespaciada --}}
<x-kore::chart.axis-x />
{{-- linear: cada punto en su posición numérica real --}}
<x-kore::chart.axis-x scale="linear" />{{-- band (default): cada fila en su banda, equiespaciada --}}
<x-kore::chart.axis-x />
{{-- linear: cada punto en su posición numérica real --}}
<x-kore::chart.axis-x scale="linear" />La rejilla
La rejilla son las líneas horizontales a la altura de los ticks del eje Y. Es del gráfico entero, no de un eje: se apaga con :grid="false" en <x-kore::chart>, no en axis-y.
grid (default)
| Categoría | Ingresos |
|---|---|
| Ene | 1,2k |
| Feb | 3,2k |
| Mar | 2,5k |
| Abr | 4,9k |
| May | 4,3k |
| Jun | 6,1k |
:grid="false"
| Categoría | Ingresos |
|---|---|
| Ene | 1,2k |
| Feb | 3,2k |
| Mar | 2,5k |
| Abr | 4,9k |
| May | 4,3k |
| Jun | 6,1k |
<x-kore::chart :data="$ventas" x="mes">
<x-kore::chart.line y="ingresos" curve="monotone" />
<x-kore::chart.axis-y :ticks="4" format="compact" />
<x-kore::chart.axis-x />
</x-kore::chart>
{{-- Sin rejilla: la prop vive en el gráfico, no en axis-y --}}
<x-kore::chart :data="$ventas" x="mes" :grid="false">
<x-kore::chart.line y="ingresos" curve="monotone" />
<x-kore::chart.axis-y :ticks="4" format="compact" />
<x-kore::chart.axis-x />
</x-kore::chart><x-kore::chart :data="$ventas" x="mes">
<x-kore::chart.line y="ingresos" curve="monotone" />
<x-kore::chart.axis-y :ticks="4" format="compact" />
<x-kore::chart.axis-x />
</x-kore::chart>
{{-- Sin rejilla: la prop vive en el gráfico, no en axis-y --}}
<x-kore::chart :data="$ventas" x="mes" :grid="false">
<x-kore::chart.line y="ingresos" curve="monotone" />
<x-kore::chart.axis-y :ticks="4" format="compact" />
<x-kore::chart.axis-x />
</x-kore::chart>Cuántos ticks pide cada escala
ticks y max-labels no son lo mismo, y confundirlos sale caro.
En una escala de bandas (categorías), max-labels es un tope: hay N categorías y se pintan como mucho ésas, saltando el resto — nunca rotadas, porque una etiqueta girada no ocupa sitio en el layout y se saldría de la caja.
En una escala continua (fechas o números con linear), ticks es un objetivo: no hay categorías que saltar, hay ticks que elegir. Pedir doce para un rango de una semana da uno cada doce horas, y se pisan unos con otros. Por eso el defecto de una escala continua es más bajo (6 en el eje X, 5 en el eje Y).
ticks es una pista, no un contrato. Si pides 5, te pueden salir 7. Es deliberado: el algoritmo prioriza que los valores sean redondos (1.000, 2.000, 3.000) sobre que sean exactamente los que pediste — un eje que dice «1.224» está roto, y ningún algoritmo puede darte las dos cosas a la vez. Es el mismo algoritmo que usa d3, y da exactamente los mismos ticks.
Nunca dos ejes Y
Una regla de diseño que el componente impone, no sugiere.
Si quieres comparar dos medidas de escalas distintas, son dos gráficos, no uno con dos escalas. Un doble eje Y permite dibujar cualquier correlación con solo elegir bien las dos escalas — por eso es el error más frecuente y más grave de la visualización de datos. <x-kore::chart.axis-y> solo se registra una vez por gráfico: no hay una prop side="right" ni una segunda instancia posible.
Props de axis-y
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
ticks
|
int | 5 | Cuántos ticks buscar, como PISTA — ver arriba |
format
|
string | number | number, currency, percent o compact |
min
|
float|null | null | Fija el mínimo del dominio. Es un CONTRATO, no se redondea por debajo |
max
|
float|null | null | Fija el máximo del dominio. Igual de estricto que min |
show
|
bool | true | show=false apaga el eje y su canaleta deja de reservar ancho |
Props de axis-x
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
scale
|
string | auto | auto, band (categorías), time (fechas) o linear (números) |
timezone
|
string|null | la del dato | Con qué zona horaria se lee la fecha. Ver la página de eje temporal |
ticks
|
int | 6 | OBJETIVO de ticks en una escala CONTINUA (time o linear). Pista, no contrato |
max-labels
|
int | 12 | TOPE de etiquetas en una escala de BANDAS; el resto se saltan |
show
|
bool | true | show=false apaga el eje y su canaleta deja de reservar ancho |