Files
wehub-resource-sync 8cb1f9f479
Publish SDK (PyPI) / publish (push) Has been cancelled
Publish SDK (npm) / publish (@aionui/officecli-sdk) (push) Has been cancelled
SDK smoke / smoke (windows-latest) (push) Has been cancelled
Publish SDK (npm) / publish (@officecli/officecli-sdk) (push) Has been cancelled
Publish SDK (npm) / publish (@officecli/sdk) (push) Has been cancelled
Publish SDK (npm) / publish (officecli-sdk) (push) Has been cancelled
SDK smoke / smoke (macos-latest) (push) Has been cancelled
SDK smoke / smoke (ubuntu-latest) (push) Has been cancelled
Skill parity / diff (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:09:29 +08:00

484 lines
21 KiB
Python

#!/usr/bin/env python3
"""
Scatter Charts Showcase — scatter with all marker, trendline, error bar, and styling variations.
Generates: charts-scatter.xlsx
Every scatter chart feature officecli supports is demonstrated at least once:
scatter styles, marker types, smooth curves, trendlines (linear, polynomial,
exponential, logarithmic, power, movingAvg), error bars, axis scaling,
gridlines, data labels, legend, fills, shadows, borders, secondary axis,
reference lines, log scale, and color rules.
6 sheets, 24 charts total.
1-Scatter Fundamentals 4 charts — basic scatter, marker-only, smooth curve, line-only
2-Marker Styles 4 charts — per-series markers, shapes, sizes, toggle
3-Trendlines 4 charts — linear, polynomial, exponential, per-series
4-Error Bars 4 charts — fixed, percent, stddev, stderr
5-Styling 4 charts — title/shadow, gradients, axis/grid, borders
6-Advanced 4 charts — secondary axis, reference line, log scale, color rule
SDK twin of charts-scatter.sh (officecli CLI). Both produce an equivalent
charts-scatter.xlsx. This one drives the **officecli Python SDK**
(`pip install officecli-sdk`): one resident is started and every sheet and
chart is shipped over the named pipe in a single `doc.batch(...)` round-trip.
Each item is the same `{"command","parent","type","props"}` dict you'd put in
an `officecli batch` list.
Usage:
pip install officecli-sdk # plus the `officecli` binary on PATH
python3 charts-scatter.py
"""
import os
import sys
# --- locate the SDK: prefer an installed `officecli-sdk`, else the in-repo copy
try:
import officecli # pip install officecli-sdk
except ImportError:
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
"..", "..", "..", "sdk", "python"))
import officecli
FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "charts-scatter.xlsx")
def sheet(name):
"""One `add sheet` item in batch-shape."""
return {"command": "add", "parent": "/", "type": "sheet", "props": {"name": name}}
def chart(parent, **props):
"""One `add chart` item in batch-shape."""
return {"command": "add", "parent": parent, "type": "chart", "props": props}
print(f"Building {FILE} ...")
with officecli.create(FILE, "--force") as doc:
items = [
# ==================================================================
# Sheet: 1-Scatter Fundamentals
# ==================================================================
sheet("1-Scatter Fundamentals"),
# Chart 1: Basic scatter with circle markers and connecting lines
# Features: chartType=scatter, marker=circle, markerSize=6, lineWidth=1.5,
# catTitle, axisTitle, legend
chart("/1-Scatter Fundamentals",
chartType="scatter",
title="Height vs Weight",
categories="160,165,170,175,180,185,190",
series1="Male:62,68,72,78,82,88,95",
series2="Female:50,55,58,62,65,70,74",
colors="2E75B6,ED7D31",
x="0", y="0", width="12", height="18",
marker="circle", markerSize="6",
lineWidth="1.5",
catTitle="Height (cm)", axisTitle="Weight (kg)",
legend="bottom"),
# Chart 2: Scatter marker-only (scatterStyle=marker), various marker sizes
# Features: scatterStyle=marker (no connecting lines), markerSize=8,
# gridlines styling
chart("/1-Scatter Fundamentals",
chartType="scatter",
scatterStyle="marker",
title="Study Hours vs Test Score",
categories="1,2,3,4,5,6,7,8",
series1="Class A:55,60,65,72,78,82,88,92",
series2="Class B:50,58,62,68,74,80,85,90",
colors="4472C4,70AD47",
x="13", y="0", width="12", height="18",
markerSize="8",
catTitle="Study Hours", axisTitle="Score",
gridlines="D9D9D9:0.5:dot"),
# Chart 3: Scatter smooth curve (smooth=true, scatterStyle=smooth)
# Features: scatterStyle=smooth, smooth=true (Bezier interpolation),
# marker=diamond, single series
chart("/1-Scatter Fundamentals",
chartType="scatter",
scatterStyle="smooth",
smooth="true",
title="Temperature vs Ice Cream Sales",
categories="15,18,22,25,28,30,33,35",
series1="Sales ($):120,180,260,340,420,480,530,560",
colors="C00000",
x="0", y="19", width="12", height="18",
marker="diamond", markerSize="7",
lineWidth="2",
catTitle="Temperature (C)", axisTitle="Daily Sales ($)"),
# Chart 4: Scatter line-only (no markers, scatterStyle=line)
# Features: scatterStyle=line (line without markers), showMarker=false,
# lineWidth=2.5, lineDash=dash
chart("/1-Scatter Fundamentals",
chartType="scatter",
scatterStyle="line",
title="Altitude vs Air Pressure",
categories="0,500,1000,2000,3000,5000,8000",
series1="Pressure (hPa):1013,955,899,795,701,540,356",
colors="1F4E79",
x="13", y="19", width="12", height="18",
showMarker="false",
lineWidth="2.5",
lineDash="dash",
catTitle="Altitude (m)", axisTitle="Pressure (hPa)"),
# ==================================================================
# Sheet: 2-Marker Styles
# ==================================================================
sheet("2-Marker Styles"),
# Chart 1: Per-series markers — circle, diamond, square
# Features: series1.marker=circle, series2.marker=diamond,
# series3.marker=square (per-series marker style)
chart("/2-Marker Styles",
chartType="scatter",
title="Per-Series Markers: Circle, Diamond, Square",
categories="10,20,30,40,50,60",
series1="Sensor A:12,28,35,42,55,68",
series2="Sensor B:8,22,30,38,48,58",
series3="Sensor C:15,25,32,45,52,62",
colors="4472C4,ED7D31,70AD47",
x="0", y="0", width="12", height="18",
**{"series1.marker": "circle",
"series2.marker": "diamond",
"series3.marker": "square"},
markerSize="8", lineWidth="1",
legend="bottom"),
# Chart 2: Per-series markers — triangle, star, x
# Features: series1.marker=triangle, series2.marker=star, series3.marker=x
chart("/2-Marker Styles",
chartType="scatter",
title="Per-Series Markers: Triangle, Star, X",
categories="5,10,15,20,25,30",
series1="Lab 1:18,32,28,45,52,60",
series2="Lab 2:22,25,38,40,48,55",
series3="Lab 3:10,20,32,35,42,50",
colors="FFC000,9DC3E6,843C0B",
x="13", y="0", width="12", height="18",
**{"series1.marker": "triangle",
"series2.marker": "star",
"series3.marker": "x"},
markerSize="9", lineWidth="1",
legend="bottom"),
# Chart 3: Large markers with series colors, markerSize=10
# Features: markerSize=10, marker=plus, marker=dash, scatterStyle=marker
chart("/2-Marker Styles",
chartType="scatter",
scatterStyle="marker",
title="Large Markers (size=10)",
categories="100,200,300,400,500",
series1="Revenue:150,280,350,420,510",
series2="Profit:80,140,180,220,280",
series3="Cost:70,140,170,200,230",
colors="2E75B6,548235,BF8F00",
x="0", y="19", width="12", height="18",
**{"series1.marker": "circle",
"series2.marker": "plus",
"series3.marker": "dash"},
markerSize="10",
legend="right"),
# Chart 4: showMarker=false (line only) vs showMarker=true
# Features: scatterStyle=lineMarker, showMarker=false (markers hidden),
# lineDash=dashDot
chart("/2-Marker Styles",
chartType="scatter",
scatterStyle="lineMarker",
title="Marker Toggle (none shown)",
categories="1,2,3,4,5,6,7,8,9,10",
series1="Signal:3,7,5,11,9,14,12,18,15,20",
series2="Noise:2,4,6,5,8,7,10,9,12,11",
colors="4472C4,BFBFBF",
x="13", y="19", width="12", height="18",
showMarker="false",
lineWidth="2",
lineDash="dashDot",
legend="bottom"),
# ==================================================================
# Sheet: 3-Trendlines
# ==================================================================
sheet("3-Trendlines"),
# Chart 1: Linear trendline with equation display
# Features: trendline=linear, series1.trendline.equation=true
chart("/3-Trendlines",
chartType="scatter",
scatterStyle="marker",
title="Linear Trendline + Equation",
categories="1,2,3,4,5,6,7,8,9,10",
series1="Observed:8,15,22,28,33,42,48,55,60,68",
colors="4472C4",
x="0", y="0", width="12", height="18",
markerSize="7",
trendline="linear",
**{"series1.trendline.equation": "true"},
catTitle="X", axisTitle="Y"),
# Chart 2: Polynomial trendline (order 3) with R-squared display
# Features: trendline=poly:3, series1.trendline.rsquared=true
chart("/3-Trendlines",
chartType="scatter",
scatterStyle="marker",
title="Polynomial (order 3) + R-squared",
categories="1,2,3,4,5,6,7,8,9,10",
series1="Measurement:5,12,25,30,28,35,50,62,58,72",
colors="70AD47",
x="13", y="0", width="12", height="18",
markerSize="7", marker="square",
trendline="poly:3",
**{"series1.trendline.rsquared": "true"},
catTitle="Sample", axisTitle="Value"),
# Chart 3: Exponential trendline with forward/backward extrapolation
# Features: trendline=exp:2:1 (forward=2, backward=1),
# series1.trendline.name (custom trendline label)
chart("/3-Trendlines",
chartType="scatter",
scatterStyle="marker",
title="Exponential + Extrapolation",
categories="1,2,3,4,5,6,7,8",
series1="Growth:2,4,7,12,20,35,58,95",
colors="ED7D31",
x="0", y="19", width="12", height="18",
markerSize="7", marker="triangle",
trendline="exp:2:1",
**{"series1.trendline.name": "Exponential Fit"},
catTitle="Period", axisTitle="Amount"),
# Chart 4: Per-series trendlines — linear vs logarithmic
# Features: series1.trendline=linear, series2.trendline=log,
# per-series trendline with sub-properties
chart("/3-Trendlines",
chartType="scatter",
scatterStyle="marker",
title="Per-Series: Linear vs Logarithmic",
categories="1,2,4,8,16,32,64",
series1="Dataset A:10,18,30,45,62,78,95",
series2="Dataset B:5,25,38,45,50,54,56",
colors="4472C4,C00000",
x="13", y="19", width="12", height="18",
markerSize="7",
**{"series1.trendline": "linear",
"series2.trendline": "log",
"series1.trendline.equation": "true",
"series2.trendline.rsquared": "true"},
legend="bottom"),
# ==================================================================
# Sheet: 4-Error Bars
# ==================================================================
sheet("4-Error Bars"),
# Chart 1: Fixed error bars (errBars=fixed:5)
# Features: errBars=fixed:5 (constant +/-5 error)
chart("/4-Error Bars",
chartType="scatter",
title="Fixed Error Bars (+-5)",
categories="10,20,30,40,50,60",
series1="Measurement:25,42,58,72,88,105",
colors="4472C4",
x="0", y="0", width="12", height="18",
marker="circle", markerSize="7",
lineWidth="1",
errBars="fixed:5",
catTitle="Input", axisTitle="Output"),
# Chart 2: Percentage error bars (errBars=percent:10)
# Features: errBars=percent:10 (10% of each value)
chart("/4-Error Bars",
chartType="scatter",
title="Percentage Error Bars (10%)",
categories="5,10,15,20,25,30",
series1="Yield:120,185,240,310,375,450",
colors="70AD47",
x="13", y="0", width="12", height="18",
marker="diamond", markerSize="7",
lineWidth="1",
errBars="percent:10",
catTitle="Dosage", axisTitle="Yield"),
# Chart 3: Standard deviation error bars (errBars=stddev)
# Features: errBars=stddev (standard deviation), multi-series with errBars
chart("/4-Error Bars",
chartType="scatter",
title="Standard Deviation Error Bars",
categories="0,1,2,3,4,5,6,7",
series1="Trial 1:48,52,47,55,50,53,49,51",
series2="Trial 2:30,35,28,40,32,38,34,36",
colors="ED7D31,9DC3E6",
x="0", y="19", width="12", height="18",
marker="square", markerSize="6",
lineWidth="1",
errBars="stddev",
legend="bottom"),
# Chart 4: Standard error with series styling
# Features: errBars=stderr, series.shadow, gridlines styling
chart("/4-Error Bars",
chartType="scatter",
title="Standard Error + Styled Series",
categories="2,4,6,8,10,12,14",
series1="Experiment:18,32,28,45,40,55,52",
colors="843C0B",
x="13", y="19", width="12", height="18",
marker="star", markerSize="8",
lineWidth="1.5",
errBars="stderr",
**{"series.shadow": "000000-4-315-2-30"},
gridlines="D9D9D9:0.5:dot",
catTitle="Time (h)", axisTitle="Response"),
# ==================================================================
# Sheet: 5-Styling
# ==================================================================
sheet("5-Styling"),
# Chart 1: Title styling, series shadow, series outline
# Features: title.font, title.size, title.color, title.bold, title.shadow,
# series.shadow, series.outline
chart("/5-Styling",
chartType="scatter",
title="Styled Title + Series Effects",
categories="10,20,30,40,50",
series1="Alpha:15,35,28,48,55",
series2="Beta:8,22,32,40,50",
colors="4472C4,ED7D31",
x="0", y="0", width="12", height="18",
marker="circle", markerSize="8", lineWidth="2",
**{"title.font": "Georgia", "title.size": "16",
"title.color": "1F4E79", "title.bold": "true",
"title.shadow": "000000-3-315-2-30",
"series.shadow": "000000-4-315-2-30",
"series.outline": "333333:1.5"},
legend="bottom"),
# Chart 2: Gradients, transparency, plotFill, chartFill
# Features: gradients (per-series gradient), transparency, plotFill, chartFill
chart("/5-Styling",
chartType="scatter",
title="Gradients + Fills",
categories="5,15,25,35,45",
series1="Group 1:12,28,35,42,55",
series2="Group 2:8,18,22,38,48",
x="13", y="0", width="12", height="18",
marker="diamond", markerSize="8", lineWidth="1.5",
gradients="4472C4-BDD7EE:90;ED7D31-FBE5D6:90",
transparency="20",
plotFill="F5F5F5",
chartFill="FAFAFA",
legend="bottom"),
# Chart 3: Axis font, gridlines, minor gridlines, axis line
# Features: axisfont (size:color:font), gridlines, minorGridlines, axisLine
chart("/5-Styling",
chartType="scatter",
title="Axis & Grid Styling",
categories="0,10,20,30,40,50",
series1="Readings:5,22,38,52,68,82",
colors="2E75B6",
x="0", y="19", width="12", height="18",
marker="circle", markerSize="7", lineWidth="1.5",
axisfont="9:C00000:Arial",
gridlines="BFBFBF:0.75:solid",
minorGridlines="E0E0E0:0.25:dot",
axisLine="333333:1",
catTitle="X Axis", axisTitle="Y Axis"),
# Chart 4: Chart area border, plot area border, rounded corners
# Features: chartArea.border, plotArea.border, roundedCorners
chart("/5-Styling",
chartType="scatter",
title="Borders + Rounded Corners",
categories="1,3,5,7,9",
series1="Data:10,25,18,35,28",
colors="548235",
x="13", y="19", width="12", height="18",
marker="square", markerSize="8", lineWidth="1.5",
**{"chartArea.border": "333333:1.5",
"plotArea.border": "999999:0.75"},
roundedCorners="true",
chartFill="FFFFFF",
plotFill="F0F0F0"),
# ==================================================================
# Sheet: 6-Advanced
# ==================================================================
sheet("6-Advanced"),
# Chart 1: Secondary axis
# Features: secondaryAxis=2 (series 2 on right Y-axis)
chart("/6-Advanced",
chartType="scatter",
title="Secondary Y-Axis",
categories="10,20,30,40,50,60",
series1="Temperature (C):15,20,28,32,38,42",
series2="Humidity (%):85,78,65,58,45,38",
colors="C00000,4472C4",
x="0", y="0", width="12", height="18",
marker="circle", markerSize="7", lineWidth="1.5",
secondaryAxis="2",
legend="bottom",
catTitle="Location"),
# Chart 2: Reference line (horizontal target)
# Features: referenceLine=value:color:label:dash (horizontal target line)
chart("/6-Advanced",
chartType="scatter",
title="Reference Line (Target=75)",
categories="1,2,3,4,5,6,7,8",
series1="Score:60,68,72,78,80,74,82,88",
colors="70AD47",
x="13", y="0", width="12", height="18",
marker="diamond", markerSize="7", lineWidth="1.5",
referenceLine="75:FF0000:Target:dash",
catTitle="Week", axisTitle="Performance"),
# Chart 3: Axis min/max and log scale
# Features: logBase=10 (logarithmic value axis), axisMin, axisMax
chart("/6-Advanced",
chartType="scatter",
title="Log Scale (base 10)",
categories="1,10,100,1000,10000",
series1="Response:2,15,120,950,8500",
colors="1F4E79",
x="0", y="19", width="12", height="18",
marker="triangle", markerSize="8", lineWidth="1.5",
logBase="10",
axisMin="1", axisMax="10000",
catTitle="Concentration", axisTitle="Response"),
# Chart 4: Data labels and color rule
# Features: dataLabels=true, labelPos=top, colorRule=threshold:below:above
# (points below 60 = red, above = green)
chart("/6-Advanced",
chartType="scatter",
scatterStyle="marker",
title="Data Labels + Color Rule",
categories="1,2,3,4,5,6,7,8",
series1="KPI:45,62,38,78,55,82,48,90",
colors="4472C4",
x="13", y="19", width="12", height="18",
markerSize="9",
dataLabels="true", labelPos="top",
colorRule="60:C00000:00AA00",
catTitle="Quarter", axisTitle="KPI Score"),
# Remove blank default Sheet1 (all data is inline)
{"command": "remove", "path": "/Sheet1"},
]
doc.batch(items)
print(f" added {len(items)} sheets/charts")
print(f"Generated: {FILE}")
print(" 6 chart sheets, 24 charts total")