Aangepaste visualisaties in AI/BI-dashboards

Belangrijk

Deze functie bevindt zich in openbare preview-versie.

Met aangepaste visualisaties kunt u grafieken aanpassen in AI/BI-dashboards, behalve de ingebouwde visualisatietypen. Aangepaste visualisaties maken gebruik van de Vega-Lite-bibliotheek om grafieken uit een JSON-specificatie weer te geven.

Aangepaste visualisaties kunnen gespecialiseerde grafiektypen weergeven die verder gaan dan de ingebouwde opties. De volgende fylogenetische boom gebruikt een force-directed layout om gerelateerde records te groeperen rond gedeelde groeps- en familiecentra:

Voorbeeld van een fylogenetisch boomdiagram

Om stap voor stap een grafiek te maken, zie Voorbeeldvisualisaties. Om de specificaties van andere kaarttypes te raadplegen, zie Meer kaartspecificaties.

Een aangepaste visualisatie maken

Om een aangepaste visualisatie te maken:

  1. Selecteer een gegevensset.
  2. Selecteer in het deelvenster Visualisatieconfiguratie de optie Custom Viz onder de sectie Geavanceerde visualisatie.
  3. Voeg in de sectie Velden de velden toe die u wilt gebruiken. Elk veld heeft een unieke naam. Verwijs naar velden in je Vega-Lite-specificatie met deze namen.
  4. Voer uw Vega-Lite JSON-specificatie in de Vega-Lite specificatie-editor in.

Kolommen van de referentiegegevensset

Referentiekolommen in een Vega-Lite specificatie op een van de volgende manieren:

  • Gebruik "field": "{columnName}". In het volgende voorbeeld wordt de xField kolom toegewezen aan de x-as:

    "encoding": {
      "x": { "field": "xField", "type": "quantitative" }
    }
    
  • Gebruik in expressies datum["{columnName}"] of datum.{columnName}. In het volgende voorbeeld wordt een nieuwe x kolom uit de r en angle kolommen gedefinieerd:

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

Zie datum de documentatie over Vega-expressies voor meer informatie.

Het dashboardthema overnemen

Aangepaste visualisaties worden automatisch aangepast aan het thema van het dashboard, inclusief de lichte en donkere modus. De volgende grafiekelementen nemen themawaarden over zonder wijzigingen in uw specificatie:

  • As-, legenda-, titel- en koptekstlettertypen komen overeen met de geconfigureerde lettertypen van het dashboard.
  • As-rasterlijnen komen overeen met de kleur van de rasterlijn van het dashboard voor de actieve modus.
  • De achtergrond van de grafiek is transparant ten opzichte van de thematische achtergrond van de widget.

Instellingen die u in het blok van config uw specificatie definieert, hebben voorrang op de overgenomen standaardwaarden.

Referentiethemawaarden in expressies

Als u markeringen met themabewuste waarden wilt markeren, verwijst u naar de volgende signalen in een Vega-Lite expressie ({ "expr": "..." }):

Signaal Beschrijving
colors Vooraf opgeloste kleurtokens voor de actieve modus. Gebruik deze voor algemene waarden, zoals colors.textPrimary.default, colors.gridColoren colors.markHighlightColor. Indexeer deze niet met [mode]; ze zijn al opgelost.
mode De actieve kleurmodus, ofwel 'light''dark'. Gebruik deze om velden te indexeren dashboardTheme die varianten per modus bieden.
dashboardTheme Het volledige thema dat is geconfigureerd door de eigenaar van het dashboard, inclusief lettertypen (resolvedFontSettings), het categorische palet (visualizationColors) en kleuren per modus (gridLineColor). Voor velden met varianten per modus is de [mode] index vereist.

De colors en dashboardTheme signalen zijn onafhankelijk. Het colors signaal biedt gemakstokens die voor de actieve modus zijn opgelost, terwijl dashboardTheme het het volledige door de eigenaar geconfigureerde thema blootlegt. Gebruik colors eerst, en gebruik dashboardTheme voor fonts, het volledige palet of een waarde die colors niet biedt.

