/proto · contentitem/chart.proto
contentitem/chart.proto
High-Low-Open-Close / volume-HLC
Messages
19
Enums
20
Fields
214
Source
23.5 KB
Imports
0
ChartType enum · 18 values
| # | name | notes |
|---|---|---|
| 0 | CHART_UNKNOWN | |
| 1 | CHART_BAR | |
| 2 | CHART_LINE | |
| 3 | CHART_PIE | |
| 4 | CHART_SCATTER | |
| 5 | CHART_AREA | |
| 6 | CHART_DOUGHNUT | |
| 7 | CHART_RADAR | |
| 8 | CHART_BUBBLE | |
| 9 | CHART_BAR_3D | |
| 10 | CHART_LINE_3D | |
| 11 | CHART_PIE_3D | |
| 12 | CHART_AREA_3D | |
| 13 | CHART_COMBO | |
| 14 | CHART_STOCK | |
| 15 | CHART_SURFACE | High-Low-Open-Close / volume-HLC |
| 16 | CHART_SURFACE_3D | 2D wireframe surface |
| 17 | CHART_OF_PIE | 3D surface mesh |
LineDash enum · 12 values
pie-of-pie / bar-of-pie
| # | name | notes |
|---|---|---|
| 0 | LINE_DASH_UNKNOWN | |
| 1 | LINE_DASH_SOLID | |
| 2 | LINE_DASH_DOT | |
| 3 | LINE_DASH_DASH | |
| 4 | LINE_DASH_LARGE_DASH | |
| 5 | LINE_DASH_DASH_DOT | |
| 6 | LINE_DASH_LARGE_DASH_DOT | |
| 7 | LINE_DASH_LARGE_DASH_DOT_DOT | |
| 8 | LINE_DASH_SYS_DASH | |
| 9 | LINE_DASH_SYS_DOT | |
| 10 | LINE_DASH_SYS_DASH_DOT | |
| 11 | LINE_DASH_SYS_DASH_DOT_DOT |
MarkerStyle enum · 13 values
| # | name | notes |
|---|---|---|
| 0 | MARKER_UNKNOWN | |
| 1 | MARKER_NONE | |
| 2 | MARKER_CIRCLE | |
| 3 | MARKER_SQUARE | |
| 4 | MARKER_DIAMOND | |
| 5 | MARKER_TRIANGLE | |
| 6 | MARKER_X | |
| 7 | MARKER_STAR | |
| 8 | MARKER_PLUS | |
| 9 | MARKER_DASH | |
| 10 | MARKER_DOT | |
| 11 | MARKER_PICTURE | |
| 12 | MARKER_AUTO |
LegendPosition enum · 7 values
| # | name | notes |
|---|---|---|
| 0 | LEGEND_POS_UNKNOWN | |
| 1 | LEGEND_POS_NONE | |
| 2 | LEGEND_POS_RIGHT | |
| 3 | LEGEND_POS_TOP | |
| 4 | LEGEND_POS_LEFT | |
| 5 | LEGEND_POS_BOTTOM | |
| 6 | LEGEND_POS_TOP_RIGHT |
Grouping enum · 5 values
How a series' values combine across categories. For bar/col/line/area.
| # | name | notes |
|---|---|---|
| 0 | GROUPING_UNKNOWN | |
| 1 | GROUPING_CLUSTERED | |
| 2 | GROUPING_STACKED | side-by-side |
| 3 | GROUPING_PERCENT_STACKED | absolute stack |
| 4 | GROUPING_STANDARD | 100% stack |
BarDirection enum · 3 values
line/area default
Orientation for bar/col charts.
| # | name | notes |
|---|---|---|
| 0 | BAR_DIR_UNKNOWN | |
| 1 | BAR_DIR_COL | |
| 2 | BAR_DIR_BAR | vertical (default) |
TickMark enum · 5 values
horizontal
Axis tick-mark style.
| # | name | notes |
|---|---|---|
| 0 | TICK_MARK_UNKNOWN | |
| 1 | TICK_MARK_NONE | |
| 2 | TICK_MARK_IN | |
| 3 | TICK_MARK_OUT | |
| 4 | TICK_MARK_CROSS |
TickLabelPos enum · 5 values
Where axis tick labels render.
| # | name | notes |
|---|---|---|
| 0 | TICK_LBL_POS_UNKNOWN | |
| 1 | TICK_LBL_POS_NONE | |
| 2 | TICK_LBL_POS_LOW | |
| 3 | TICK_LBL_POS_HIGH | |
| 4 | TICK_LBL_POS_NEXT_TO |
ScatterStyle enum · 7 values
default — next to the axis
Scatter-chart sub-style.
| # | name | notes |
|---|---|---|
| 0 | SCATTER_STYLE_UNKNOWN | |
| 1 | SCATTER_STYLE_LINE | |
| 2 | SCATTER_STYLE_LINE_MARKER | |
| 3 | SCATTER_STYLE_MARKER | |
| 4 | SCATTER_STYLE_SMOOTH | |
| 5 | SCATTER_STYLE_SMOOTH_MARKER | |
| 6 | SCATTER_STYLE_NONE |
RadarStyle enum · 4 values
Radar-chart sub-style.
| # | name | notes |
|---|---|---|
| 0 | RADAR_STYLE_UNKNOWN | |
| 1 | RADAR_STYLE_STANDARD | |
| 2 | RADAR_STYLE_MARKER | |
| 3 | RADAR_STYLE_FILLED |
DispBlanksAs enum · 4 values
How to treat empty cells in the chart data range.
| # | name | notes |
|---|---|---|
| 0 | DISP_BLANKS_UNKNOWN | |
| 1 | DISP_BLANKS_GAP | |
| 2 | DISP_BLANKS_ZERO | leave a gap (default) |
| 3 | DISP_BLANKS_SPAN | treat as zero |
AxisCrosses enum · 5 values
connect data points across the gap
Axis crossing behavior — where the perpendicular axis crosses this one.
| # | name | notes |
|---|---|---|
| 0 | AXIS_CROSSES_UNKNOWN | |
| 1 | AXIS_CROSSES_AUTO_ZERO | |
| 2 | AXIS_CROSSES_MIN | default — cross at 0 / first category |
| 3 | AXIS_CROSSES_MAX | cross at axis minimum |
| 4 | AXIS_CROSSES_CUSTOM | cross at axis maximum |
DispUnits enum · 11 values
cross at AxisConfig.crosses_at value
Axis display-units scaling — divides tick labels by a power of 10.
| # | name | notes |
|---|---|---|
| 0 | DISP_UNITS_UNKNOWN | |
| 1 | DISP_UNITS_NONE | |
| 2 | DISP_UNITS_HUNDREDS | |
| 3 | DISP_UNITS_THOUSANDS | |
| 4 | DISP_UNITS_TEN_THOUSANDS | |
| 5 | DISP_UNITS_HUNDRED_THOUSANDS | |
| 6 | DISP_UNITS_MILLIONS | |
| 7 | DISP_UNITS_TEN_MILLIONS | |
| 8 | DISP_UNITS_HUNDRED_MILLIONS | |
| 9 | DISP_UNITS_BILLIONS | |
| 10 | DISP_UNITS_TRILLIONS |
OfPieType enum · 3 values
Of-pie sub-chart type and split rule (for CHART_OF_PIE).
| # | name | notes |
|---|---|---|
| 0 | OF_PIE_TYPE_UNKNOWN | |
| 1 | OF_PIE_TYPE_PIE | |
| 2 | OF_PIE_TYPE_BAR | second chart is a pie |
OfPieSplit enum · 6 values
second chart is a bar
| # | name | notes |
|---|---|---|
| 0 | OF_PIE_SPLIT_UNKNOWN | |
| 1 | OF_PIE_SPLIT_AUTO | |
| 2 | OF_PIE_SPLIT_POS | |
| 3 | OF_PIE_SPLIT_VAL | split by position (last N) |
| 4 | OF_PIE_SPLIT_PERCENT | split by value threshold |
| 5 | OF_PIE_SPLIT_CUSTOM | split by percentage threshold |
DataPoint message · 11 fields
explicit per-point flags
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | single | double | value | |
| 2 | optional | string | label | |
| 3 | optional | uint32 | override_color_rgba | |
| 4 | optional | double | x_value | For scatter/bubble: one point carries its own X and, for bubble, a size. Line/bar/pie charts ignore these and use `value` as Y. |
| 5 | optional | double | bubble_size | |
| 6 | optional | Marker | marker | Per-point overrides (rare; fall back to series-level when unset). |
| 7 | optional | LineStyle | line | per-point marker style |
| 8 | optional | double | explosion | per-point line stroke (for dPt.spPr.ln) |
| 9 | optional | string | custom_text | per-slice pull for pie/doughnut |
| 10 | optional | bool | bubble_3d | c:dLbl > c:tx > c:rich override text |
| 11 | optional | int32 | ohlc_role | per-bubble 3D flag For stock charts: which of the OHLC roles this point represents. 0=unset (default), 1=open, 2=high, 3=low, 4=close, 5=volume. |
FrameStyle message · 7 fields
Reserved for forward extensibility.
Reusable shape styling — shared by chart area, plot area, and other
rectangular frame decorations. Any omitted field means "inherit from
the surrounding style (theme, preset, parent frame)".
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | optional | uint32 | fill_color_rgba | |
| 2 | optional | uint32 | border_color_rgba | |
| 3 | optional | int32 | border_width_mpx | |
| 4 | optional | LineDash | border_dash | |
| 5 | optional | int32 | fill_opacity | Opacity of the frame fill (0..1000, 1000 = opaque). Frame border is always opaque; use the dedicated color field for transparency there. |
| 6 | optional | int32 | border_radius_mpx | Border corner radius in milli-pixels (0 = square). |
| 7 | optional | string | fill_desc | Serialized rich fill (gradient/pattern/image) as a CSS-ish descriptor. When present, `fill_color_rgba` is the solid-color fallback. |
TextStyle message · 9 fields
Reusable text styling — used for axis labels, data labels, chart title.
Field semantics match the DrawingML a:defRPr / a:rPr pair.
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | optional | string | font_family | |
| 2 | optional | int32 | size_hundredths_pt | |
| 3 | optional | uint32 | color_rgba | sz attribute (100 == 1pt) |
| 4 | optional | bool | bold | |
| 5 | optional | bool | italic | |
| 6 | optional | bool | underline | |
| 7 | optional | bool | strikethrough | |
| 8 | optional | int32 | rotation_60k | Rotation in 1/60000 of a degree (matches DrawingML a:bodyPr @rot). Positive = clockwise. Keeps full OOXML precision without float. |
| 9 | optional | string | fill_desc | Text fill as gradient / pattern descriptor (rare for chart text). |
DLblPos enum · 10 values
Placement of data labels relative to the data point / bar / slice.
| # | name | notes |
|---|---|---|
| 0 | DLBL_POS_UNKNOWN | |
| 1 | DLBL_POS_CTR | |
| 2 | DLBL_POS_IN_END | centered |
| 3 | DLBL_POS_OUT_END | bar/col: top-inside of bar |
| 4 | DLBL_POS_IN_BASE | bar/col: outside top |
| 5 | DLBL_POS_BEST_FIT | bar/col: inside base |
| 6 | DLBL_POS_TOP | pie: auto-fit |
| 7 | DLBL_POS_BOTTOM | |
| 8 | DLBL_POS_LEFT | |
| 9 | DLBL_POS_RIGHT |
Trendline message · 10 fields
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | single | Type | type | |
| 2 | optional | int32 | order | |
| 3 | optional | string | name | poly degree (2..6) |
| 4 | optional | bool | display_equation | |
| 5 | optional | bool | display_r_squared | |
| 6 | optional | LineStyle | line | |
| 7 | optional | double | forward | |
| 8 | optional | double | backward | extrapolate forward N units |
| 9 | optional | double | intercept | extrapolate backward N units |
| 10 | optional | int32 | period | force a Y-intercept value Moving-average period (c:period) — only for TRENDLINE_MOVING_AVG. When type == TRENDLINE_POLY use `order` instead. |
Trendline. Type enum · 7 values
| # | name | notes |
|---|---|---|
| 0 | TRENDLINE_UNKNOWN | |
| 1 | TRENDLINE_LINEAR | |
| 2 | TRENDLINE_LOG | |
| 3 | TRENDLINE_POLY | |
| 4 | TRENDLINE_POWER | |
| 5 | TRENDLINE_EXP | |
| 6 | TRENDLINE_MOVING_AVG |
ErrorBars message · 10 fields
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | single | ValType | val_type | |
| 2 | single | ErrDir | direction | |
| 3 | single | ErrBarType | bar_type | |
| 4 | optional | double | value | |
| 5 | optional | bool | no_end_cap | |
| 6 | optional | LineStyle | line | |
| 7 | optional | double | plus_value | Asymmetric error values (c:plus / c:minus). When present, `value` is ignored in favor of these explicit bounds. For ERR_VAL_CUST with per-point arrays, use `plus_values` / `minus_values` packed arrays. |
| 8 | optional | double | minus_value | |
| 9 | repeated | double | plus_values | [packed = true] |
| 10 | repeated | double | minus_values | [packed = true] |
ErrorBars. ValType enum · 6 values
| # | name | notes |
|---|---|---|
| 0 | ERR_VAL_UNKNOWN | |
| 1 | ERR_VAL_FIXED | |
| 2 | ERR_VAL_PERCENTAGE | |
| 3 | ERR_VAL_STDDEV | |
| 4 | ERR_VAL_STDERR | |
| 5 | ERR_VAL_CUST |
ErrorBars. ErrDir enum · 3 values
| # | name | notes |
|---|---|---|
| 0 | ERR_DIR_UNKNOWN | |
| 1 | ERR_DIR_X | |
| 2 | ERR_DIR_Y |
ErrorBars. ErrBarType enum · 4 values
| # | name | notes |
|---|---|---|
| 0 | ERR_BAR_UNKNOWN | |
| 1 | ERR_BAR_BOTH | |
| 2 | ERR_BAR_MINUS | |
| 3 | ERR_BAR_PLUS |
LineStyle message · 8 fields
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | optional | uint32 | color_rgba | |
| 2 | optional | int32 | width_mpx | |
| 3 | optional | LineDash | dash | 1000 = 1px |
| 4 | optional | bool | smooth | |
| 5 | optional | int32 | cap | Bezier smoothing Line cap: 0=unset (flat), 1=flat/butt, 2=round, 3=square. |
| 6 | optional | int32 | compound | Line compound: 0=single, 1=double, 2=thickThin, 3=thinThick, 4=triple. |
| 7 | optional | int32 | join | Line join: 0=unset (miter), 1=miter, 2=round, 3=bevel. |
| 8 | repeated | int32 | custom_dash_mpx | Custom dash as alternating mpx segments (when dash == LINE_DASH_UNKNOWN but the user supplied a bespoke pattern). Empty → use `dash` enum. [packed = true] |
Marker message · 5 fields
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | single | MarkerStyle | style | |
| 2 | optional | int32 | size_mpx | |
| 3 | optional | uint32 | color_rgba | 1000 = 1px |
| 4 | optional | LineStyle | stroke | Marker stroke (border around marker glyph). Falls back to series line. |
| 5 | optional | string | picture_src | For MARKER_PICTURE — image filename ref in the asset sidecar registry. |
DataLabels message · 13 fields
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | single | bool | show_value | |
| 2 | single | bool | show_category_name | |
| 3 | single | bool | show_series_name | |
| 4 | single | bool | show_percentage | |
| 5 | single | bool | show_legend_key | |
| 6 | optional | string | number_format | |
| 7 | optional | DLblPos | position | |
| 8 | optional | TextStyle | text_style | |
| 9 | optional | bool | show_bubble_size | Extensions. |
| 10 | optional | string | separator | c:showBubbleSize |
| 11 | optional | bool | show_leader_lines | text between label parts (e.g. "\n" or ", ") |
| 12 | optional | LineStyle | leader_line_style | pie/doughnut only |
| 13 | optional | FrameStyle | fill_style | stroke of the leader connector |
Legend message · 4 fields
background rect of the label
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | single | LegendPosition | position | |
| 2 | single | bool | overlay | |
| 3 | optional | FrameStyle | frame_style | Styling of the legend frame + entry text (rare but OOXML allows it). |
| 4 | optional | TextStyle | text_style |
Series message · 21 fields
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | optional | string | name | |
| 2 | repeated | DataPoint | points | |
| 3 | optional | uint32 | color_rgba | |
| 4 | optional | LineStyle | line | |
| 5 | optional | Marker | marker | |
| 6 | optional | DataLabels | data_labels | |
| 7 | optional | ChartType | chart_type | Combo-chart support: the series' own chart-type (bar vs line etc.) and whether it plots against the secondary value axis. |
| 8 | optional | bool | on_secondary_axis | |
| 9 | optional | bool | smooth | Series-level rendering tweaks. |
| 10 | optional | bool | invert_if_negative | line/scatter Bezier smoothing |
| 11 | optional | double | explosion | bar/col flip color for negative |
| 12 | repeated | Trendline | trendlines | pie slice pull, 0.0 .. 1.0 (or raw %) |
| 13 | repeated | ErrorBars | error_bars | |
| 14 | optional | string | value_formula | Data source expressions (c:f formula strings) — opaque to the renderer but preserved so an editor can re-bind the series to a spreadsheet cell range. |
| 15 | optional | string | category_formula | c:val/c:yVal/c:numRef/c:f |
| 16 | optional | string | bubble_size_formula | c:cat/c:xVal/c:strRef or numRef/c:f |
| 17 | optional | string | name_formula | c:bubbleSize/c:numRef/c:f |
| 18 | optional | string | fill_desc | c:tx/c:strRef/c:f Fill that's a gradient / pattern / image rather than a solid color. When present, `color_rgba` is the fallback (first stop / fg color) and the renderer should prefer this field. Serialized as a compact CSS-ish descriptor string; full structured fill is stored via the shared Fill primitive on page.proto. Kept as string here to avoid a cross-proto dependency inside the chart sidecar. |
| 19 | optional | LineStyle | leader_line_style | Leader-line style (pie/doughnut) — inherits from chart-level DataLabels.leader_line_style when unset. |
| 20 | optional | int32 | picture_options | Picture-fill options for bar/column series with an image fill: 0=stretch, 1=stack, 2=stackScale. |
| 21 | optional | bool | hidden | Hidden/deleted series flag (c:hidden or c:spPr > a:noFill + empty values). Series stays in data model so axis scale is preserved but renderer hides it. |
ManualLayout message · 8 fields
Manual layout override (c:layout > c:manualLayout) for chart frame
subregions (title / legend / plot area). Coordinates are fractions of
the parent chart-area bounding box in the 0.0 .. 1.0 range (mirrors
OOXML's 0..1 ST_LayoutMode="factor" semantics). Missing fields mean
"auto-lay-out this dimension".
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | optional | double | x | |
| 2 | optional | double | y | left, fraction of parent width |
| 3 | optional | double | width | top, fraction of parent height |
| 4 | optional | double | height | fraction of parent width |
| 5 | optional | int32 | x_mode | fraction of parent height When present, selects between "factor" (fraction of parent bbox) and "edge" (absolute offset from top-left) semantics per axis. 0 = unspecified (factor), 1 = edge, 2 = factor. |
| 6 | optional | int32 | y_mode | |
| 7 | optional | int32 | w_mode | |
| 8 | optional | int32 | h_mode |
UpDownBars message · 3 fields
Up/Down bars for line + stock charts (c:upDownBars).
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | optional | int32 | gap_width_pct | |
| 2 | optional | FrameStyle | up_style | c:gapWidth (default 150) |
| 3 | optional | FrameStyle | down_style | up bars (when close > open) |
HiLowLines message · 1 field
down bars (when close < open)
Hi-Low lines for line/stock charts (c:hiLowLines) — vertical lines
connecting the highest and lowest series at each category.
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | optional | LineStyle | line |
DropLines message · 1 field
Drop lines for line/area charts (c:dropLines) — vertical lines from
each data point down to the category axis.
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | optional | LineStyle | line |
OfPieConfig message · 7 fields
Of-pie secondary chart configuration (c:ofPieChart).
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | single | OfPieType | of_pie_type | |
| 2 | single | OfPieSplit | split_type | |
| 3 | optional | double | split_pos | |
| 4 | repeated | int32 | custom_split | threshold value when split_type != AUTO [packed = true] |
| 5 | optional | int32 | second_pie_size_pct | per-point 0/1 assignment |
| 6 | optional | int32 | gap_width_pct | size of the secondary chart (5..200) |
| 7 | optional | LineStyle | series_line | c:gapWidth between primary and secondary |
ThemeContext message · 9 fields
line connecting the two pies
Theme context snapshot — the slide-master/theme values resolved at
extract time so the chart renders identically even when detached from
the page or its theme is later edited. All fields optional; the
renderer falls back to built-in defaults for anything absent.
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | repeated | uint32 | accent_rgba | [packed = true] |
| 2 | optional | string | major_font_family | accent1..accent6 RGBA |
| 3 | optional | string | minor_font_family | theme +mj-lt / mj-ea / mj-cs latin |
| 4 | optional | int32 | default_font_size_mpx | theme +mn-lt / mn-ea / mn-cs latin |
| 5 | optional | uint32 | text_primary_rgba | body text size in mpx (1000 = 1px) |
| 6 | optional | uint32 | background_rgba | primary text color (lt1/dk1 resolved) |
| 7 | optional | uint32 | hyperlink_rgba | slide bg resolved color |
| 8 | optional | uint32 | followed_hyperlink_rgba | |
| 9 | repeated | int32 | line_width_mpx | Format scheme (fillStyleLst / lnStyleLst) default line weights in mpx — index 0 = first subtle, 1 = moderate, 2 = intense. Used when a chart references a style_id that expects theme line widths. [packed = true] |
AxisConfig message · 33 fields
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | optional | string | title | |
| 2 | optional | double | min_val | |
| 3 | optional | double | max_val | |
| 4 | optional | string | number_format | |
| 5 | optional | bool | show_gridlines | |
| 6 | optional | int32 | label_rotation_deg | major gridlines |
| 7 | optional | bool | log_scale | |
| 8 | optional | int32 | log_base | |
| 9 | optional | bool | show_minor_gridlines | Visual axis style. |
| 10 | optional | TickMark | major_tick_mark | |
| 11 | optional | TickMark | minor_tick_mark | |
| 12 | optional | TickLabelPos | tick_label_pos | |
| 13 | optional | double | major_unit | Axis scale steps. |
| 14 | optional | double | minor_unit | |
| 15 | optional | uint32 | line_color_rgba | Axis line color/width, drawn with the tick marks. |
| 16 | optional | int32 | line_width_mpx | |
| 17 | optional | TextStyle | label_style | Axis label text styling (font / size / color / bold / italic). |
| 18 | optional | string | base_time_unit | Date axis (when the category axis is a c:dateAx): base unit for formatting, plus majorUnit / minorUnit time-unit expressed as a string ("days" | "months" | "years") because the numeric major_unit above is unit-agnostic. |
| 19 | optional | string | major_time_unit | |
| 20 | optional | string | minor_time_unit | |
| 21 | optional | AxisCrosses | crosses | Crossing behavior — where the perpendicular axis crosses this one. |
| 22 | optional | double | crosses_at | |
| 23 | optional | int32 | label_offset_pct | used when crosses == CUSTOM Label offset (c:lblOffset) — 0..1000 as 1/1000 of a percentage. Default 100 in OOXML. |
| 24 | optional | int32 | label_alignment | Label alignment on category axis: "ctr"/"l"/"r" → 0=unset,1=ctr,2=l,3=r. |
| 25 | optional | int32 | tick_label_skip | Skip every N tick labels (c:tickLblSkip). 1 = show every label. |
| 26 | optional | int32 | tick_mark_skip | Skip every N tick marks (c:tickMarkSkip). 1 = show every tick. |
| 27 | optional | DispUnits | display_units | Display-units scaling and label (c:dispUnits). |
| 28 | optional | bool | show_display_units_label | |
| 29 | optional | string | display_units_label | |
| 30 | optional | int32 | axis_position | Axis position on chart frame: 0=unset, 1=b(bottom), 2=t(top), 3=l(left), 4=r(right). Mirrors c:axPos. |
| 31 | optional | bool | delete_axis | Axis deletion — c:delete. When true, hides the axis line and ticks but keeps the axis in the scale calculation. |
| 32 | optional | bool | reversed | Reversed plot order (c:scaling > c:orientation val="maxMin"). |
| 33 | optional | bool | auto_scale | Auto-scaling flag (c:auto) — when true, min/max are computed from data rather than taken from min_val/max_val above. |
ChartData message · 51 fields
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | single | int32 | slide_index | |
| 2 | single | int32 | chart_index | |
| 3 | single | ChartType | type | |
| 4 | repeated | string | categories | |
| 5 | repeated | Series | series | |
| 6 | optional | AxisConfig | category_axis | |
| 7 | optional | AxisConfig | value_axis | |
| 8 | optional | string | title | |
| 9 | repeated | int32 | bounds | Position on slide (milli-pixels): [left, top, width, height, z] [packed = true] |
| 10 | optional | Legend | legend | |
| 11 | optional | DataLabels | data_labels | |
| 12 | optional | AxisConfig | secondary_value_axis | Second value axis for dual-scale / combo charts. Series with on_secondary_axis=true plot against this axis. |
| 13 | optional | Grouping | grouping | Chart-type-specific modifiers. |
| 14 | optional | BarDirection | bar_direction | bar/col/line/area grouping |
| 15 | optional | int32 | bar_gap_width | bar/col orientation |
| 16 | optional | int32 | bar_overlap | between category groups, percent (150 = 150%) |
| 17 | optional | int32 | first_slice_angle | between bars within a group, -100..100 percent |
| 18 | optional | int32 | doughnut_hole_size | pie: start angle in degrees |
| 19 | optional | ScatterStyle | scatter_style | doughnut hole size, percent 10..90 |
| 20 | optional | RadarStyle | radar_style | |
| 21 | optional | DispBlanksAs | disp_blanks_as | |
| 22 | optional | bool | plot_visible_only | |
| 23 | optional | int32 | view3d_rot_x_deg | plotVisOnly flag 3D-chart view angles (valid for bar3D/line3D/pie3D/area3D). |
| 24 | optional | int32 | view3d_rot_y_deg | -90..90 |
| 25 | optional | int32 | view3d_depth_pct | 0..359 |
| 26 | optional | int32 | view3d_perspective | |
| 27 | optional | FrameStyle | chart_area_style | 0..100 Chart framing — the two rectangular regions every chart has: chart_area = the entire chart bounding box plot_area = the inner area where series are drawn |
| 28 | optional | FrameStyle | plot_area_style | |
| 29 | optional | TextStyle | title_style | Font for the chart title (text comes from `title` above). |
| 30 | optional | int32 | bubble_scale_pct | Bubble-chart modifiers (when type == CHART_BUBBLE). |
| 31 | optional | bool | bubble_size_represents_width | 0..300 (% of default) |
| 32 | optional | bool | show_neg_bubbles | false = area (default) |
| 33 | optional | bool | bubble_3d | |
| 34 | optional | bool | auto_title_deleted | Title auto-deletion flag — when true, renderer must not auto-generate a title from the single-series name even if `title` is empty. |
| 35 | optional | bool | date_1904 | 1904 epoch for date-axis numeric values. Default (false) = 1900 epoch. |
| 36 | optional | int32 | view3d_h_pct | Additional 3D view angles. |
| 37 | optional | bool | view3d_r_ang_ax | height % (5..500) |
| 38 | optional | ManualLayout | title_layout | right-angle axes (no perspective distortion) Manual layout overrides for chart frame subregions. |
| 39 | optional | ManualLayout | legend_layout | |
| 40 | optional | ManualLayout | plot_layout | |
| 41 | optional | ThemeContext | theme_context | Theme context snapshot — baked at extract time so rendering is independent of live theme state. Renderer uses this to assign default series colors (accent1..6 cycle) and default fonts. |
| 42 | optional | UpDownBars | up_down_bars | Line/stock chart drop-shadow overlays. |
| 43 | optional | HiLowLines | hi_low_lines | |
| 44 | optional | DropLines | drop_lines | |
| 45 | optional | OfPieConfig | of_pie | CHART_OF_PIE specific configuration. Only meaningful when type == CHART_OF_PIE. |
| 46 | optional | int32 | style_id | ChartEx style catalog reference (c:style val="N" for 2007-2013, cs:chartStyle @styleId for 2016+). 0 = no style, 1..48 = built-in catalog entry. The renderer consults its baked-in style catalog to resolve fills, strokes, fonts in the absence of inline overrides. |
| 47 | repeated | int32 | hidden_legend_entries | Axis label text and styling for the secondary value axis legend entry (c:legendEntry > c:delete per-entry hide, rare). [packed = true] |
| 48 | repeated | int32 | clr_map_override | ChartEx style variant — some decks declare `c:clrMapOvr` overriding the slide theme's color map inside the chart. Stored as an array of 8 mapping ints (bg1,tx1,bg2,tx2,accent1..6 each resolved to theme slot index). Empty array = no override. [packed = true] |
| 49 | optional | Marker | default_marker | Chart-level default marker (c:marker under chart type group) applied when series don't set their own. |
| 50 | optional | uint32 | content_item_id | Owning page ContentItem id. Page order and placement stay in page.pb; chart.pb remains the cold/native chart model for that visible item. |
| 100 | optional | bytes | unknown_ext | Forward-compatible extension bytes. Unknown future extensions can be round-tripped without schema changes. |
Charts message · 3 fields
| # | label | type | name | notes |
|---|---|---|---|---|
| 1 | repeated | ChartData | charts | |
| 2 | optional | int32 | schema_version | Schema version — increment on incompatible layout changes so the renderer can fall back to a migration path. |
| 3 | optional | ThemeContext | deck_theme_context | Deck-level theme context — when every chart shares a single theme (common case), this is populated once and per-chart `theme_context` is left unset to save bytes. Renderer merges deck-level with per-chart (per-chart wins on collision). |
§Raw schema
syntax = "proto3";
package eddocu.chart.v3;
enum ChartType {
CHART_UNKNOWN = 0;
CHART_BAR = 1;
CHART_LINE = 2;
CHART_PIE = 3;
CHART_SCATTER = 4;
CHART_AREA = 5;
CHART_DOUGHNUT = 6;
CHART_RADAR = 7;
CHART_BUBBLE = 8;
CHART_BAR_3D = 9;
CHART_LINE_3D = 10;
CHART_PIE_3D = 11;
CHART_AREA_3D = 12;
CHART_COMBO = 13;
CHART_STOCK = 14; // High-Low-Open-Close / volume-HLC
CHART_SURFACE = 15; // 2D wireframe surface
CHART_SURFACE_3D = 16; // 3D surface mesh
CHART_OF_PIE = 17; // pie-of-pie / bar-of-pie
}
enum LineDash {
LINE_DASH_UNKNOWN = 0;
LINE_DASH_SOLID = 1;
LINE_DASH_DOT = 2;
LINE_DASH_DASH = 3;
LINE_DASH_LARGE_DASH = 4;
LINE_DASH_DASH_DOT = 5;
LINE_DASH_LARGE_DASH_DOT = 6;
LINE_DASH_LARGE_DASH_DOT_DOT = 7;
LINE_DASH_SYS_DASH = 8;
LINE_DASH_SYS_DOT = 9;
LINE_DASH_SYS_DASH_DOT = 10;
LINE_DASH_SYS_DASH_DOT_DOT = 11;
}
enum MarkerStyle {
MARKER_UNKNOWN = 0;
MARKER_NONE = 1;
MARKER_CIRCLE = 2;
MARKER_SQUARE = 3;
MARKER_DIAMOND = 4;
MARKER_TRIANGLE = 5;
MARKER_X = 6;
MARKER_STAR = 7;
MARKER_PLUS = 8;
MARKER_DASH = 9;
MARKER_DOT = 10;
MARKER_PICTURE = 11;
MARKER_AUTO = 12;
}
enum LegendPosition {
LEGEND_POS_UNKNOWN = 0;
LEGEND_POS_NONE = 1;
LEGEND_POS_RIGHT = 2;
LEGEND_POS_TOP = 3;
LEGEND_POS_LEFT = 4;
LEGEND_POS_BOTTOM = 5;
LEGEND_POS_TOP_RIGHT = 6;
}
// How a series' values combine across categories. For bar/col/line/area.
enum Grouping {
GROUPING_UNKNOWN = 0;
GROUPING_CLUSTERED = 1; // side-by-side
GROUPING_STACKED = 2; // absolute stack
GROUPING_PERCENT_STACKED = 3;// 100% stack
GROUPING_STANDARD = 4; // line/area default
}
// Orientation for bar/col charts.
enum BarDirection {
BAR_DIR_UNKNOWN = 0;
BAR_DIR_COL = 1; // vertical (default)
BAR_DIR_BAR = 2; // horizontal
}
// Axis tick-mark style.
enum TickMark {
TICK_MARK_UNKNOWN = 0;
TICK_MARK_NONE = 1;
TICK_MARK_IN = 2;
TICK_MARK_OUT = 3;
TICK_MARK_CROSS = 4;
}
// Where axis tick labels render.
enum TickLabelPos {
TICK_LBL_POS_UNKNOWN = 0;
TICK_LBL_POS_NONE = 1;
TICK_LBL_POS_LOW = 2;
TICK_LBL_POS_HIGH = 3;
TICK_LBL_POS_NEXT_TO = 4; // default — next to the axis
}
// Scatter-chart sub-style.
enum ScatterStyle {
SCATTER_STYLE_UNKNOWN = 0;
SCATTER_STYLE_LINE = 1;
SCATTER_STYLE_LINE_MARKER = 2;
SCATTER_STYLE_MARKER = 3;
SCATTER_STYLE_SMOOTH = 4;
SCATTER_STYLE_SMOOTH_MARKER = 5;
SCATTER_STYLE_NONE = 6;
}
// Radar-chart sub-style.
enum RadarStyle {
RADAR_STYLE_UNKNOWN = 0;
RADAR_STYLE_STANDARD = 1;
RADAR_STYLE_MARKER = 2;
RADAR_STYLE_FILLED = 3;
}
// How to treat empty cells in the chart data range.
enum DispBlanksAs {
DISP_BLANKS_UNKNOWN = 0;
DISP_BLANKS_GAP = 1; // leave a gap (default)
DISP_BLANKS_ZERO = 2; // treat as zero
DISP_BLANKS_SPAN = 3; // connect data points across the gap
}
// Axis crossing behavior — where the perpendicular axis crosses this one.
enum AxisCrosses {
AXIS_CROSSES_UNKNOWN = 0;
AXIS_CROSSES_AUTO_ZERO = 1; // default — cross at 0 / first category
AXIS_CROSSES_MIN = 2; // cross at axis minimum
AXIS_CROSSES_MAX = 3; // cross at axis maximum
AXIS_CROSSES_CUSTOM = 4; // cross at AxisConfig.crosses_at value
}
// Axis display-units scaling — divides tick labels by a power of 10.
enum DispUnits {
DISP_UNITS_UNKNOWN = 0;
DISP_UNITS_NONE = 1;
DISP_UNITS_HUNDREDS = 2;
DISP_UNITS_THOUSANDS = 3;
DISP_UNITS_TEN_THOUSANDS = 4;
DISP_UNITS_HUNDRED_THOUSANDS = 5;
DISP_UNITS_MILLIONS = 6;
DISP_UNITS_TEN_MILLIONS = 7;
DISP_UNITS_HUNDRED_MILLIONS = 8;
DISP_UNITS_BILLIONS = 9;
DISP_UNITS_TRILLIONS = 10;
}
// Of-pie sub-chart type and split rule (for CHART_OF_PIE).
enum OfPieType {
OF_PIE_TYPE_UNKNOWN = 0;
OF_PIE_TYPE_PIE = 1; // second chart is a pie
OF_PIE_TYPE_BAR = 2; // second chart is a bar
}
enum OfPieSplit {
OF_PIE_SPLIT_UNKNOWN = 0;
OF_PIE_SPLIT_AUTO = 1;
OF_PIE_SPLIT_POS = 2; // split by position (last N)
OF_PIE_SPLIT_VAL = 3; // split by value threshold
OF_PIE_SPLIT_PERCENT = 4; // split by percentage threshold
OF_PIE_SPLIT_CUSTOM = 5; // explicit per-point flags
}
message DataPoint {
double value = 1;
optional string label = 2;
optional uint32 override_color_rgba = 3;
// For scatter/bubble: one point carries its own X and, for bubble, a
// size. Line/bar/pie charts ignore these and use `value` as Y.
optional double x_value = 4;
optional double bubble_size = 5;
// Per-point overrides (rare; fall back to series-level when unset).
optional Marker marker = 6; // per-point marker style
optional LineStyle line = 7; // per-point line stroke (for dPt.spPr.ln)
optional double explosion = 8; // per-slice pull for pie/doughnut
optional string custom_text = 9; // c:dLbl > c:tx > c:rich override text
optional bool bubble_3d = 10; // per-bubble 3D flag
// For stock charts: which of the OHLC roles this point represents.
// 0=unset (default), 1=open, 2=high, 3=low, 4=close, 5=volume.
optional int32 ohlc_role = 11;
// Reserved for forward extensibility.
}
// Reusable shape styling — shared by chart area, plot area, and other
// rectangular frame decorations. Any omitted field means "inherit from
// the surrounding style (theme, preset, parent frame)".
message FrameStyle {
optional uint32 fill_color_rgba = 1;
optional uint32 border_color_rgba = 2;
optional int32 border_width_mpx = 3;
optional LineDash border_dash = 4;
// Opacity of the frame fill (0..1000, 1000 = opaque). Frame border is
// always opaque; use the dedicated color field for transparency there.
optional int32 fill_opacity = 5;
// Border corner radius in milli-pixels (0 = square).
optional int32 border_radius_mpx = 6;
// Serialized rich fill (gradient/pattern/image) as a CSS-ish descriptor.
// When present, `fill_color_rgba` is the solid-color fallback.
optional string fill_desc = 7;
}
// Reusable text styling — used for axis labels, data labels, chart title.
// Field semantics match the DrawingML a:defRPr / a:rPr pair.
message TextStyle {
optional string font_family = 1;
optional int32 size_hundredths_pt = 2; // sz attribute (100 == 1pt)
optional uint32 color_rgba = 3;
optional bool bold = 4;
optional bool italic = 5;
optional bool underline = 6;
optional bool strikethrough = 7;
// Rotation in 1/60000 of a degree (matches DrawingML a:bodyPr @rot).
// Positive = clockwise. Keeps full OOXML precision without float.
optional int32 rotation_60k = 8;
// Text fill as gradient / pattern descriptor (rare for chart text).
optional string fill_desc = 9;
}
// Placement of data labels relative to the data point / bar / slice.
enum DLblPos {
DLBL_POS_UNKNOWN = 0;
DLBL_POS_CTR = 1; // centered
DLBL_POS_IN_END = 2; // bar/col: top-inside of bar
DLBL_POS_OUT_END = 3; // bar/col: outside top
DLBL_POS_IN_BASE = 4; // bar/col: inside base
DLBL_POS_BEST_FIT = 5; // pie: auto-fit
DLBL_POS_TOP = 6;
DLBL_POS_BOTTOM = 7;
DLBL_POS_LEFT = 8;
DLBL_POS_RIGHT = 9;
}
message Trendline {
enum Type {
TRENDLINE_UNKNOWN = 0;
TRENDLINE_LINEAR = 1;
TRENDLINE_LOG = 2;
TRENDLINE_POLY = 3;
TRENDLINE_POWER = 4;
TRENDLINE_EXP = 5;
TRENDLINE_MOVING_AVG = 6;
}
Type type = 1;
optional int32 order = 2; // poly degree (2..6)
optional string name = 3;
optional bool display_equation = 4;
optional bool display_r_squared = 5;
optional LineStyle line = 6;
optional double forward = 7; // extrapolate forward N units
optional double backward = 8; // extrapolate backward N units
optional double intercept = 9; // force a Y-intercept value
// Moving-average period (c:period) — only for TRENDLINE_MOVING_AVG.
// When type == TRENDLINE_POLY use `order` instead.
optional int32 period = 10;
}
message ErrorBars {
enum ValType {
ERR_VAL_UNKNOWN = 0;
ERR_VAL_FIXED = 1;
ERR_VAL_PERCENTAGE = 2;
ERR_VAL_STDDEV = 3;
ERR_VAL_STDERR = 4;
ERR_VAL_CUST = 5;
}
enum ErrDir {
ERR_DIR_UNKNOWN = 0;
ERR_DIR_X = 1;
ERR_DIR_Y = 2;
}
enum ErrBarType {
ERR_BAR_UNKNOWN = 0;
ERR_BAR_BOTH = 1;
ERR_BAR_MINUS = 2;
ERR_BAR_PLUS = 3;
}
ValType val_type = 1;
ErrDir direction = 2;
ErrBarType bar_type = 3;
optional double value = 4;
optional bool no_end_cap = 5;
optional LineStyle line = 6;
// Asymmetric error values (c:plus / c:minus). When present, `value` is
// ignored in favor of these explicit bounds. For ERR_VAL_CUST with
// per-point arrays, use `plus_values` / `minus_values` packed arrays.
optional double plus_value = 7;
optional double minus_value = 8;
repeated double plus_values = 9 [packed=true];
repeated double minus_values = 10 [packed=true];
}
message LineStyle {
optional uint32 color_rgba = 1;
optional int32 width_mpx = 2; // 1000 = 1px
optional LineDash dash = 3;
optional bool smooth = 4; // Bezier smoothing
// Line cap: 0=unset (flat), 1=flat/butt, 2=round, 3=square.
optional int32 cap = 5;
// Line compound: 0=single, 1=double, 2=thickThin, 3=thinThick, 4=triple.
optional int32 compound = 6;
// Line join: 0=unset (miter), 1=miter, 2=round, 3=bevel.
optional int32 join = 7;
// Custom dash as alternating mpx segments (when dash == LINE_DASH_UNKNOWN
// but the user supplied a bespoke pattern). Empty → use `dash` enum.
repeated int32 custom_dash_mpx = 8 [packed=true];
}
message Marker {
MarkerStyle style = 1;
optional int32 size_mpx = 2; // 1000 = 1px
optional uint32 color_rgba = 3;
// Marker stroke (border around marker glyph). Falls back to series line.
optional LineStyle stroke = 4;
// For MARKER_PICTURE — image filename ref in the asset sidecar registry.
optional string picture_src = 5;
}
message DataLabels {
bool show_value = 1;
bool show_category_name = 2;
bool show_series_name = 3;
bool show_percentage = 4;
bool show_legend_key = 5;
optional string number_format = 6;
optional DLblPos position = 7;
optional TextStyle text_style = 8;
// Extensions.
optional bool show_bubble_size = 9; // c:showBubbleSize
optional string separator = 10; // text between label parts (e.g. "\n" or ", ")
optional bool show_leader_lines = 11; // pie/doughnut only
optional LineStyle leader_line_style = 12; // stroke of the leader connector
optional FrameStyle fill_style = 13; // background rect of the label
}
message Legend {
LegendPosition position = 1;
bool overlay = 2;
// Styling of the legend frame + entry text (rare but OOXML allows it).
optional FrameStyle frame_style = 3;
optional TextStyle text_style = 4;
}
message Series {
optional string name = 1;
repeated DataPoint points = 2;
optional uint32 color_rgba = 3;
optional LineStyle line = 4;
optional Marker marker = 5;
optional DataLabels data_labels = 6;
// Combo-chart support: the series' own chart-type (bar vs line etc.)
// and whether it plots against the secondary value axis.
optional ChartType chart_type = 7;
optional bool on_secondary_axis = 8;
// Series-level rendering tweaks.
optional bool smooth = 9; // line/scatter Bezier smoothing
optional bool invert_if_negative = 10; // bar/col flip color for negative
optional double explosion = 11; // pie slice pull, 0.0 .. 1.0 (or raw %)
repeated Trendline trendlines = 12;
repeated ErrorBars error_bars = 13;
// Data source expressions (c:f formula strings) — opaque to the renderer
// but preserved so an editor can re-bind the series to a spreadsheet
// cell range.
optional string value_formula = 14; // c:val/c:yVal/c:numRef/c:f
optional string category_formula = 15; // c:cat/c:xVal/c:strRef or numRef/c:f
optional string bubble_size_formula = 16; // c:bubbleSize/c:numRef/c:f
optional string name_formula = 17; // c:tx/c:strRef/c:f
// Fill that's a gradient / pattern / image rather than a solid color.
// When present, `color_rgba` is the fallback (first stop / fg color)
// and the renderer should prefer this field. Serialized as a compact
// CSS-ish descriptor string; full structured fill is stored via the
// shared Fill primitive on page.proto. Kept as string here to avoid
// a cross-proto dependency inside the chart sidecar.
optional string fill_desc = 18;
// Leader-line style (pie/doughnut) — inherits from chart-level
// DataLabels.leader_line_style when unset.
optional LineStyle leader_line_style = 19;
// Picture-fill options for bar/column series with an image fill:
// 0=stretch, 1=stack, 2=stackScale.
optional int32 picture_options = 20;
// Hidden/deleted series flag (c:hidden or c:spPr > a:noFill + empty values).
// Series stays in data model so axis scale is preserved but renderer hides it.
optional bool hidden = 21;
}
// Manual layout override (c:layout > c:manualLayout) for chart frame
// subregions (title / legend / plot area). Coordinates are fractions of
// the parent chart-area bounding box in the 0.0 .. 1.0 range (mirrors
// OOXML's 0..1 ST_LayoutMode="factor" semantics). Missing fields mean
// "auto-lay-out this dimension".
message ManualLayout {
optional double x = 1; // left, fraction of parent width
optional double y = 2; // top, fraction of parent height
optional double width = 3; // fraction of parent width
optional double height = 4; // fraction of parent height
// When present, selects between "factor" (fraction of parent bbox) and
// "edge" (absolute offset from top-left) semantics per axis.
// 0 = unspecified (factor), 1 = edge, 2 = factor.
optional int32 x_mode = 5;
optional int32 y_mode = 6;
optional int32 w_mode = 7;
optional int32 h_mode = 8;
}
// Up/Down bars for line + stock charts (c:upDownBars).
message UpDownBars {
optional int32 gap_width_pct = 1; // c:gapWidth (default 150)
optional FrameStyle up_style = 2; // up bars (when close > open)
optional FrameStyle down_style = 3; // down bars (when close < open)
}
// Hi-Low lines for line/stock charts (c:hiLowLines) — vertical lines
// connecting the highest and lowest series at each category.
message HiLowLines {
optional LineStyle line = 1;
}
// Drop lines for line/area charts (c:dropLines) — vertical lines from
// each data point down to the category axis.
message DropLines {
optional LineStyle line = 1;
}
// Of-pie secondary chart configuration (c:ofPieChart).
message OfPieConfig {
OfPieType of_pie_type = 1;
OfPieSplit split_type = 2;
optional double split_pos = 3; // threshold value when split_type != AUTO
repeated int32 custom_split = 4 [packed=true]; // per-point 0/1 assignment
optional int32 second_pie_size_pct = 5; // size of the secondary chart (5..200)
optional int32 gap_width_pct = 6; // c:gapWidth between primary and secondary
optional LineStyle series_line = 7; // line connecting the two pies
}
// Theme context snapshot — the slide-master/theme values resolved at
// extract time so the chart renders identically even when detached from
// the page or its theme is later edited. All fields optional; the
// renderer falls back to built-in defaults for anything absent.
message ThemeContext {
repeated uint32 accent_rgba = 1 [packed=true]; // accent1..accent6 RGBA
optional string major_font_family = 2; // theme +mj-lt / mj-ea / mj-cs latin
optional string minor_font_family = 3; // theme +mn-lt / mn-ea / mn-cs latin
optional int32 default_font_size_mpx = 4; // body text size in mpx (1000 = 1px)
optional uint32 text_primary_rgba = 5; // primary text color (lt1/dk1 resolved)
optional uint32 background_rgba = 6; // slide bg resolved color
optional uint32 hyperlink_rgba = 7;
optional uint32 followed_hyperlink_rgba = 8;
// Format scheme (fillStyleLst / lnStyleLst) default line weights in mpx —
// index 0 = first subtle, 1 = moderate, 2 = intense. Used when a chart
// references a style_id that expects theme line widths.
repeated int32 line_width_mpx = 9 [packed=true];
}
message AxisConfig {
optional string title = 1;
optional double min_val = 2;
optional double max_val = 3;
optional string number_format = 4;
optional bool show_gridlines = 5; // major gridlines
optional int32 label_rotation_deg = 6;
optional bool log_scale = 7;
optional int32 log_base = 8;
// Visual axis style.
optional bool show_minor_gridlines = 9;
optional TickMark major_tick_mark = 10;
optional TickMark minor_tick_mark = 11;
optional TickLabelPos tick_label_pos = 12;
// Axis scale steps.
optional double major_unit = 13;
optional double minor_unit = 14;
// Axis line color/width, drawn with the tick marks.
optional uint32 line_color_rgba = 15;
optional int32 line_width_mpx = 16;
// Axis label text styling (font / size / color / bold / italic).
optional TextStyle label_style = 17;
// Date axis (when the category axis is a c:dateAx): base unit for
// formatting, plus majorUnit / minorUnit time-unit expressed as a
// string ("days" | "months" | "years") because the numeric major_unit
// above is unit-agnostic.
optional string base_time_unit = 18;
optional string major_time_unit = 19;
optional string minor_time_unit = 20;
// Crossing behavior — where the perpendicular axis crosses this one.
optional AxisCrosses crosses = 21;
optional double crosses_at = 22; // used when crosses == CUSTOM
// Label offset (c:lblOffset) — 0..1000 as 1/1000 of a percentage.
// Default 100 in OOXML.
optional int32 label_offset_pct = 23;
// Label alignment on category axis: "ctr"/"l"/"r" → 0=unset,1=ctr,2=l,3=r.
optional int32 label_alignment = 24;
// Skip every N tick labels (c:tickLblSkip). 1 = show every label.
optional int32 tick_label_skip = 25;
// Skip every N tick marks (c:tickMarkSkip). 1 = show every tick.
optional int32 tick_mark_skip = 26;
// Display-units scaling and label (c:dispUnits).
optional DispUnits display_units = 27;
optional bool show_display_units_label = 28;
optional string display_units_label = 29;
// Axis position on chart frame: 0=unset, 1=b(bottom), 2=t(top),
// 3=l(left), 4=r(right). Mirrors c:axPos.
optional int32 axis_position = 30;
// Axis deletion — c:delete. When true, hides the axis line and ticks
// but keeps the axis in the scale calculation.
optional bool delete_axis = 31;
// Reversed plot order (c:scaling > c:orientation val="maxMin").
optional bool reversed = 32;
// Auto-scaling flag (c:auto) — when true, min/max are computed from
// data rather than taken from min_val/max_val above.
optional bool auto_scale = 33;
}
message ChartData {
int32 slide_index = 1;
int32 chart_index = 2;
ChartType type = 3;
repeated string categories = 4;
repeated Series series = 5;
optional AxisConfig category_axis = 6;
optional AxisConfig value_axis = 7;
optional string title = 8;
// Position on slide (milli-pixels): [left, top, width, height, z]
repeated int32 bounds = 9 [packed=true];
optional Legend legend = 10;
optional DataLabels data_labels = 11;
// Second value axis for dual-scale / combo charts. Series with
// on_secondary_axis=true plot against this axis.
optional AxisConfig secondary_value_axis = 12;
// Chart-type-specific modifiers.
optional Grouping grouping = 13; // bar/col/line/area grouping
optional BarDirection bar_direction = 14; // bar/col orientation
optional int32 bar_gap_width = 15; // between category groups, percent (150 = 150%)
optional int32 bar_overlap = 16; // between bars within a group, -100..100 percent
optional int32 first_slice_angle = 17; // pie: start angle in degrees
optional int32 doughnut_hole_size = 18;// doughnut hole size, percent 10..90
optional ScatterStyle scatter_style = 19;
optional RadarStyle radar_style = 20;
optional DispBlanksAs disp_blanks_as = 21;
optional bool plot_visible_only = 22; // plotVisOnly flag
// 3D-chart view angles (valid for bar3D/line3D/pie3D/area3D).
optional int32 view3d_rot_x_deg = 23; // -90..90
optional int32 view3d_rot_y_deg = 24; // 0..359
optional int32 view3d_depth_pct = 25;
optional int32 view3d_perspective = 26;// 0..100
// Chart framing — the two rectangular regions every chart has:
// chart_area = the entire chart bounding box
// plot_area = the inner area where series are drawn
optional FrameStyle chart_area_style = 27;
optional FrameStyle plot_area_style = 28;
// Font for the chart title (text comes from `title` above).
optional TextStyle title_style = 29;
// Bubble-chart modifiers (when type == CHART_BUBBLE).
optional int32 bubble_scale_pct = 30; // 0..300 (% of default)
optional bool bubble_size_represents_width = 31; // false = area (default)
optional bool show_neg_bubbles = 32;
optional bool bubble_3d = 33;
// Title auto-deletion flag — when true, renderer must not auto-generate
// a title from the single-series name even if `title` is empty.
optional bool auto_title_deleted = 34;
// 1904 epoch for date-axis numeric values. Default (false) = 1900 epoch.
optional bool date_1904 = 35;
// Additional 3D view angles.
optional int32 view3d_h_pct = 36; // height % (5..500)
optional bool view3d_r_ang_ax = 37; // right-angle axes (no perspective distortion)
// Manual layout overrides for chart frame subregions.
optional ManualLayout title_layout = 38;
optional ManualLayout legend_layout = 39;
optional ManualLayout plot_layout = 40;
// Theme context snapshot — baked at extract time so rendering is
// independent of live theme state. Renderer uses this to assign
// default series colors (accent1..6 cycle) and default fonts.
optional ThemeContext theme_context = 41;
// Line/stock chart drop-shadow overlays.
optional UpDownBars up_down_bars = 42;
optional HiLowLines hi_low_lines = 43;
optional DropLines drop_lines = 44;
// CHART_OF_PIE specific configuration. Only meaningful when type == CHART_OF_PIE.
optional OfPieConfig of_pie = 45;
// ChartEx style catalog reference (c:style val="N" for 2007-2013,
// cs:chartStyle @styleId for 2016+). 0 = no style, 1..48 = built-in
// catalog entry. The renderer consults its baked-in style catalog
// to resolve fills, strokes, fonts in the absence of inline overrides.
optional int32 style_id = 46;
// Axis label text and styling for the secondary value axis legend
// entry (c:legendEntry > c:delete per-entry hide, rare).
repeated int32 hidden_legend_entries = 47 [packed=true];
// ChartEx style variant — some decks declare `c:clrMapOvr` overriding
// the slide theme's color map inside the chart. Stored as an array of
// 8 mapping ints (bg1,tx1,bg2,tx2,accent1..6 each resolved to theme
// slot index). Empty array = no override.
repeated int32 clr_map_override = 48 [packed=true];
// Chart-level default marker (c:marker under chart type group) applied
// when series don't set their own.
optional Marker default_marker = 49;
// Owning page ContentItem id. Page order and placement stay in page.pb;
// chart.pb remains the cold/native chart model for that visible item.
optional uint32 content_item_id = 50;
// Forward-compatible extension bytes. Unknown future extensions can be
// round-tripped without schema changes.
optional bytes unknown_ext = 100;
}
message Charts {
repeated ChartData charts = 1;
// Schema version — increment on incompatible layout changes so the
// renderer can fall back to a migration path.
optional int32 schema_version = 2;
// Deck-level theme context — when every chart shares a single theme
// (common case), this is populated once and per-chart `theme_context`
// is left unset to save bytes. Renderer merges deck-level with
// per-chart (per-chart wins on collision).
optional ThemeContext deck_theme_context = 3;
}