Benutzerdefinierte Visualisierungen in AI/BI-Dashboards

Important

Dieses Feature befindet sich in der Public Preview.

Mit benutzerdefinierten Visualisierungen können Sie Diagramme in AI/BI-Dashboards über die integrierten Visualisierungstypen hinaus anpassen. Benutzerdefinierte Visualisierungen verwenden die Vega-Lite-Bibliothek , um Diagramme aus einer JSON-Spezifikation zu rendern.

Benutzerdefinierte Visualisierungen können spezialisierte Diagrammtypen darstellen, die über die integrierten Optionen hinausgehen. Der folgende phylogenetische Baum verwendet ein kraftgesteuertes Layout, um verwandte Datensätze um gemeinsame Gruppen- und Familienzentren zu gruppieren:

Beispiel für ein phylogenetisches Baumdiagramm

Um Schritt für Schritt ein Diagramm zu erstellen, siehe Beispielvisualisierungen. Um die Spezifikationen für andere Kartentypen zu referenzieren, siehe Mehr Kartenspezifikationen.

Erstellen einer benutzerdefinierten Visualisierung

Um eine individuelle Visualisierung zu erstellen:

  1. Wählen Sie ein Dataset aus.
  2. Wählen Sie im Visualisierungskonfigurationsbereich unter dem Abschnitt "Erweiterte Visualisierung" die Option "Custom Viz" aus.
  3. Fügen Sie im Abschnitt "Felder " die Felder hinzu, die Sie verwenden möchten. Jedes Feld weist einen eindeutigen Namen auf. Verweisen Sie mithilfe dieser Namen auf Felder in Ihrer Vega-Lite Spezifikation.
  4. Geben Sie Ihre Vega-Lite JSON-Spezifikation im Vega-Lite Spezifikations-Editor ein.

Referenzdatensatzspalten

Referenzspalten in einer Vega-Lite Spezifikation auf eine der folgenden Weise:

  • Verwenden Sie "field": "{columnName}". Im folgenden Beispiel wird die xField Spalte der X-Achse zugewiesen:

    "encoding": {
      "x": { "field": "xField", "type": "quantitative" }
    }
    
  • In Ausdrücken verwenden datum["{columnName}"] oder datum.{columnName}. Im folgenden Beispiel wird eine neue x-Spalte aus den Spalten r und angle definiert:

    { "calculate": "datum.r * cos(datum.angle)", "as": "x" }
    

Weitere Informationen finden Sie in der Dokumentation zu Vega-Ausdrücken unter datum.

Dashboard-Design übernehmen

Benutzerdefinierte Visualisierungen passen sich automatisch an das Design des Dashboards an, einschließlich hellem und dunklem Modus. Die folgenden Diagrammelemente übernehmen Designwerte ohne Änderungen an Ihrer Spezifikation:

  • Achsen-, Legenden-, Titel- und Kopfzeilenschriftarten entsprechen den konfigurierten Schriftarten des Dashboards.
  • Die Achsengitterlinien entsprechen der Gitterfarbe des Dashboards für den aktiven Modus.
  • Der Diagrammhintergrund ist über dem Designhintergrund des Widgets transparent.

Einstellungen, die Sie im Spezifikationsblock config definieren, haben Vorrang vor den geerbten Standardwerten.

Auf Designwerte in Ausdrücken verweisen

Um Markierungen mit designabhängigen Werten zu formatieren, verwenden Sie die folgenden Signale in einem Vega-Lite-Ausdruck ({ "expr": "..." }):

Signal Beschreibung
colors Vorab aufgelöste Farbtoken für den aktiven Modus. Verwenden Sie diese für allgemeine Werte wie colors.textPrimary.default, , colors.gridColorund colors.markHighlightColor. Indizieren Sie diese nicht mit [mode]; sie sind bereits aufgelöst.
mode Der aktive Farbmodus, entweder 'light' oder 'dark'. Verwenden Sie es, um dashboardThemeFelder zu indizieren, die modusabhängige Varianten bereitstellen.
dashboardTheme Das vollständige Design, das vom Dashboardbesitzer konfiguriert wurde, einschließlich Schriftarten (resolvedFontSettings), der kategorisierten Palette (visualizationColors) und den Farben pro Modus (gridLineColor). Felder mit Varianten pro Modus erfordern den [mode] Index.

Die Signale colors und dashboardTheme sind unabhängig. Das Signal colors stellt Convenience-Tokens bereit, die für den aktiven Modus aufgelöst werden, während dashboardTheme es das vollständige, vom Besitzer konfigurierte Theme offenlegt. Verwenden Sie colors zuerst und dashboardTheme für Schriftarten, die gesamte Palette oder beliebige Werte, die colors nicht bietet.