De volgende voorbeelden laten zien hoe je themawaarden kunt refereren:

  • Gebruik het hoofdlettertype van het dashboard voor een tekstmarkering:

    { "expr": "dashboardTheme.resolvedFontSettings.fieldValue.fontFamily" }
    
  • Gebruik de titelkleur van het dashboard voor de actieve modus:

    { "expr": "dashboardTheme.resolvedFontSettings.fieldTitle.fontColor[mode]" }
    
  • Gebruik een kleur uit het categorische palet van het dashboard:

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

Note

De colors tokens zijn al opgelost voor de actieve modus. Sla de [mode] index over en gebruik colors.markHighlightColor, niet colors.markHighlightColor[mode]. Velden onder dashboardTheme die per-modus varianten hebben, zoals dashboardTheme.gridLineColor[mode], vereisen de [mode] index.

Andere widgets filteren bij selectie

Een aangepaste visualisatie kan fungeren als een kruisfilterbron: wanneer een gebruiker op een markering klikt, filtert de selectie de andere widgets op het dashboard. Als u dit wilt inschakelen, voegt u een puntselectieparameter toe met de gereserveerde naam databricks_mark_selection. De renderer detecteert deze naam en verbindt de selectie met de kruisfilterstatus van het dashboard.

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

De volgende vereisten zijn van toepassing:

  • De parameter name moet precies databricks_mark_selectionzijn. Elke andere naam wordt behandeld als een reguliere parameter en zorgt niet voor kruislings filteren.
  • select.type moet zijn: point. Intervalselecties (selectiepenseel) worden niet ondersteund als bronnen voor kruislings filteren.
  • select.fields moet de veldnamen weergeven die zijn gedefinieerd in de sectie Velden van de widgetconfiguratie, niet de onbewerkte kolomnamen.
  • Alleen dimensievelden (groeperen) weergeven in select.fields. Geaggregeerde metingen, zoals SUM(...) of AVG(...), kunnen geen kruisfilter aandrijven.
  • Als u meerdere velden wilt selecteren, moet u ze samen weergeven: "fields": ["categoryName", "regionName"].

Geselecteerde markeringen markeren

Als u geselecteerde markeringen wilt accentueren, gebruikt u stroke- en strokeWidth-voorwaarden op een markering met vulling (zoals bar, arc of rect) en laat u de color-codering aan uw veld gebonden. Gebruik { "expr": "colors.markHighlightColor" } voor de contour, zodat de markering in zowel de lichte als de donkere modus leesbaar blijft.

In het volgende voorbeeld wordt de rest van het dashboard door categoryName gefilterd wanneer op een balk wordt geklikt. Geselecteerde balken krijgen een omlijning in het thema, terwijl niet-geselecteerde balken worden gedimd met behoud van hun kleurcodering.

JSON-specificatie
{
  "$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
    }
  }
}

Verander automatisch de grootte van een grafiek

Als u de grootte van een grafiek wilt aanpassen aan de container, voegt u de volgende instellingen toe op het hoogste niveau van uw specificatie:

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

Voorbeeldvisualisaties

De volgende voorbeelden laten stap voor stap een aangepaste visualisatie opbouwen, van een eenvoudige gelaagde grafiek tot een meer geavanceerde fylogenetische boom.

Gelaagde grafiek met een rollend gemiddelde

Dit voorbeeld maakt een gelaagde grafiek waarin ruwe temperatuurdatapunten worden uitgezet met een lijn als overlay voor het voortschrijdend gemiddelde, op basis van weergegevens uit de Databricks-voorbeelddatasets.

Gelaagde temperatuurgrafiek met een rode rolling-mean lijn over verspreide punten

  1. Maak een gegevensset met de volgende query:

    SELECT date, temperature AS temp_max
    FROM samples.accuweather.historical_hourly_imperial
    WHERE city_name = 'singapore'
    ORDER BY date;
    
  2. Selecteer in het deelvenster Visualisatieconfiguratie onder Geavanceerd de optie Aangepaste Viz.

  3. Selecteer de gegevensset die u in de vorige stap hebt gemaakt.

  4. Voeg in de sectie Velden een veld toe voor de datumkolom en stel de naam in op date.

  5. Voeg een veld voor de temperatuurkolom toe en stel de naam in op temp_max.

  6. Kopieer de volgende specificatie naar de Vega-Lite specificatie-editor . Als de x-as is afgeknipt, zie Verander een grafiek automatisch.

    JSON-specificatie
    {
      "$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" } }
        }
      ]
    }
    

