viewof amp = Inputs.range([0.5, 3], {value: 1.5, step: 0.1, label: "振幅 a"})
viewof freq = Inputs.range([0.5, 5], {value: 2.0, step: 0.1, label: "频率 b"})OJS 浏览器端交互演示
本页演示第三种创作形态:OJS(Observable JavaScript,一种响应式笔记本语言)单元 在浏览器端运行——拖动下方滑块,曲线立即重绘,全程不请求任何后端。
滑块调参的正弦曲线
振幅与频率都由滑块控制,改动任意一个,图立即响应:
xs = d3.range(0, Math.PI * 2 + 1e-9, 0.02)
Plot.plot({
width: 600,
height: 320,
x: {label: "x (弧度)"},
y: {label: "y"},
marks: [
Plot.ruleY([0]),
Plot.line(xs.map((x) => ({x: x, y: amp * Math.sin(freq * x)})),
{stroke: "#d97706", strokeWidth: 2.5})
]
})当前参数下曲线峰值 = (本行同样是响应式的:拖动滑块,数字跟着变)。
为什么这是「响应式」
滑块(viewof 单元)暴露的值一旦变化,引用它的每个单元——曲线图、本页的峰值 数字——都会被 OJS 运行时自动重新求值。页面本身是纯静态文件,交互完全发生在 你的浏览器里。