Die folgenden Beispiele zeigen, wie man Themenwerte referenzieren kann:

  • Verwenden Sie die Schriftart des Dashboards für eine Textmarke:

    { "expr": "dashboardTheme.resolvedFontSettings.fieldValue.fontFamily" }
    
  • Verwenden Sie die Titelfarbe des Dashboards für den aktiven Modus:

    { "expr": "dashboardTheme.resolvedFontSettings.fieldTitle.fontColor[mode]" }
    
  • Verwenden Sie eine Farbe aus der kategorisierten Palette des Dashboards:

    { "expr": "dashboardTheme.visualizationColors[0]" }
    

Hinweis

Die Token colors sind bereits für den aktiven Modus aufgelöst. Überspringe den [mode] Index und benutze colors.markHighlightColor, nicht colors.markHighlightColor[mode]. Felder unter dashboardTheme , die per-Modus-Varianten haben, wie z. dashboardTheme.gridLineColor[mode]B. , benötigen den Index [mode] .

Filtern anderer Widgets nach Auswahl

Eine benutzerdefinierte Visualisierung kann als filterübergreifende Quelle fungieren: Wenn ein Benutzer auf eine Markierung klickt, filtert die Auswahl die anderen Widgets im Dashboard. Um dies zu aktivieren, fügen Sie einen Punktauswahlparameter mit dem reservierten Namen databricks_mark_selectionhinzu. Der Renderer erkennt diesen Namen und verbindet die Auswahl mit dem filterübergreifenden Zustand des Dashboards.

"params": [
  {
    "name": "databricks_mark_selection",
    "select": { "type": "point", "fields": ["categoryName"] }
  }
]

Es gelten die folgenden Anforderungen:

  • Der Parameter name muss genau databricks_mark_selectionsein. Jeder andere Name wird als normaler Parameter behandelt und führt keine Kreuzfilterung durch.
  • select.type muss den Wert point haben. Intervallauswahlen (Pinsel) werden nicht als Kreuzfilterquellen unterstützt.
  • select.fields muss die im Abschnitt "Felder" der Widgetkonfiguration definierten Feldnamen und nicht die unformatierten Spaltennamen auflisten.
  • Führen Sie in select.fields nur Dimensionsfelder (Gruppierung) auf. Aggregierte Maße wie SUM(...) oder AVG(...) können keinen Kreuzfilter auslösen.
  • Wenn Sie mehrere Felder auswählen möchten, listen Sie sie zusammen auf: "fields": ["categoryName", "regionName"]

Markierte Markierungen hervorheben

Um ausgewählte Markierungen hervorzuheben, verwenden Sie die Bedingungen stroke und strokeWidth für eine auf Füllung basierende Markierung (z. B. bar, arc oder rect), und lassen Sie die color-Kodierung an Ihr Feld gebunden. Verwenden Sie { "expr": "colors.markHighlightColor" } für den Strich, damit die Hervorhebung sowohl im Hell- als auch im Dunkelmodus lesbar bleibt.

Im folgenden Beispiel wird der Rest des Dashboards gefiltert, indem categoryName auf eine Leiste geklickt wird. Ausgewählte Balken erhalten eine themenbezogene Kontur, und nicht ausgewählte Balken werden abgedimmt, wobei ihre Farbcodierung erhalten bleibt.

JSON-Spezifikation
{
  "$schema": "https://vega.github.io/schema/vega-lite/v6.json",
  "data": { "name": "databricks_query" },
  "width": "container",
  "height": "container",
  "config": { "autosize": { "type": "fit", "contains": "padding" } },
  "params": [
    {
      "name": "databricks_mark_selection",
      "select": { "type": "point", "fields": ["categoryName"] }
    }
  ],
  "mark": { "type": "bar", "stroke": null },
  "encoding": {
    "x": { "field": "categoryName", "type": "nominal" },
    "y": { "field": "salesValue", "type": "quantitative" },
    "color": { "field": "categoryName", "type": "nominal" },
    "fillOpacity": {
      "condition": { "param": "databricks_mark_selection", "value": 1 },
      "value": 0.3
    }
    "stroke": {
      "condition": {
        "param": "databricks_mark_selection",
        "empty": false,
        "value": { "expr": "colors.markHighlightColor" }
      },
      "value": null
    },
    "strokeWidth": {
      "condition": { "param": "databricks_mark_selection", "empty": false, "value": 2 },
      "value": 0
    }
  }
}

Skalieren Sie eine Tabelle automatisch

Um die Größe eines Diagramms an den Container anzupassen, fügen Sie die folgenden Einstellungen auf der obersten Ebene Ihrer Spezifikation hinzu:

"width": "container",
"height": "container",
"config": {
  "autosize": {
    "type": "fit",
    "contains": "padding"
  }
}

Beispielvisualisierungen

Die folgenden Beispiele führen Schritt für Schritt zum Erstellen einer individuellen Visualisierung, von einem einfachen, geschichteten Diagramm bis zu einem fortgeschritteneren phylogenetischen Baum.

Geschichtetes Diagramm mit rollierendem Mittelwert