Fylogenetische boom

Dit voorbeeld gebruikt een kleine set steekproefgegevens om de fylogenetische boom te bouwen die bovenaan deze pagina wordt getoond. Vega-Lite plott punten op de door jou opgegeven coördinaten, maar berekent zelf geen knooppuntposities voor een netwerkdiagram. Die berekening vindt plaats in de query voordat de data de grafiek bereikt, waarbij de query de x- en y-coördinaten van elk punt vooraf berekent. De query geeft drie recordtypen uit die de specificatie als aparte lagen weergeven: path rijen tekenen de gebogen takken, node rijen tekenen de bladcirkels en label rijen positioneren de groepslabels.

  1. Download de voorbeeldgegevens. Elke rij vertegenwoordigt een fossielvondst, met dig_longitude en dig_latitude die de coördinaten van de opgravingsplaats aangeeft.

    Download de voorbeeldgegevens

  2. Klik op het Dashboards-icoonDashboards in de zijbalk.

  3. Klik op Dashboard maken.

  4. Klik op het tabblad Gegevens.

  5. Klik op Data toevoegen en vervolgens op Data uploaden.

  6. Plaats het gedownloade bestand in de Create- of Wijzigen-tabel vanuit het uploadpaneel van het bestand .

  7. Kies de catalogus en het schema waar je de tabel wilt opslaan, en voer vervolgens een tabelnaam in.

  8. Klik op Tabel maken. De volledige tabel wordt automatisch toegevoegd als dataset.

  9. Klik op Add SQL dataset en plak de query in. In de FROM clausule van de query vervang je de catalogus-, schema- en tabelnamen door de namen die je gebruikte bij het aanmaken van de tabel.

  10. Maak de aangepaste visualisatie en volg de stappen in Maak een aangepaste visualisatie. Voeg in de sectie Velden de volgende velden toe, waarbij elke veldnaam als naam wordt gebruikt: record_type, x, , yfossil_tag, point_order, suborderroar_scoreclade_labelgenus_symbolfamily_taxonen .label_text Gebruik de specificatie als je Vega-Lite JSON.

SQL-query
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-specificatie
{
  "$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
        }
      }
    }
  ]
}

Meer specificaties van de kaart

In de volgende specificaties ziet u grafieken die niet beschikbaar zijn als ingebouwde visualisatietypen. Zie de Vega-Lite voorbeeldgalerieën voor meer voorbeelden.

Kogelgrafiek

Voorbeeld van een bulletdiagram.

Definieer categoryField, currentField, paceField en targetField in de sectie Velden.

JSON-specificatie
{
  "$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" }
        ]
      }
    }
  ]
}

Meter

Voorbeeld van meterdiagram.

Definieer $valueField en $totalField in het gedeelte Velden.

JSON-specificatie
{
  "$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" }
          ]
        }
      }
    }
  ]
}

Radardiagram

Voorbeeld van radardiagram.

Definieer $key en $value in het gedeelte Velden.

JSON-specificatie
{
  "$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 }
}

Radiaaldiagram

Voorbeeld van radiaaldiagram.

Definieer $valueField en $colorField in het gedeelte Velden.

JSON-specificatie
{
  "$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 }
}

Zonnestraaldiagram

Voorbeeld van zonnestraaldiagram.

Definieer outerGroupField, innerGroupFielden sizeField in de sectie Velden .

JSON-specificatie
{
  "$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

  • Treemapgrafieken worden niet ondersteund. Vega-Lite biedt geen ondersteuning voor treemaps.
  • Afbeeldingsmarkeringen ondersteunen alleen inline base64-afbeeldings-URL's data: (bijvoorbeeld data:image/png;base64,...) van 37 kB of minder, in PNG-, JPEG- of WebP-indeling. Externe afbeeldings-URL's (https: of http:), relatieve URL's, SVG-afbeeldingen en veld- of expressiegestuurde afbeeldings-URL's worden niet ondersteund.