Chart Line
ChartUna línea. No fuerza el cero en el eje: forzarlo aplastaría la señal contra el techo.
Línea simple
Con curve="monotone" la curva no inventa extremos: nunca dibuja un máximo entre dos puntos donde no hay ningún dato.
| 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" label="Ingresos" curve="monotone" dots />
<x-kore::chart.axis-y format="compact" />
<x-kore::chart.axis-x />
<x-kore::chart.tooltip />
</x-kore::chart><x-kore::chart :data="$ventas" x="mes">
<x-kore::chart.line y="ingresos" label="Ingresos" curve="monotone" dots />
<x-kore::chart.axis-y format="compact" />
<x-kore::chart.axis-x />
<x-kore::chart.tooltip />
</x-kore::chart>Varias series
Cada marca line es una serie independiente, con su propio color de la paleta y su propia entrada en la leyenda.
| Categoría | Ingresos | Gastos |
|---|---|---|
| Ene | 1.240 € | 800 € |
| Feb | 3.180 € | 1.500 € |
| Mar | 2.470 € | 1.100 € |
| Abr | 4.910 € | 2.200 € |
| May | 4.300 € | 1.900 € |
| Jun | 6.120 € | 2.600 € |
<x-kore::chart :data="$ventas" x="mes">
<x-kore::chart.line y="ingresos" label="Ingresos" curve="monotone" />
<x-kore::chart.line y="gastos" label="Gastos" curve="monotone" />
<x-kore::chart.axis-y :ticks="5" format="currency" />
<x-kore::chart.axis-x />
<x-kore::chart.legend />
<x-kore::chart.tooltip />
</x-kore::chart><x-kore::chart :data="$ventas" x="mes">
<x-kore::chart.line y="ingresos" label="Ingresos" curve="monotone" />
<x-kore::chart.line y="gastos" label="Gastos" curve="monotone" />
<x-kore::chart.axis-y :ticks="5" format="currency" />
<x-kore::chart.axis-x />
<x-kore::chart.legend />
<x-kore::chart.tooltip />
</x-kore::chart>Curvas
Tres formas de interpolar entre puntos: linear, monotone y step. Fíjate en el pico: monotone lo suaviza sin salirse nunca del rango de los dos puntos que lo rodean.
Linear
| Categoría | valor |
|---|---|
| A | 20 |
| B | 90 |
| C | 30 |
| D | 70 |
| E | 40 |
Monotone
| Categoría | valor |
|---|---|
| A | 20 |
| B | 90 |
| C | 30 |
| D | 70 |
| E | 40 |
Step
| Categoría | valor |
|---|---|
| A | 20 |
| B | 90 |
| C | 30 |
| D | 70 |
| E | 40 |
<x-kore::chart :data="$datos" x="punto" height="10rem">
<x-kore::chart.line y="valor" curve="linear" dots />
<x-kore::chart.axis-y :ticks="3" />
<x-kore::chart.axis-x />
</x-kore::chart>
<x-kore::chart :data="$datos" x="punto" height="10rem">
<x-kore::chart.line y="valor" curve="monotone" dots />
<x-kore::chart.axis-y :ticks="3" />
<x-kore::chart.axis-x />
</x-kore::chart>
<x-kore::chart :data="$datos" x="punto" height="10rem">
<x-kore::chart.line y="valor" curve="step" dots />
<x-kore::chart.axis-y :ticks="3" />
<x-kore::chart.axis-x />
</x-kore::chart><x-kore::chart :data="$datos" x="punto" height="10rem">
<x-kore::chart.line y="valor" curve="linear" dots />
<x-kore::chart.axis-y :ticks="3" />
<x-kore::chart.axis-x />
</x-kore::chart>
<x-kore::chart :data="$datos" x="punto" height="10rem">
<x-kore::chart.line y="valor" curve="monotone" dots />
<x-kore::chart.axis-y :ticks="3" />
<x-kore::chart.axis-x />
</x-kore::chart>
<x-kore::chart :data="$datos" x="punto" height="10rem">
<x-kore::chart.line y="valor" curve="step" dots />
<x-kore::chart.axis-y :ticks="3" />
<x-kore::chart.axis-x />
</x-kore::chart>Puntos
Con dots se pinta un punto por dato. Es un div por punto: con 10.000 puntos el HTML pesa 1,4 MB. Sin ellos, el trazo es un solo nodo y el número de datos no importa.
Sin dots
| Categoría | ingresos |
|---|---|
| Ene | 1.240 |
| Feb | 3.180 |
| Mar | 2.470 |
| Abr | 4.910 |
Con dots
| Categoría | ingresos |
|---|---|
| Ene | 1.240 |
| Feb | 3.180 |
| Mar | 2.470 |
| Abr | 4.910 |
{{-- Sin puntos: un solo nodo, da igual cuántos datos haya --}}
<x-kore::chart.line y="ingresos" curve="monotone" />
{{-- Con puntos: un div por dato --}}
<x-kore::chart.line y="ingresos" curve="monotone" dots />{{-- Sin puntos: un solo nodo, da igual cuántos datos haya --}}
<x-kore::chart.line y="ingresos" curve="monotone" />
{{-- Con puntos: un div por dato --}}
<x-kore::chart.line y="ingresos" curve="monotone" dots />Huecos en los datos
Un valor null no es un cero: es «no hay dato». La línea se corta ahí, en vez de dibujar una caída al suelo que nunca ocurrió.
| Categoría | Sensor |
|---|---|
| Ene | 21,4 |
| Feb | 23,1 |
| Mar | — |
| Abr | — |
| May | 25,8 |
| Jun | 24,2 |
<x-kore::chart :data="$conHuecos" x="mes">
<x-kore::chart.line y="sensor" label="Sensor" curve="monotone" dots />
<x-kore::chart.axis-y :ticks="4" />
<x-kore::chart.axis-x />
<x-kore::chart.tooltip />
</x-kore::chart>
{{-- El sensor se cayó en marzo y abril --}}
$conHuecos = [
['mes' => 'Mar', 'sensor' => null],
['mes' => 'Abr', 'sensor' => null],
];<x-kore::chart :data="$conHuecos" x="mes">
<x-kore::chart.line y="sensor" label="Sensor" curve="monotone" dots />
<x-kore::chart.axis-y :ticks="4" />
<x-kore::chart.axis-x />
<x-kore::chart.tooltip />
</x-kore::chart>
{{-- El sensor se cayó en marzo y abril --}}
$conHuecos = [
['mes' => 'Mar', 'sensor' => null],
['mes' => 'Abr', 'sensor' => null],
];Distancia máxima entre puntos
max-gap corta el trazo cuando dos puntos consecutivos están más lejos de lo que permite, en vez de dibujar una curva suave sobre un hueco que nadie midió. Sólo tiene sentido en un eje temporal continuo.
| Categoría | Temperatura |
|---|---|
| 1 feb. 2026 | 21,4 |
| 2 feb. 2026 | 22,1 |
| 6 feb. 2026 | 19,8 |
| 7 feb. 2026 | 20,3 |
| 8 feb. 2026 | 21,9 |
max-gap acepta «30s», «5m», «2h», «7d», «1w», o un número en las unidades del eje. Sin él, el trazo cruza cualquier hueco con una curva que nadie midió.
<x-kore::chart :data="$sensor" x="medido_en">
<x-kore::chart.line y="temp" label="Temperatura" curve="monotone" dots max-gap="2d" />
<x-kore::chart.axis-y :ticks="4" />
<x-kore::chart.axis-x />
<x-kore::chart.tooltip />
</x-kore::chart>
{{-- El sensor midió a diario, pero del 3 al 5 de febrero no hay filas: son dos días de hueco --}}
$sensor = [
['medido_en' => Carbon::parse('2026-02-01'), 'temp' => 21.4],
['medido_en' => Carbon::parse('2026-02-02'), 'temp' => 22.1],
['medido_en' => Carbon::parse('2026-02-06'), 'temp' => 19.8],
['medido_en' => Carbon::parse('2026-02-07'), 'temp' => 20.3],
['medido_en' => Carbon::parse('2026-02-08'), 'temp' => 21.9],
];<x-kore::chart :data="$sensor" x="medido_en">
<x-kore::chart.line y="temp" label="Temperatura" curve="monotone" dots max-gap="2d" />
<x-kore::chart.axis-y :ticks="4" />
<x-kore::chart.axis-x />
<x-kore::chart.tooltip />
</x-kore::chart>
{{-- El sensor midió a diario, pero del 3 al 5 de febrero no hay filas: son dos días de hueco --}}
$sensor = [
['medido_en' => Carbon::parse('2026-02-01'), 'temp' => 21.4],
['medido_en' => Carbon::parse('2026-02-02'), 'temp' => 22.1],
['medido_en' => Carbon::parse('2026-02-06'), 'temp' => 19.8],
['medido_en' => Carbon::parse('2026-02-07'), 'temp' => 20.3],
['medido_en' => Carbon::parse('2026-02-08'), 'temp' => 21.9],
];Props
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
y
|
string | — | La clave del valor en cada fila |
label
|
string | null | El nombre de la serie. Sin él, se usa y |
color
|
string | null | Un token (destructive, success…) o un color CSS. Por defecto, el de la paleta |
curve
|
string | linear | linear, monotone o step |
dots
|
bool | false | Pintar un punto por dato |
maxGap
|
string|int | null | Distancia máxima entre dos puntos antes de que el trazo se parta. Atributo max-gap. Sólo en eje continuo |
show
|
bool | true | show=false la oculta pero le reserva su color de la paleta |