In diesem Beispiel wird ein mehrschichtiges Diagramm erstellt, das rohe Temperaturdatenpunkte mit einer überlagerten Linie des gleitenden Mittelwerts darstellt und Wetterdaten aus den Databricks-Beispieldatensätzen verwendet.

Geschichtetes Temperaturdiagramm mit einer roten rollierenden Mittelwertlinie über gestreuten Punkten

  1. Erstellen Sie ein Dataset mit der folgenden Abfrage:

    SELECT date, temperature AS temp_max
    FROM samples.accuweather.historical_hourly_imperial
    WHERE city_name = 'singapore'
    ORDER BY date;
    
  2. Wählen Sie im Visualisierungskonfigurationsbereich unter "Erweitert" die Option "Benutzerdefinierte Viz" aus.

  3. Wählen Sie das Dataset aus, das Sie im vorherigen Schritt erstellt haben.

  4. Fügen Sie im Abschnitt "Felder " ein Feld für die Datumsspalte hinzu, und legen Sie dessen Name auf date.

  5. Fügen Sie ein Feld für die Temperaturspalte hinzu, und legen Sie den Namen auf temp_max.

  6. Kopieren Sie die folgende Spezifikation in den Vega-Lite Spezifikations-Editor . Wenn die x-Achse abgeschnitten ist, siehe Automatisch eine Tabelle anpassen.

    JSON-Spezifikation
    {
      "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
      "width": "container",
      "height": "container",
      "config": {
        "autosize": { "type": "fit", "contains": "padding" }
      },
      "data": { "name": "databricks_query" },
      "transform": [
        {
          "window": [{ "field": "temp_max", "op": "mean", "as": "rolling_mean" }],
          "frame": [-15, 15]
        }
      ],
      "encoding": {
        "x": { "field": "date", "type": "temporal", "title": "Date" },
        "y": {
          "type": "quantitative",
          "scale": { "zero": false },
          "axis": { "title": "Max temperature and rolling mean" }
        }
      },
      "layer": [
        {
          "mark": { "type": "point", "opacity": 0.3 },
          "encoding": { "y": { "field": "temp_max", "title": "Max temperature" } }
        },
        {
          "mark": { "type": "line", "color": "red", "size": 3 },
          "encoding": { "y": { "field": "rolling_mean", "title": "Rolling mean of max temperature" } }
        }
      ]
    }
    

Phylogenetischer Baum

Dieses Beispiel verwendet einen kleinen Satz von Stichprobendaten, um den phylogenetischen Baum zu erstellen, der oben auf dieser Seite gezeigt wird. Vega-Lite zeichnet Punkte an den von dir angegebenen Koordinaten auf, berechnet aber nicht die Knotenpositionen für ein Netzwerkdiagramm selbst. Diese Berechnung findet in der Abfrage statt, bevor die Daten das Diagramm erreichen, wobei die Abfrage die x- und y-Koordinaten jedes Punktes vorberechnet. Die Abfrage gibt drei Datensatztypen aus, die die Spezifikation als separate Schichten rendert: path Zeilen zeichnen die gekrümmten Zweige, node Zeilen zeichnen die Blattkreise und label Zeilen positionieren die Gruppenlabels.

  1. Laden Sie die Beispieldaten herunter. Jede Reihe stellt einen Fossilfund dar, wobei dig_longitude und dig_latitude die Ausgrabungskoordinaten angegeben sind.

    Laden Sie die Beispieldaten herunter

  2. Klicken Sie in der Seitenleiste auf Symbol „Dashboards“Dashboards.

  3. Klicken Sie auf "Dashboard erstellen".

  4. Klicken Sie auf die Registerkarte Daten .

  5. Klicken Sie auf Daten hinzufügen und dann auf Daten hochladen.

  6. Fügen Sie die heruntergeladene Datei in die Erstellungs- oder Änderungstabelle aus dem Datei-Upload-Fenster ein.

  7. Wählen Sie den Katalog und das Schema , in dem Sie die Tabelle speichern möchten, und geben Sie dann einen Tabellennamen ein.

  8. Klicken Sie auf "Tabelle erstellen". Die vollständige Tabelle wird automatisch als Datensatz hinzugefügt.

  9. Klicken Sie auf SQL-Datensatz hinzufügen und fügen Sie die Abfrage ein. Ersetzen Sie in der FROM Klausel der Abfrage die Namen des Katalogs, Schemas und der Tabelle durch die, die Sie bei der Erstellung der Tabelle verwendet haben.

  10. Erstellen Sie die benutzerdefinierte Visualisierung und folgen Sie den Schritten in Erstellen einer benutzerdefinierten Visualisierung. Im Abschnitt Felder fügen Sie die folgenden Felder hinzu und verwenden Sie jeden Feldnamen als Namen: record_type, x, y, fossil_tag, point_order, suborderroar_scoreclade_labelgenus_symbolfamily_taxonund .label_text Nutze die Spezifikation als dein Vega-Lite JSON.

