Cuándo usar line
Line es la elección correcta cuando el eje x está ordenado y la pregunta es sobre trend — típicamente una series de tiempo (revenue diario, orders mensuales, errores por hora) o cualquier otra categoría naturalmente ordenada. El mismo renderer cubre tres shapes:
- Single line — un measure ploteado a través del eje x. El default.
- Dual-axis — dos measures en escalas distintas compartiendo un chart. Agregá
mapping.y2; el segundo measure renderiza contra un eje y derecho. - Multi-series — una line por valor de categoría, todas compartiendo el mismo eje y. Agregá
mapping.seriescon el field categórico.
y2 y series son mutuamente excluyentes en intención: dual-axis es para dos measures en el mismo x; multi-series es para un measure partido por una categoría. No los combines en una viz.
Usá bar en su lugar cuando el eje x no está ordenado y la pregunta es sobre comparación. Usá scatter cuando la relación es entre dos measures continuos en vez de un measure a través de un eje ordenado.
Mapping
mapping.x— requerido. El field del eje ordenado (fecha, mes, entero, categoría ordinal).mapping.y— requerido. Field numérico para los valores del eje y (izquierdo).mapping.y2— opcional. Field numérico. Cuando está presente, el chart cambia a modo dual-axis.mapping.series— opcional. Field categórico. Cuando está presente, el chart cambia a modo multi-series.mapping.series_label— label de legend / tooltip para la series primaria y. Default"value".mapping.series_label_2— label de legend / tooltip para la series y2 en modo dual-axis. Default"y2".
# single line
mapping:
x: order_month
y: revenue
series_label: Revenue
# dual-axis
mapping:
x: order_month
y: revenue
y2: order_count
series_label: Revenue
series_label_2: Orders
# multi-series (una line por channel)
mapping:
x: order_month
y: revenue
series: channel
Shortcuts de chart
El bloque chart es tipado y cerrado — cualquier cosa no listada en esta página se rechaza en tiempo de validación.
chart.show_value_labels— boolean. Prende labels de data-point para cada series. Estilizalos conchart.value_labelabajo.chart.cross_filter— boolean, defaulttrue. Seteáfalsepara suprimir click-to-filter en esta viz.chart.height— altura en pixels del container de la viz.
Line expone intencionalmente una superficie chica de opciones — la mayoría de las decisiones de styling se toman del theme de la plataforma. La customización a nivel series va por mapping, no por chart.
Value labels
chart.value_label es un objeto aplicado a cada series cuando chart.show_value_labels está prendido:
position— placement del label relativo al punto. Valores comunes:"top","bottom","right","insideTop","insideBottom".rotate— grados, entre -90 y 90.color,font_size,font_weight.formatter— template string (sin callbacks). Usá{c}para el valor.distance,align,vertical_align,clip.
Los value labels en una line son ruidosos para series densas; considerá mostrarlos solo en el último punto post-procesando los datos, o confiá en el tooltip hover en su lugar.
Legend & tooltip
chart.legend:
show— boolean.position— shortcut:"top","bottom","left","right","top-left","top-right","bottom-left","bottom-right".orient—"horizontal"|"vertical".top/bottom/left/right— número de pixels o string de porcentaje.text_style—color,font_style,font_weight,font_family,font_size,line_height.item_width,item_height,item_gap.
chart.tooltip:
show— boolean.trigger—"item","axis"(recomendado para line — muestra todas las series en la x hovereada), o"none".confine,formatter,background_color,border_color,border_width,padding,text_style.axis_pointer.type—"line"(recomendado para line),"shadow","none","cross".
Ejes
chart.x_axis y chart.y_axis comparten el mismo shape (con un extra en x_axis):
name— título del eje.name_location—"start"|"middle"|"center"|"end".name_gap— pixels entre línea de eje y nombre.axis_label.show— boolean.axis_label.rotate— grados, -90 a 90.axis_label.interval— entero o"auto".axis_label.color,axis_label.font_size,axis_label.font_weight.axis_label.formatter— template string.axis_label.max_chars— entero ≥ 1, elipsiza labels largos.x_axis.visible_window— entero ≥ 1. Restringe el rango visible y habilita un range slider horizontal; útil para series de tiempo largas.
format
format.yoformat[<y_field_name>]— pattern para labels del eje y izquierdo y valores de tooltip.format.y2oformat[<y2_field_name>]— pattern para el eje y derecho (modo dual-axis).formaten root — fallback.
format:
revenue: "$#,##0"
order_count: "#,##0"
Comportamiento de cross-filter
Dentro de un dashboard, clickear una line cross-filtra el resto del dashboard. Mecanismo completo en Cross-filtering. Específicos de line:
- En modo single / dual-axis, clickear un punto cross-filtra por el valor x clickeado.
- En modo multi-series, clickear una line cross-filtra por el nombre de la series.
- El field clickeado tiene que estar declarado como parámetro en al menos un model usado por el dashboard, si no el click se ignora silenciosamente.
- Deshabilitá por viz con
chart.cross_filter: false.
Ejemplos trabajados
Single line, con un axis label rotado para períodos mensuales:
id: ec_revenue_over_time_line
title: Revenue Over Time
query: "models/ec_revenue.malloy::over_time"
type: line
mapping:
x: order_month
y: revenue
series_label: Revenue
chart:
height: 320
x_axis:
axis_label:
rotate: -30
y_axis:
name: Revenue
tooltip:
trigger: axis
axis_pointer:
type: line
format:
revenue: "$#,##0"
published: true
Dual-axis (revenue a la izquierda, order count a la derecha):
id: ec_revenue_orders_line
title: Revenue and Orders
query: "models/ec_revenue.malloy::over_time"
type: line
mapping:
x: order_month
y: revenue
y2: order_count
series_label: Revenue
series_label_2: Orders
chart:
height: 320
legend:
show: true
position: top
format:
revenue: "$#,##0"
order_count: "#,##0"
published: true
Multi-series (una line por channel):
id: ec_revenue_by_channel_line
title: Revenue by Channel
query: "models/ec_revenue.malloy::by_channel_over_time"
type: line
mapping:
x: order_month
y: revenue
series: channel
chart:
legend:
show: true
position: top
tooltip:
trigger: axis
format:
revenue: "$#,##0"
published: true
Series de tiempo larga con un data-zoom slider horizontal:
chart:
x_axis:
visible_window: 30
Errores comunes
- Mezclar dual-axis y multi-series. Setear los dos
y2yseriesen la misma viz produce comportamiento indefinido — elegí uno. - Los labels de dual-axis chocan. Dos escalas de valor necesitan espacio. Seteá
name_gapexplícito en los dos ejes, reducí densidad de datos, o partilo en dos charts. - La legend multi-series es muy ancha. Si el field categórico tiene muchos valores distintos, la legend puede dominar el chart. Movela a
position: bottom, o filtrá al top-N en la query Malloy subyacente. - El format de fecha en el eje x está mal. Formateá el valor x con
format[<x_field_name>]o pre-formateá en la query Malloy (ej. derivá un stringorder_month_label). - Shifts de timezone en los valores x. Los valores x de series de tiempo se interpretan en la timezone de sesión del usuario. Pre-bucketeá fechas a días o meses en la query Malloy si necesitás agrupamientos consistentes entre usuarios.
- Los clicks de cross-filter no tienen efecto. El field clickeado tiene que estar declarado como parámetro en al menos un model usado por el dashboard. Sin eso, los clicks se ignoran silenciosamente.