Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
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:
- Wählen Sie ein Dataset aus.
- Wählen Sie im Visualisierungskonfigurationsbereich unter dem Abschnitt "Erweiterte Visualisierung" die Option "Custom Viz" aus.
- 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.
- 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 diexFieldSpalte der X-Achse zugewiesen:"encoding": { "x": { "field": "xField", "type": "quantitative" } }In Ausdrücken verwenden
datum["{columnName}"]oderdatum.{columnName}. Im folgenden Beispiel wird eine neuex-Spalte aus den Spaltenrundangledefiniert:{ "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
namemuss genaudatabricks_mark_selectionsein. Jeder andere Name wird als normaler Parameter behandelt und führt keine Kreuzfilterung durch. -
select.typemuss den Wertpointhaben. Intervallauswahlen (Pinsel) werden nicht als Kreuzfilterquellen unterstützt. -
select.fieldsmuss die im Abschnitt "Felder" der Widgetkonfiguration definierten Feldnamen und nicht die unformatierten Spaltennamen auflisten. - Führen Sie in
select.fieldsnur Dimensionsfelder (Gruppierung) auf. Aggregierte Maße wieSUM(...)oderAVG(...)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.
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;Wählen Sie im Visualisierungskonfigurationsbereich unter "Erweitert" die Option "Benutzerdefinierte Viz" aus.
Wählen Sie das Dataset aus, das Sie im vorherigen Schritt erstellt haben.
Fügen Sie im Abschnitt "Felder " ein Feld für die Datumsspalte hinzu, und legen Sie dessen Name auf
date.Fügen Sie ein Feld für die Temperaturspalte hinzu, und legen Sie den Namen auf
temp_max.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.
Laden Sie die Beispieldaten herunter. Jede Reihe stellt einen Fossilfund dar, wobei
dig_longitudeunddig_latitudedie Ausgrabungskoordinaten angegeben sind.Klicken Sie in der Seitenleiste auf
Dashboards.Klicken Sie auf "Dashboard erstellen".
Klicken Sie auf die Registerkarte Daten .
Klicken Sie auf Daten hinzufügen und dann auf Daten hochladen.
Fügen Sie die heruntergeladene Datei in die Erstellungs- oder Änderungstabelle aus dem Datei-Upload-Fenster ein.
Wählen Sie den Katalog und das Schema , in dem Sie die Tabelle speichern möchten, und geben Sie dann einen Tabellennamen ein.
Klicken Sie auf "Tabelle erstellen". Die vollständige Tabelle wird automatisch als Datensatz hinzugefügt.
Klicken Sie auf SQL-Datensatz hinzufügen und fügen Sie die Abfrage ein. Ersetzen Sie in der
FROMKlausel der Abfrage die Namen des Katalogs, Schemas und der Tabelle durch die, die Sie bei der Erstellung der Tabelle verwendet haben.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_textNutze 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
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
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
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
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
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 Beispieldata:image/png;base64,...) mit 37 KB oder weniger im PNG-, JPEG- oder WebP-Format. Remotebild-URLs (https:oderhttp:), relative URLs, SVG-Bilder und Feld- oder ausdrucksgesteuerte Bild-URLs werden nicht unterstützt.