SQL-Abfrage
WITH base AS (
  SELECT
    fossil_tag,
    genus_symbol,
    clade_label,
    suborder,
    family_taxon,
    dig_longitude,
    dig_latitude,
    roar_score
  FROM
    `my_catalog`.`default`.`dino_table`
),
root_pt AS (
  SELECT
    AVG(dig_longitude) AS rx,
    AVG(dig_latitude) AS ry
  FROM
    base
),
group_pts AS (
  SELECT
    suborder,
    AVG(dig_longitude) AS gx,
    AVG(dig_latitude) AS gy
  FROM
    base
  GROUP BY
    suborder
),
family_pts AS (
  SELECT
    suborder,
    family_taxon,
    AVG(dig_longitude) AS fx,
    AVG(dig_latitude) AS fy
  FROM
    base
  GROUP BY
    suborder,
    family_taxon
),
ctx AS (
  SELECT
    b.fossil_tag,
    b.suborder,
    b.family_taxon,
    b.clade_label,
    b.genus_symbol,
    b.dig_longitude,
    b.dig_latitude,
    b.roar_score,
    r.rx,
    r.ry,
    g.gx,
    g.gy,
    f.fx,
    f.fy
  FROM
    base b
      CROSS JOIN root_pt r
      JOIN group_pts g
        ON b.suborder = g.suborder
      JOIN family_pts f
        ON b.suborder = f.suborder
        AND b.family_taxon = f.family_taxon
),
waypoints AS (
  SELECT
    fossil_tag,
    suborder,
    family_taxon,
    clade_label,
    genus_symbol,
    roar_score,
    0 AS point_order,
    rx AS x,
    ry AS y
  FROM
    ctx
  UNION ALL
  SELECT
    fossil_tag,
    suborder,
    family_taxon,
    clade_label,
    genus_symbol,
    roar_score,
    1,
    rx + 0.30 * (gx - rx),
    ry + 0.30 * (gy - ry)
  FROM
    ctx
  UNION ALL
  SELECT
    fossil_tag,
    suborder,
    family_taxon,
    clade_label,
    genus_symbol,
    roar_score,
    2,
    gx + 0.15 * (fx - gx),
    gy + 0.15 * (fy - gy)
  FROM
    ctx
  UNION ALL
  SELECT
    fossil_tag,
    suborder,
    family_taxon,
    clade_label,
    genus_symbol,
    roar_score,
    3,
    gx + 0.50 * (fx - gx) + 0.03 * (dig_longitude - fx),
    gy + 0.50 * (fy - gy) + 0.03 * (dig_latitude - fy)
  FROM
    ctx
  UNION ALL
  SELECT
    fossil_tag,
    suborder,
    family_taxon,
    clade_label,
    genus_symbol,
    roar_score,
    4,
    fx + 0.15 * (dig_longitude - fx),
    fy + 0.15 * (dig_latitude - fy)
  FROM
    ctx
  UNION ALL
  SELECT
    fossil_tag,
    suborder,
    family_taxon,
    clade_label,
    genus_symbol,
    roar_score,
    5,
    fx + 0.65 * (dig_longitude - fx),
    fy + 0.65 * (dig_latitude - fy)
  FROM
    ctx
  UNION ALL
  SELECT
    fossil_tag,
    suborder,
    family_taxon,
    clade_label,
    genus_symbol,
    roar_score,
    6,
    dig_longitude,
    dig_latitude
  FROM
    ctx
)
SELECT
  fossil_tag,
  suborder,
  point_order,
  x,
  y,
  family_taxon,
  clade_label,
  genus_symbol,
  roar_score,
  'path' AS record_type,
  CAST(NULL AS STRING) AS label_text
FROM
  waypoints
UNION ALL
SELECT
  fossil_tag,
  suborder,
  99 AS point_order,
  dig_longitude AS x,
  dig_latitude AS y,
  family_taxon,
  clade_label,
  genus_symbol,
  roar_score,
  'node' AS record_type,
  CAST(NULL AS STRING) AS label_text
FROM
  base
UNION ALL
SELECT
  g.suborder AS fossil_tag,
  g.suborder AS suborder,
  100 AS point_order,
  g.gx
    + (g.gx - r.rx)
      * CASE LOWER(g.suborder)
        WHEN 'titanosauria' THEN 0.10
        WHEN 'hadrosauria' THEN 0.25
        WHEN 'ornithopoda' THEN 1.30
        WHEN 'stegosauria' THEN 0.73
        ELSE 0.55
      END AS x,
  g.gy
    + (g.gy - r.ry)
      * CASE LOWER(g.suborder)
        WHEN 'titanosauria' THEN 0.10
        WHEN 'hadrosauria' THEN 0.25
        WHEN 'ornithopoda' THEN 1.30
        WHEN 'stegosauria' THEN 0.73
        ELSE 0.55
      END AS y,
  CAST(NULL AS STRING) AS family_taxon,
  CAST(NULL AS STRING) AS clade_label,
  CAST(NULL AS STRING) AS genus_symbol,
  CAST(NULL AS DOUBLE) AS roar_score,
  'label' AS record_type,
  g.suborder AS label_text
