scientific-plot · 二维科学绘图

坐标轴、单位、刻度、误差棒、置信区间带 —— 用原生 SVG 画, 零第三方运行时依赖。本模块不计算任何统计量, 它只把调用方给的数画在正确的位置上。

1 · 函数曲线与坐标轴

阻尼振荡 y(t) = A·e^(−λt)·cos(2πft)。 曲线是采样出来的数据点 —— 调用方传的是函数,不是字符串表达式, 本模块不做表达式求值。

图 1 · 阻尼振荡位移随时间的变化。A = 1.00 m,λ = 0.35 s⁻¹,f = 1.20 Hz。

2 · 离散测量 + 误差棒

误差棒画的是调用方给的误差边界。本模块不判断它表示标准差还是标准误, 也不据此推断显著性 —— 这两件事必须由测量者说清楚。

图 2 · 五种催化剂在不同温度下的转化率(示例数据,误差棒为 ±1 个测量标准差)。

3 · 折线 + 置信区间带 + 参考线

区间带是调用方算好的上下边界。图上的水平虚线是工艺控制下限。

图 3 · 反应收率随生产批号的走势与 95% 置信区间(示例数据)。

4 · 对数坐标

对数轴必须显式声明。跨度跨 6 个数量级时自动只保留 10 的幂做刻度, 避免标签挤成一团。若给对数轴一个 ≤ 0 的边界,模块会直接报错而不是悄悄修正。

图 4 · 细菌培养液浓度随时间变化(对数纵轴,示例数据)。

4b · 对数轴上的无效数据(≤ 0)必须明说

对数轴上 0 和负数没有位置。这里的做法不是"悄悄当成一个很小的正数" (那会画出一条看起来正常、实际是假的线),也不是"静默丢掉"(读者会以为那里本来就没测): 曲线断在这两个点两侧,并且图上明写"有几个点未绘制"。

图 4b · 测值含 0 与负值的情形(示例数据)。第 4 点为 0、第 7 点为负,两者都不在 log 轴上。

5 · 缺失值 ≠ 零(这一节是反例自证)

两个序列的非缺失数据完全相同,只有缺失的处理方式不同: 左边把 null 当缺失 ⇒ 曲线断开; 右边把缺失当 0 ⇒ 曲线掉到零再爬回来。 后者画出的是一段不存在的趋势。

图 5 · 同一组数据,两种缺失处理。左:缺失断开(正确)。右:缺失当 0(错误,仅用于对照)。