Docs / Build Workflow

Visualization — line

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.series con 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 con chart.value_label abajo.
  • chart.cross_filter — boolean, default true. Seteá false para 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_stylecolor, 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.y o format[<y_field_name>] — pattern para labels del eje y izquierdo y valores de tooltip.
  • format.y2 o format[<y2_field_name>] — pattern para el eje y derecho (modo dual-axis).
  • format en 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 y2 y series en la misma viz produce comportamiento indefinido — elegí uno.
  • Los labels de dual-axis chocan. Dos escalas de valor necesitan espacio. Seteá name_gap explí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 string order_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.