FROM
  group_pts g CROSS JOIN root_pt r

JSON-Spezifikation
{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": { "name": "databricks_query" },
  "width": "container",
  "height": "container",
  "background": "white",
  "config": {
    "autosize": { "type": "fit", "contains": "padding" },
    "view": { "stroke": null }
  },
  "layer": [
    {
      "transform": [{ "filter": "datum.record_type === 'path'" }],
      "mark": {
        "type": "line",
        "interpolate": "basis",
        "strokeCap": "round",
        "strokeJoin": "round"
      },
      "encoding": {
        "x": {
          "field": "x",
          "type": "quantitative",
          "axis": null,
          "scale": { "zero": false, "nice": false }
        },
        "y": {
          "field": "y",
          "type": "quantitative",
          "axis": null,
          "scale": { "zero": false, "nice": false }
        },
        "detail": { "field": "fossil_tag", "type": "nominal" },
        "order": { "field": "point_order", "type": "quantitative" },
        "color": {
          "field": "suborder",
          "type": "nominal",
          "scale": { "scheme": "tableau10" },
          "legend": null
        },
        "opacity": { "value": 0.3 },
        "strokeWidth": { "value": 0.8 }
      }
    },
    {
      "transform": [{ "filter": "datum.record_type === 'node'" }],
      "mark": {
        "type": "circle",
        "opacity": 0.9,
        "stroke": "white",
        "strokeWidth": 0.3
      },
      "encoding": {
        "x": {
          "field": "x",
          "type": "quantitative",
          "axis": null,
          "scale": { "zero": false, "nice": false }
        },
        "y": {
          "field": "y",
          "type": "quantitative",
          "axis": null,
          "scale": { "zero": false, "nice": false }
        },
        "color": {
          "field": "suborder",
          "type": "nominal",
          "scale": { "scheme": "tableau10" },
          "legend": { "title": "Suborder", "orient": "right" }
        },
        "size": {
          "field": "roar_score",
          "type": "quantitative",
          "scale": { "domain": [0, 100], "range": [4, 150] },
          "legend": null
        },
        "tooltip": [
          { "field": "clade_label", "title": "Clade" },
          { "field": "genus_symbol", "title": "Symbol" },
          { "field": "suborder", "title": "Suborder" },
          { "field": "family_taxon", "title": "Family" },
          { "field": "roar_score", "title": "Roar Score", "format": ".1f" }
        ]
      }
    },
    {
      "transform": [{ "filter": "datum.record_type === 'label'" }],
      "mark": {
        "type": "text",
        "fontSize": 12,
        "fontWeight": "bold",
        "opacity": 0.85
      },
      "encoding": {
        "x": {
          "field": "x",
          "type": "quantitative",
          "axis": null,
          "scale": { "zero": false, "nice": false }
        },
        "y": {
          "field": "y",
          "type": "quantitative",
          "axis": null,
          "scale": { "zero": false, "nice": false }
        },
        "text": { "field": "label_text", "type": "nominal" },
        "color": {
          "field": "suborder",
          "type": "nominal",
          "scale": { "scheme": "tableau10" },
          "legend": null
        }
      }
    }
  ]
}

Weitere Kartenspezifikationen

Die folgenden Spezifikationen zeigen Diagramme an, die nicht als integrierte Visualisierungstypen verfügbar sind. Weitere Beispiele finden Sie in den Vega-Lite Beispielkatalogen.

Bullet-Chart

Beispiel für ein Bullet-Diagramm.

Definieren Sie categoryField, currentField, paceField und targetField im Abschnitt Felder.

