From arcgis-maps-sdk-js-ai-context
Renders interactive charts from ArcGIS layer data using @arcgis/charts-components. Supports bar, line, pie, histogram, scatter, box plot, gauge, radar, and heat charts.
How this skill is triggered — by the user, by Claude, or both
Slash command
/arcgis-maps-sdk-js-ai-context:arcgis-chartsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this skill when visualizing layer data as charts (bar, line, pie, histogram, scatter, etc.) using the `@arcgis/charts-components` package. This is a **new component package in 5.0** with no 4.x equivalent.
Use this skill when visualizing layer data as charts (bar, line, pie, histogram, scatter, etc.) using the @arcgis/charts-components package. This is a new component package in 5.0 with no 4.x equivalent.
<!-- Load ArcGIS Maps SDK -->
<script src="https://js.arcgis.com/5.0/"></script>
<!-- Load Charts Components -->
<script
type="module"
src="https://js.arcgis.com/5.0/charts-components/"
></script>
import "@arcgis/charts-components/components/arcgis-chart";
import "@arcgis/charts-components/components/arcgis-charts-action-bar";
import { BarChartModel } from "@arcgis/charts-components/model";
import { PieChartModel } from "@arcgis/charts-components/model";
import { LineChartModel } from "@arcgis/charts-components/model";
import { HistogramModel } from "@arcgis/charts-components/model";
import { ScatterplotModel } from "@arcgis/charts-components/model";
import { BoxPlotModel } from "@arcgis/charts-components/model";
import { GaugeModel } from "@arcgis/charts-components/model";
import { RadarChartModel } from "@arcgis/charts-components/model";
import { HeatChartModel } from "@arcgis/charts-components/model";
import { ComboBarLineChartModel } from "@arcgis/charts-components/model";
| Chart Type | Model Class | Description |
|---|---|---|
| Bar | BarChartModel | Horizontal or vertical bar charts |
| Line | LineChartModel | Line charts with series |
| Pie | PieChartModel | Pie and donut charts |
| Histogram | HistogramModel | Frequency distribution histograms |
| Scatter | ScatterplotModel | Scatter and bubble plots |
| Box Plot | BoxPlotModel | Box and whisker plots |
| Gauge | GaugeModel | Gauge / speedometer charts |
| Radar | RadarChartModel | Radar / spider charts |
| Heat Chart | HeatChartModel | Heat / matrix charts |
| Combo | ComboBarLineChartModel | Combined bar and line charts |
| Property | Attribute | Type | Default | Description |
|---|---|---|---|---|
model | - | ChartModel | WebChart | - | Chart configuration model (set via JS) |
layer | - | FeatureLayerView | SupportedLayer | - | Data source layer (set via JS) |
view | - | MapView | SceneView | - | Map/scene view reference (set via JS) |
layerItemId | layer-item-id | string | - | Layer portal item ID (alternative to layer) |
chartIndex | chart-index | number | - | Index of chart to render when a layer has multiple charts |
actionMode | action-mode | string | - | Interaction mode: "zoom", "multiSelection", "multiSelectionWithCtrlKey", "pan" |
| Property | Attribute | Type | Default | Description |
|---|---|---|---|---|
disableInteractions | disable-interactions | boolean | false | Disable all chart interactions |
enableConfiguration | enable-configuration | boolean | false | Enable built-in chart configuration UI |
enableResponsiveFeatures | enable-responsive-features | boolean | - | Enable responsive behavior |
useAnimatedCharts | use-animated-charts | boolean | - | Enable chart animations |
hideEmptySeries | hide-empty-series | boolean | - | Hide series with no data |
hideLicenseWatermark | hide-license-watermark | boolean | - | Hide license watermark |
hideLoaderAnimation | hide-loader-animation | boolean | - | Hide loading animation |
placeholder | placeholder | string | - | Placeholder text when no data |
showUIMessages | show-ui-messages | boolean | - | Show user-facing messages |
errorPolicy | error-policy | string | "throw" | Error handling: "throw" or "ignore" |
| Property | Attribute | Type | Default | Description |
|---|---|---|---|---|
filterByExtent | filter-by-extent | boolean | - | Filter chart data by current map extent |
filterBySelection | filter-by-selection | boolean | - | Filter chart data by map selection |
syncSelection | sync-selection | boolean | false | Sync selection between chart and map |
runtimeDataFilters | - | WebChartDataFilters | - | Runtime data filters (set via JS) |
selectionData | - | SelectionData | - | Current selection data |
nullAsValid | null-as-valid | boolean | false | Treat null values as valid data points |
timeZone | time-zone | string | - | Time zone for temporal data |
| Property | Type | Description |
|---|---|---|
dataLabelFormatter | function | Custom formatting for data labels |
tooltipFormatter | function | Custom formatting for tooltips |
xAxisLabelFormatter | function | Custom formatting for X-axis labels |
yAxisLabelFormatter | function | Custom formatting for Y-axis labels |
gaugeInnerLabelFormatter | function | Custom formatting for gauge inner labels |
guideTooltipFormatter | function | Custom formatting for guide tooltips |
| Method | Returns | Description |
|---|---|---|
loadModel() | Promise<void> | Load the chart model |
refresh(props?) | Promise<void> | Refresh chart; optional { updateData, resetAxesBounds } |
resetZoom() | Promise<void> | Reset zoom to default view |
clearSelection() | Promise<void> | Clear all selections |
switchSelection() | Promise<void> | Switch selection state |
exportAsImage(format?) | Promise<void> | Export chart as "png", "jpg", or "svg" |
exportAsCSV(options?) | Promise<void> | Export chart data as CSV file |
errorAlert(message?) | Promise<void> | Display an error alert |
notify(message?, heading?) | Promise<void> | Show a notification |
componentOnReady() | Promise<this> | Resolves when the component is fully loaded |
| Event | Detail | Description |
|---|---|---|
arcgisSelectionChange | - | Fired when the chart selection changes |
arcgisDataFetchComplete | WebChartDataTypes | Fired when data has been fetched |
arcgisDataProcessComplete | - | Fired when data processing is complete |
arcgisUpdateComplete | ValidationStatus | Fired when chart updates are complete |
arcgisConfigChange | { newConfig, oldConfig, functionCalled } | Fired when chart configuration changes |
arcgisAxesMinMaxChange | AxesMinMaxChangePayload | Fired when axes min/max are computed |
arcgisBadDataWarningRaise | DataWarningObject | Fired when a data error is detected |
arcgisChartNotFoundWarning | string | Fired when a referenced chart is not found |
<arcgis-map id="map" item-id="YOUR_WEBMAP_ID">
<arcgis-zoom slot="top-left"></arcgis-zoom>
</arcgis-map>
<div id="chart-container" style="width: 500px; height: 400px;">
<arcgis-chart id="my-chart"></arcgis-chart>
</div>
<script type="module">
const mapElement = document.querySelector("arcgis-map");
const chartElement = document.querySelector("#my-chart");
await mapElement.viewOnReady();
const view = mapElement.view;
// Get the layer
const layer = view.map.layers.find((l) => l.title === "My Layer");
await view.whenLayerView(layer);
// Assign layer and view to chart
chartElement.layer = layer;
chartElement.view = view;
// Create a bar chart model
const { BarChartModel } = await $arcgis.import(
"@arcgis/charts-components/model",
);
const model = new BarChartModel();
model.layer = layer;
chartElement.model = model;
</script>
const chartElement = document.querySelector("arcgis-chart");
chartElement.layer = layer;
chartElement.view = view;
// WebChart JSON specification
chartElement.model = {
type: "bar",
title: { visible: true, text: "Population by State" },
series: [
{
type: "bar",
query: {
orderByFields: ["Population DESC"],
groupByFieldsForStatistics: ["State"],
outStatistics: [
{
statisticType: "sum",
onStatisticField: "Population",
outStatisticFieldName: "TotalPop",
},
],
},
x: "State",
y: "TotalPop",
},
],
};
const { PieChartModel } = await $arcgis.import(
"@arcgis/charts-components/model",
);
const model = new PieChartModel();
model.layer = layer;
const chartElement = document.querySelector("arcgis-chart");
chartElement.layer = layer;
chartElement.view = view;
chartElement.model = model;
const { LineChartModel } = await $arcgis.import(
"@arcgis/charts-components/model",
);
const model = new LineChartModel();
model.layer = layer;
const chartElement = document.querySelector("arcgis-chart");
chartElement.layer = layer;
chartElement.view = view;
chartElement.model = model;
Provides a toolbar for chart interactions (export, selection, filtering, zoom).
<div style="position: relative; width: 600px; height: 400px;">
<arcgis-chart id="my-chart"></arcgis-chart>
<arcgis-charts-action-bar id="my-action-bar"></arcgis-charts-action-bar>
</div>
<script type="module">
const chart = document.querySelector("#my-chart");
const actionBar = document.querySelector("#my-action-bar");
// Connect action bar to chart
actionBar.chartElement = chart;
</script>
| Property | Attribute | Type | Default | Description |
|---|---|---|---|---|
chartElement | chart-element | ArcgisChart | - | Reference to the chart component |
expanded | expanded | boolean | false | Whether the action bar is expanded |
exportAsImageState | export-as-image-state | string | "enabled" | Image export button state |
exportAsCSVState | export-as-csv-state | string | "enabled" | CSV export button state |
filterByExtentState | filter-by-extent-state | string | "enabled" | Filter by extent button state |
filterBySelectionState | filter-by-selection-state | string | "enabled" | Filter by selection button state |
zoomState | zoom-state | string | "enabled" | Zoom button state |
forceDisableActions | force-disable-actions | boolean | false | Disable all actions at once |
hiddenActions | - | DefaultChartActions[] | - | Array of actions to hide |
Action states can be "enabled", "disabled", or "hidden".
const chart = document.querySelector("arcgis-chart");
chart.syncSelection = true;
chart.layer = layer;
chart.view = view;
// Listen for selection changes
chart.addEventListener("arcgisSelectionChange", () => {
console.log("Selection changed:", chart.selectionData);
});
const chart = document.querySelector("arcgis-chart");
chart.filterByExtent = true;
chart.view = view;
chart.layer = layer;
const chart = document.querySelector("arcgis-chart");
chart.runtimeDataFilters = {
where: "Population > 100000",
orderByFields: ["Population DESC"],
};
const chart = document.querySelector("arcgis-chart");
await chart.exportAsImage("png"); // "png", "jpg", or "svg"
const chart = document.querySelector("arcgis-chart");
await chart.exportAsCSV();
const chart = document.querySelector("arcgis-chart");
chart.dataLabelFormatter = (value, field) => {
if (typeof value === "number") {
return value.toLocaleString("en-US", {
style: "currency",
currency: "USD",
});
}
return String(value);
};
chart.tooltipFormatter = (tooltipData) => {
return `<b>${tooltipData.category}</b>: ${tooltipData.value.toLocaleString()}`;
};
chart.xAxisLabelFormatter = (value) => {
// Truncate long labels
return String(value).length > 15
? String(value).slice(0, 12) + "..."
: String(value);
};
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Chart from Feature Layer</title>
<script src="https://js.arcgis.com/5.0/"></script>
<script
type="module"
src="https://js.arcgis.com/5.0/charts-components/"
></script>
<script
type="module"
src="https://js.arcgis.com/5.0/map-components/"
></script>
<style>
html,
body {
height: 100%;
margin: 0;
display: flex;
}
arcgis-map {
flex: 1;
}
#chart-panel {
width: 400px;
height: 100%;
}
</style>
</head>
<body>
<arcgis-map id="map" item-id="YOUR_WEBMAP_ID">
<arcgis-zoom slot="top-left"></arcgis-zoom>
</arcgis-map>
<div id="chart-panel">
<arcgis-chart id="chart"></arcgis-chart>
<arcgis-charts-action-bar id="action-bar"></arcgis-charts-action-bar>
</div>
<script type="module">
const mapElement = document.querySelector("#map");
const chartElement = document.querySelector("#chart");
const actionBar = document.querySelector("#action-bar");
await mapElement.viewOnReady();
const view = mapElement.view;
const layer = view.map.layers.getItemAt(0);
await view.whenLayerView(layer);
const { BarChartModel } = await $arcgis.import(
"@arcgis/charts-components/model",
);
const model = new BarChartModel();
model.layer = layer;
chartElement.layer = layer;
chartElement.view = view;
chartElement.model = model;
chartElement.syncSelection = true;
actionBar.chartElement = chartElement;
</script>
</body>
</html>
Missing layer property: The chart requires a layer data source. Setting only model without layer produces an empty chart.
// Anti-pattern: model without layer
chartElement.model = new BarChartModel();
// Correct: set both layer and model
const model = new BarChartModel();
model.layer = layer;
chartElement.layer = layer;
chartElement.model = model;
Impact: The chart renders its frame and axes but shows no data.
Chart component not loaded: The charts package must be explicitly loaded via CDN or imported.
<!-- Anti-pattern: missing charts-components script -->
<script src="https://js.arcgis.com/5.0/"></script>
<arcgis-chart></arcgis-chart>
<!-- Correct: include charts-components -->
<script src="https://js.arcgis.com/5.0/"></script>
<script
type="module"
src="https://js.arcgis.com/5.0/charts-components/"
></script>
<arcgis-chart></arcgis-chart>
Impact: The arcgis-chart element is not defined and renders as an empty inline element.
Setting model as an HTML attribute: The model property accepts complex objects and must be set via JavaScript, not as an HTML attribute.
Impact: The attribute value is ignored; the chart shows no data.
Using filterByExtent without view: Extent filtering requires the view property to track the current map extent.
// Anti-pattern: filterByExtent without view
chart.filterByExtent = true;
chart.layer = layer;
// Correct: set view for extent filtering
chart.filterByExtent = true;
chart.layer = layer;
chart.view = view;
Impact: The filter has no extent to reference and may throw errors or show all data.
Action bar not connected: The action bar needs a reference to the chart element.
// Anti-pattern: action bar without chart reference
const actionBar = document.querySelector("arcgis-charts-action-bar");
// Missing: actionBar.chartElement = chartElement;
Impact: Action bar buttons are visible but do nothing when clicked.
arcade-execute-chart - Execute Arcade expressions and build charts from resultsfeaturereduction-cluster-popup-chart - Charts inside cluster popupsfeaturereduction-cluster-pie-charts - Pie chart cluster representationsvisualization-pie-chart - Pie chart visualizationarcgis-layers for configuring FeatureLayers that supply chart data.arcgis-core-maps for setting up the MapView referenced by charts.arcgis-arcade for Arcade expressions used with chart data computation.arcgis-widgets-ui for layout components to host chart panels.npx claudepluginhub saschabrunnerch/arcgis-maps-sdk-js-ai-context --plugin arcgis-maps-sdk-js-ai-contextAuto-generates ArcGIS renderers for class breaks, unique values, heatmaps, dot density, relationships; calculates summary statistics and histograms from data.
Visualizes data on Mapbox maps using choropleths, heat maps, 3D extrusions, data-driven styling, and animated time-series. Covers layer types, color scales, and performance optimization.
Creates interactive geographic maps, choropleths, and spatial visualizations with GeoViews and GeoPandas. For point/line/polygon data, analysis like buffers/proximity, and tile basemaps.