Charts¶
Actions¶
| Tool | Action | Parameters | Notes |
|---|---|---|---|
chart | add-chart | session_id, slide_index, chart_type, left, top, width, height, categories (string array), series_name (string), values (double array) | Creates a native chart shape with one data series. |
chart | get-chart-data | session_id, slide_index, shape_index | Returns categoryCount and seriesCount of an existing chart — dimensions only, not the raw values. |
chart | add-series | session_id, slide_index, shape_index, series_name, values (double array) | Adds one more data series to an existing chart. values length must match the chart's existing category count. Call repeatedly to build an N-series chart. |
chart | replace-chart-data | session_id, slide_index, shape_index, categories (string array), series_names (string array), series_values (double array, series-major flat) | Replaces ALL of an existing chart's categories/series/values in one call — including changing the category count. See "Replacing Chart Data" below for the flat layout. |
chart | set-chart-title | session_id, slide_index, shape_index, title | Sets/shows the chart's title text. |
chart | get-chart-title | session_id, slide_index, shape_index | Returns hasTitle and, if present, title. |
chart | set-axis-title | session_id, slide_index, shape_index, axis_type ("category" or "value"), title | Sets the title of the category (X) or value (Y) axis. |
chart | get-axis-title | session_id, slide_index, shape_index, axis_type ("category" or "value") | Returns the axis title text. |
chart | set-legend-visibility | session_id, slide_index, shape_index, visible (bool) | Shows/hides the chart's legend. |
chart | get-legend-visibility | session_id, slide_index, shape_index | Returns legendVisible. |
chart | set-style | session_id, slide_index, shape_index, style (integer, 1-48) | Applies a built-in chart layout/style and returns chartStyle. |
chart | get-style | session_id, slide_index, shape_index | Returns the current chartStyle. |
chart | set-color-style | session_id, slide_index, shape_index, color_style (integer, 1-26) | Applies a built-in chart color palette and returns colorStyle. |
chart | get-color-style | session_id, slide_index, shape_index | Returns the current colorStyle. |
chart | set-data-table | session_id, slide_index, shape_index, visible (bool) | Shows or hides the chart's data table and returns hasDataTable. |
chart | get-data-table | session_id, slide_index, shape_index | Returns hasDataTable. |
Supported Chart Types¶
chart_type is a plain string: "bar", "line", or "pie". There is no doughnut, scatter, area, or 3D variant in this tool surface — pick the closest of the three:
| Need | Use |
|---|---|
| Comparing categories side by side | "bar" |
| Trend over time | "line" |
| Part-of-whole (few categories) | "pie" |
Multi-Series Charts¶
chart(action: "add-chart", ...) always creates the chart with exactly one series. To add more series (e.g., "Revenue" and "Cost" side by side), call chart(action: "add-series", ...) once per additional series against the shape returned by add-chart:
chart(action: "add-chart", session_id: ..., slide_index: ..., chart_type: "bar",
left: 60, top: 120, width: 500, height: 300,
categories: ["Q1", "Q2", "Q3", "Q4"],
series_name: "Revenue",
values: [120.0, 150.0, 170.0, 210.0])
## → shapeIndex from the result above
chart(action: "add-series", session_id: ..., slide_index: ..., shape_index: <shapeIndex>,
series_name: "Cost", values: [80.0, 95.0, 110.0, 130.0])
Each add-series call's values array length must match the chart's existing category count (from the original add-chart call) — a mismatch returns Success=false without throwing.
Replacing Chart Data¶
Unlike add-series (which appends one more series to the existing category count), chart(action: "replace-chart-data", ...) wholesale-replaces an existing chart's categories, series names, and values in a single call — including changing the number of categories. This avoids the delete-shape-and-recreate workaround mentioned above.
series_values is a flat, series-major array: all values for series_names[0] first, then all values for series_names[1], etc. Its length must equal categories.length * series_names.length.
chart(action: "replace-chart-data", session_id: ..., slide_index: ..., shape_index: <shapeIndex>,
categories: ["Jan", "Feb", "Mar", "Apr"],
series_names: ["Revenue", "Cost"],
# Revenue: 100, 200, 300, 400 — then Cost: 50, 60, 70, 80
series_values: [100.0, 200.0, 300.0, 400.0, 50.0, 60.0, 70.0, 80.0])
A mismatched series_values length or an invalid/non-chart shape_index returns Success=false without throwing.
Pie Charts¶
For "pie", categories become the slice labels and values the slice sizes — keep to 6 or fewer categories so labels stay legible once rendered. add-series is rarely useful on a pie chart (pie charts render only their first series).
Titles and Legend¶
Use set-chart-title/set-axis-title to label the chart and its axes directly, instead of (or in addition to) a nearby text-box callout:
chart(action: "set-chart-title", session_id: ..., slide_index: ..., shape_index: ..., title: "Quarterly Revenue")
chart(action: "set-axis-title", session_id: ..., slide_index: ..., shape_index: ..., axis_type: "category", title: "Quarter")
chart(action: "set-axis-title", session_id: ..., slide_index: ..., shape_index: ..., axis_type: "value", title: "USD (thousands)")
chart(action: "set-legend-visibility", session_id: ..., slide_index: ..., shape_index: ..., visible: true)
set-legend-visibility with visible: true is recommended whenever a chart has more than one series — without a visible legend, a multi-series chart's colors are unlabeled.
Quick Formatting¶
Use the paired style, color-style, and data-table actions to make a chart visually consistent and then verify the saved state:
chart(action: "set-style", session_id: ..., slide_index: ..., shape_index: ..., style: 10)
chart(action: "get-style", session_id: ..., slide_index: ..., shape_index: ...)
chart(action: "set-color-style", session_id: ..., slide_index: ..., shape_index: ..., color_style: 4)
chart(action: "get-color-style", session_id: ..., slide_index: ..., shape_index: ...)
chart(action: "set-data-table", session_id: ..., slide_index: ..., shape_index: ..., visible: true)
chart(action: "get-data-table", session_id: ..., slide_index: ..., shape_index: ...)
Direct PIA characterization tests verify that installed PowerPoint accepts style 48 and color style 26, then rejects the first following values (49 and 27) without changing the chart. Range tests exercise every accepted value. Commands return Success=false before PowerPoint is called for values outside those observed ranges, so invalid input does not change the chart or destabilize the presentation session.
Sizing and Placement¶
- Keep charts within the slide's safe area (see
deck-builder.mdpositioning reference). - Leave room beside or below the chart for a text-box callout describing the key takeaway, unless you've already used
set-chart-title/set-axis-titleto label it directly. - Minimum practical size:
width ≥ 300, height ≥ 200— smaller charts render illegibly once exported.
Reading Back Chart Data¶
chart(action: "get-chart-data", ...) only reports categoryCount/seriesCount — it does not return the actual category labels or values. Use it to confirm a chart was created with the expected shape (e.g., 4 categories, 1 series) after add-chart, not to recover the original data for editing. To change the category labels or values, use replace-chart-data (see "Replacing Chart Data" above) rather than deleting and recreating the shape.
Verify Visually¶
Charts are the highest-value target for export(action: "export-slide-to-image", ...) — data-entry mistakes (wrong values, mismatched category count) are invisible from a get-chart-data call alone but obvious in the rendered image. Always export and inspect after add-chart/add-series (see export-and-verify.md).