JSON-Spezifikation
{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "width": "container",
  "height": "container",
  "data": { "name": "databricks_query" },
  "config": {
    "autosize": { "type": "fit", "contains": "padding" }
  },
  "transform": [
    {
      "fold": ["targetField", "paceField", "currentField"],
      "as": ["measure_name", "measure_value"]
    },
    {
      "calculate": "toNumber(datum.measure_value)",
      "as": "measure_value"
    },
    {
      "calculate": "{ \"targetField\": \"Target\", \"paceField\": \"Pace\", \"currentField\": \"Current\" }[datum.measure_name]",
      "as": "measure_label"
    },
    {
      "calculate": "indexof([\"Target\", \"Pace\", \"Current\"], datum.measure_label)",
      "as": "measure_order"
    }
  ],
  "layer": [
    {
      "mark": "bar",
      "params": [
        {
          "name": "legend_click",
          "select": { "type": "point", "fields": ["measure_label"] },
          "bind": "legend"
        }
      ],
      "encoding": {
        "color": { "field": "measure_label" },
        "opacity": { "value": 0 }
      }
    },
    {
      "transform": [{ "filter": { "param": "legend_click" } }],
      "layer": [
        {
          "layer": [
            {
              "mark": { "type": "bar", "tooltip": true },
              "encoding": { "color": { "field": "measure_label", "legend": null } },
              "transform": [{ "filter": { "field": "measure_label", "oneOf": ["Pace"] } }]
            },
            {
              "mark": { "type": "bar", "height": 7, "tooltip": true },
              "encoding": { "color": { "field": "measure_label", "legend": null } },
              "transform": [{ "filter": { "field": "measure_label", "oneOf": ["Current"] } }]
            },
            {
              "mark": { "type": "tick", "tooltip": true, "thickness": 3 },
              "encoding": { "color": { "field": "measure_label", "legend": null } },
              "transform": [{ "filter": { "field": "measure_label", "oneOf": ["Target"] } }]
            }
          ],
          "encoding": {
            "x": {
              "field": "measure_value",
              "type": "quantitative",
              "stack": null,
              "title": "Value",
              "axis": { "orient": "bottom" }
            },
            "color": {
              "scale": {
                "domain": ["Target", "Pace", "Current"],
                "range": ["#000000", "#bcbcbc", "#A66BBF"]
              }
            },
            "order": {
              "field": "measure_order",
              "type": "quantitative",
              "sort": "descending"
            }
          }
        }
      ],
      "encoding": {
        "y": {
          "field": "categoryField",
          "type": "ordinal",
          "title": "Category",
          "axis": { "labelOverlap": true }
        },
        "tooltip": [
          { "field": "categoryField", "type": "nominal", "title": "Category" },
          { "field": "currentField", "type": "quantitative", "title": "Current" },
          { "field": "paceField", "type": "quantitative", "title": "Pace" },
          { "field": "targetField", "type": "quantitative", "title": "Target" }
        ]
      }
    }
  ]
}

Messgerät

Beispiel für ein Tachodiagramm.

Definieren $valueField und $totalField im Abschnitt "Felder ".

JSON-Spezifikation
{
  "$schema": "https://vega.github.io/schema/vega-lite/v6.json",
  "width": "container",
  "height": "container",
  "data": { "name": "databricks_query" },
  "config": {
    "concat": { "spacing": 0 },
    "autosize": { "type": "fit", "contains": "padding" }
  },
  "params": [
    { "name": "ring_max", "expr": "min(width, height) / 2 - 16" },
    { "name": "ring_width", "expr": "max(12, (min(width, height) / 2) * 0.12)" },
    { "name": "ring_gap", "expr": "max(4, (min(width, height) / 2) * 0.03)" },
    { "name": "label_color", "value": "#000000" },
    { "name": "ring_background_opacity", "value": 0.3 },
    { "name": "ring0_percent", "value": 100 },
    { "name": "ring0_outer", "expr": "ring_max + 2" },
    { "name": "ring0_inner", "expr": "ring_max + 1" },
    { "name": "ring1_outer", "expr": "ring0_inner - ring_gap" },
    { "name": "ring1_inner", "expr": "ring1_outer - ring_width" },
    { "name": "ring1_middle", "expr": "(ring1_outer + ring1_inner) / 2" },
    { "name": "arc_size", "expr": "220" }
  ],
  "transform": [
    { "as": "ratio", "calculate": "datum['$valueField'] / datum['$totalField']" },
    { "as": "_arc_start_degrees", "calculate": "360 - ( arc_size / 2 )" },
    { "as": "_arc_end_degrees", "calculate": "0 + ( arc_size / 2 )" },
    { "as": "_arc_start_radians", "calculate": "2 * 3.14 * ( datum['_arc_start_degrees'] - 360 ) / 360" },
    { "as": "_arc_end_radians", "calculate": "2 * 3.14 * datum['_arc_end_degrees'] / 360" },
    { "as": "_arc_total_radians", "calculate": "datum['_arc_end_radians'] - datum['_arc_start_radians']" },
    { "as": "_ring_start_radians", "calculate": "datum['_arc_start_radians']" },
    {
      "as": "_ring_end_radians",
      "calculate": "datum['_arc_start_radians'] + ( datum['_arc_total_radians'] * datum['ratio'] )"
    }
  ],
  "layer": [
    {
      "mark": {
        "type": "arc",
        "color": "lightgrey",
        "theta": { "expr": "datum['_arc_start_radians']" },
        "radius": { "expr": "ring1_outer" },
        "theta2": { "expr": "datum['_arc_end_radians']" },
        "radius2": { "expr": "ring1_inner" },
        "cornerRadius": 10
      }
    },
    {
      "name": "RING",
      "mark": {
        "type": "arc",
        "theta": { "expr": "datum['_ring_start_radians']" },
        "radius": { "expr": "ring1_outer" },
        "theta2": { "expr": "datum['_ring_end_radians']" },
        "radius2": { "expr": "ring1_inner" },
        "cornerRadius": 10
      },
      "encoding": {
        "color": {
          "value": "#307E31",
          "condition": [
            { "test": "datum['ratio'] < 0.33", "value": "#880808" },
            { "test": "datum['ratio'] < 0.66", "value": "#E49B0F" }
          ]
        }
      }
    },
    {
      "mark": { "type": "text", "fontSize": 40 },
      "encoding": {
        "text": { "field": "$valueField" },
        "color": {
          "value": "#307E31",
          "condition": [
            { "test": "datum['ratio'] < 0.33", "value": "#880808" },
            { "test": "datum['ratio'] < 0.66", "value": "#E49B0F" }
          ]
        }
      }
    }
  ]
}

Radar Diagramm

Beispiel für ein Radardiagramm.

Definieren $key und $value im Abschnitt "Felder ".

JSON-Spezifikation
{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "width": "container",
  "height": "container",
  "config": {
    "autosize": { "type": "fit", "contains": "padding" }
  },
  "data": { "name": "databricks_query" },
  "transform": [
    { "window": [{ "op": "row_number", "as": "category" }] },
    { "calculate": "datum.category - 1", "as": "category" },
    {
      "joinaggregate": [
        { "op": "count", "as": "numCategories" },
        { "op": "max", "field": "$value", "as": "maxValue" }
      ]
    },
    { "calculate": "2 * PI * datum.category / datum.numCategories", "as": "angle" },
    { "calculate": "100 * datum['$value'] / datum.maxValue", "as": "r" },
    { "calculate": "datum.r * cos(datum.angle)", "as": "x" },
    { "calculate": "datum.r * sin(datum.angle)", "as": "y" },
    { "calculate": "110 * cos(datum.angle)", "as": "label_x" },
    { "calculate": "110 * sin(datum.angle)", "as": "label_y" }
  ],
  "layer": [
    {
      "transform": [
        { "joinaggregate": [{ "op": "count", "as": "numCategories" }] },
        { "aggregate": [{ "op": "max", "field": "numCategories", "as": "numCategories" }] },
        { "calculate": "[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]", "as": "cats" },
        { "flatten": ["cats"], "as": ["cat"] },
        { "filter": "datum.cat <= datum.numCategories" },
        { "calculate": "2 * PI * datum.cat / datum.numCategories", "as": "angle" },
        { "calculate": "100 * cos(datum.angle)", "as": "x" },
        { "calculate": "100 * sin(datum.angle)", "as": "y" }
      ],
      "mark": { "type": "line", "color": "#ddd", "strokeWidth": 1 },
      "encoding": {
        "x": { "field": "x", "type": "quantitative", "scale": { "domain": [-120, 120] }, "axis": null },
        "y": { "field": "y", "type": "quantitative", "scale": { "domain": [-120, 120] }, "axis": null },
        "order": { "field": "cat" }
      }
    },
    {
      "transform": [
        { "joinaggregate": [{ "op": "count", "as": "numCategories" }] },
        { "aggregate": [{ "op": "max", "field": "numCategories", "as": "numCategories" }] },
        { "calculate": "[20,40,60,80,100]", "as": "levels" },
        { "flatten": ["levels"], "as": ["level"] },
        { "calculate": "[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]", "as": "cats" },
        { "flatten": ["cats"], "as": ["cat"] },
        { "filter": "datum.cat <= datum.numCategories" },
        { "calculate": "2 * PI * datum.cat / datum.numCategories", "as": "angle" },
        { "calculate": "datum.level", "as": "r" },
        { "calculate": "datum.r * cos(datum.angle)", "as": "x" },
        { "calculate": "datum.r * sin(datum.angle)", "as": "y" }
      ],
      "mark": { "type": "line", "color": "#ddd", "strokeWidth": 1 },
      "encoding": {
        "x": { "field": "x", "type": "quantitative" },
        "y": { "field": "y", "type": "quantitative" },
        "detail": { "field": "level" },
        "order": { "field": "cat" }
      }
    },
    {
      "mark": { "type": "line", "color": "#9467bd", "strokeWidth": 2, "interpolate": "linear-closed" },
      "encoding": {
        "x": { "field": "x", "type": "quantitative" },
        "y": { "field": "y", "type": "quantitative" },
        "order": { "field": "category" }
      }
    },
    {
      "mark": { "type": "point", "filled": true, "size": 50, "color": "#9467bd" },
      "encoding": {
        "x": { "field": "x", "type": "quantitative" },
        "y": { "field": "y", "type": "quantitative" }
      }
    },
    {
      "mark": { "type": "text", "fontSize": 14, "fontWeight": "bold" },
      "encoding": {
        "x": { "field": "label_x", "type": "quantitative" },
        "y": { "field": "label_y", "type": "quantitative" },
        "text": { "field": "$key", "type": "nominal" }
      }
    }
  ],
  "view": { "stroke": null }
}

Radialdiagramm

Radialdiagramm (Beispiel).

Definieren $valueField und $colorField im Abschnitt "Felder ".

JSON-Spezifikation
{
  "$schema": "https://vega.github.io/schema/vega-lite/v6.json",
  "width": "container",
  "height": "container",
  "config": {
    "autosize": { "type": "fit", "contains": "padding" }
  },
  "data": { "name": "databricks_query" },
  "transform": [
    {
      "aggregate": [{ "op": "sum", "field": "$valueField", "as": "total" }],
      "groupby": ["$colorField"]
    },
    {
      "window": [{ "op": "rank", "as": "rank" }],
      "sort": [{ "field": "total", "order": "descending" }]
    }
  ],
  "layer": [
    {
      "mark": { "type": "arc", "innerRadius": 20, "stroke": "#fff" }
    }
  ],
  "encoding": {
    "theta": {
      "field": "total",
      "type": "quantitative",
      "scale": { "type": "sqrt" },
      "stack": true,
      "sort": "descending"
    },
    "radius": { "field": "total", "scale": { "type": "sqrt", "zero": true } },
    "color": {
      "field": "$colorField",
      "type": "nominal",
      "title": "Sub-Category",
      "sort": { "field": "total", "order": "descending" },
      "legend": { "orient": "right" }
    },
    "tooltip": [
      { "field": "$colorField", "type": "nominal", "title": "Sub-Category" },
      { "field": "total", "type": "quantitative", "title": "Sales" }
    ]
  },
  "view": { "stroke": null }
}

Sunburst-Diagramm

Beispiel für ein Sunburst-Diagramm.

Definieren Sie outerGroupField, innerGroupField und sizeField im Felder-Abschnitt.

JSON-Spezifikation
{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "width": "container",
  "height": "container",
  "data": { "name": "databricks_query" },
  "config": {
    "autosize": { "type": "fit", "contains": "padding" }
  },
  "transform": [
    { "calculate": "datum['outerGroupField']", "as": "OUTSIDE" },
    { "calculate": "datum['innerGroupField']", "as": "INSIDE" },
    { "calculate": "datum.OUTSIDE + '-' + datum.INSIDE", "as": "OUT_IN" },
    { "calculate": "toNumber(datum['sizeField'])", "as": "SIZE" }
  ],
  "resolve": {
    "scale": { "color": "independent" },
    "legend": { "color": "independent" }
  },
  "layer": [
    {
      "mark": {
        "type": "arc",
        "tooltip": true,
        "innerRadius": { "expr": "min(width, height)/9" },
        "outerRadius": { "expr": "min(width, height)/3" }
      },
      "encoding": {
        "theta": { "field": "SIZE", "type": "quantitative", "stack": true },
        "color": {
          "field": "OUT_IN",
          "type": "ordinal",
          "sort": "ascending",
          "title": "Inner Grouping",
          "scale": {
            "range": [
              "#1DF9B9",
              "#1DE5B9",
              "#1DD1B9",
              "#1DBDB9",
              "#1DA9B9",
              "#3DF23B",
              "#3DDA3B",
              "#3DC23B",
              "#3DAA3B",
              "#3D923B"
            ]
          }
        },
        "order": { "field": "OUT_IN", "sort": "ascending" },
        "tooltip": [
          { "field": "OUTSIDE", "type": "nominal", "title": "Outer Grouping" },
          { "field": "INSIDE", "type": "nominal", "title": "Inner Grouping" },
          { "field": "SIZE", "type": "quantitative", "title": "Count" }
        ]
      }
    },
    {
      "transform": [
        {
          "aggregate": [{ "op": "sum", "field": "SIZE", "as": "total_users" }],
          "groupby": ["OUTSIDE"]
        }
      ],
      "mark": {
        "type": "arc",
        "tooltip": true,
        "innerRadius": { "expr": "min(width, height)/3" }
      },
      "encoding": {
        "theta": {
          "field": "total_users",
          "type": "quantitative",
          "stack": true,
          "sort": "ascending",
          "title": "Users Count"
        },
        "color": {
          "field": "OUTSIDE",
          "type": "ordinal",
          "sort": "ascending",
          "title": "Outer Grouping",
          "scale": { "range": ["#1DD1B9", "#3DC23B"] }
        },
        "order": { "field": "OUTSIDE", "sort": "ascending" },
        "tooltip": [
          { "field": "OUTSIDE", "type": "nominal", "title": "Outer Grouping" },
          { "field": "total_users", "type": "quantitative", "title": "Count" }
        ]
      }
    }
  ]
}

Limitations

  • Treemap-Diagramme werden nicht unterstützt. Vega-Lite unterstützt keine Treemaps.
  • Bildmarken unterstützen nur Inline-Base64-data:-Bild-URLs (zum Beispiel data:image/png;base64,...) mit 37 KB oder weniger im PNG-, JPEG- oder WebP-Format. Remotebild-URLs (https: oder http:), relative URLs, SVG-Bilder und Feld- oder ausdrucksgesteuerte Bild-URLs werden nicht unterstützt.