数据可视化库Observable Plot 源码深度解析一认识 Observable Plot配套代码仓库https://github.com/observablehq/plot即observablehq/plotv0.6.17 源码本体图表渲染说明本文档内嵌 mermaid流程图/时序图/状态图/概念关系/类结构代码块在 Typora、Obsidian、VS Code 插件、GitHub 等平台均可自动渲染。写在前面主要目的这份解析主要是解决下面几个问题自底向上理解一张图是怎么画出来的从Plot.plot({...})调用开始沿着源码真正走一遍数据 → 通道 → 比例尺 → 像素的全链路。理解 Plot 与 D3 的真实分工知道 Plot 用 D3 的哪些模块、各自负责什么、什么时候该绕开 Plot 直接用 D3。有能力自己实现一个迷你图表库第 13 章给出一个最简可用的声明式图表库骨架参考 Plot 的抽象。可以扩展新图表类型知道注册自定义 Mark、Scale、Transform 的入口与约束。图例图类型用途渲染要求mermaid概念关系、流程图、时序图、状态图、模块依赖架构图mermaid 引擎第 1 章 认识 Observable Plot1.1 一个最小示例import*asPlotfromhttps://cdn.jsdelivr.net/npm/observablehq/plot0.6/esm;// 数据12 个城市的气温constcities[{name:北京,temp:12},{name:上海,temp:17},{name:广州,temp:23},{name:深圳,temp:23},{name:杭州,temp:16},{name:成都,temp:15},{name:武汉,temp:16},{name:西安,temp:13},{name:南京,temp:15},{name:重庆,temp:18},{name:天津,temp:12},{name:苏州,temp:16}];// 一行代码水平条形图constchartPlot.barX(cities,{y:name,x:temp});Plot.barX(cities, {y: name, x: temp})调用返回的是 SVGg元素。包裹到 DOMdocument.querySelector(#app).append(chart);//document.body.append(chart);就得到一张图。Plot 没有图表容器没有 axes 配置没有 margin 配置没有 xScale、yScale 的代码——全部由 Plot 根据你的{y: name, x: temp}推断出来。完整的在HTML代码为!DOCTYPEhtmldiv idapp/divscript typemoduleimport*asPlotfromhttps://cdn.jsdelivr.net/npm/observablehq/plot0.6/esm;// 数据12 个城市的气温constcities[{name:北京,temp:12},{name:上海,temp:17},{name:广州,temp:23},{name:深圳,temp:23},{name:杭州,temp:16},{name:成都,temp:15},{name:武汉,temp:16},{name:西安,temp:13},{name:南京,temp:15},{name:重庆,temp:18},{name:天津,temp:12},{name:苏州,temp:16}];// 一行代码水平条形图constchartPlot.barX(cities,{y:name,x:temp}).plot();constcontainerdocument.querySelector(#app);container.append(chart);/script结果如图当然最佳探索该图表库的地方是https://observablehq.com/1.2 Plot 要解决的痛点如果用 D3 命令式手写同样的柱状图至少要做这些事基于d3v7!DOCTYPEhtmldiv idapp/divscript typemoduleimport*asd3fromhttps://cdn.jsdelivr.net/npm/d37/esm;constcities[{name:北京,temp:12},{name:上海,temp:17},{name:广州,temp:23},{name:深圳,temp:23},{name:杭州,temp:16},{name:成都,temp:15},{name:武汉,temp:16},{name:西安,temp:13},{name:南京,temp:15},{name:重庆,temp:18},{name:天津,temp:12},{name:苏州,temp:16}];// Plot默认进行了排序constsortedData[...cities].sort((a,b)a.nameb.name?-1:1);constmargin{top:20,right:30,bottom:45,left:60};constwidth800-margin.left-margin.right;constheight460-margin.top-margin.bottom;// 画布属性constsvgd3.select(#app).append(svg).attr(width,widthmargin.leftmargin.right).attr(height,heightmargin.topmargin.bottom).append(g).attr(transform,translate(${margin.left},${margin.top}));//y比例尺constyScaled3.scaleBand().domain(sortedData.map(dd.name)).range([0,height])// barX Y轴反转.padding(0.15);//x比例尺constxScaled3.scaleLinear().domain([0,24]).range([0,width]);//柱状图的条svg.selectAll(rect).data(sortedData).enter().append(rect).attr(y,dyScale(d.name)).attr(height,yScale.bandwidth()).attr(x,0).attr(width,dxScale(d.temp)).attr(fill,#000000);//画y轴/x轴svg.append(g).call(d3.axisLeft(yScale));svg.append(g).attr(transform,translate(0,${height})).call(d3.axisBottom(xScale));// 添加轴标题svg.append(text).attr(x,width).attr(y,height32).attr(text-anchor,end).text(temp →);svg.append(text).attr(transform,rotate(-90)).attr(x,-height/2).attr(y,-42).attr(text-anchor,middle).text(name);/scriptD3 这段代码量明显大于Plot 差距来自维度D3命令式Plot声明式选元素selectAll自动绑数据.data()data参数算比例尺手动 domain/range自动推断算坐标手动 attr自动 scale 应用画轴axisBottom手动隐式推断边距手动 translate自动 margin1.3 Plot 的定位Plot 不是 D3 的替代品而是 D3 之上的声明式语法层。Plot 的 package.json 一行说清楚了依赖关系// package.json (line 80)dependencies:{d3:^7.9.0,interval-tree-1d:^1.0.0,isoformat:^0.2.0,rimraf:^6.1.3}D3 7.9 是唯一核心运行时依赖。其他只是辅助interval-tree-1d 用于二维区间查询、isoformat 用于日期格式、rimraf 用于构建。设计哲学Plot 用最少的代码完成常见的探索式数据可视化把 D3 的装配语言地位保留给精细控制场景。——Mike Bostock1.4 总结Plot 是声明式的你描述图长什么样不描述怎么画。Plot 是组合式的marks数组里堆叠多个标记。Plot 是可推导的比例尺、坐标轴、图例、边距都能从你的数据 选项自动算出。Plot 是 D3 7.9 之上的高层语法层底层还是 D3。
企业数字化 ERP 产品动态
相关推荐
openclaw源码解析:02-启动流程——从入口到服务就绪的配置骨架与验证 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 16:44:40
合规打底 价值锚定:博彦科技FDE模式打通金融AI境内外规模化落地路径 6月18日,国家金融监督管理总局印发金发〔2026〕8号《关于银行业保险业人工智能安全开发应用的指导意见》(下称《8号文》),以八章三十二条确立“谁使用谁负责、自主可控、务实高效、安全发展”四大核心准则。《8号文》的发布&#… · 2026/9/25 16:44:34
快递需求分析与预测建模:从数据清洗到ARIMA与XGBoost实战 简介:本资源为2023年五一数学建模竞赛B题「快递需求分析问题」的完整求解资料,面向备战数学建模竞赛的高校学生及需要多模型融合实战案例的学习者。内容围绕熵权-TOPSIS评价、ARIMA时间序列预测、Dijkstra最短路径与最小二乘法等核心方法展开,… · 2026/9/25 16:44:28
广东省高速线缆加工设备厂家怎么选?智能控制与高精度加工避坑指南 广东高速线缆加工设备厂家怎么选?智能控制与高精度加工避坑指南
新手采购必踩的4大高频坑作为高速线缆加工从业者,你是不是也遇到过这些糟心事?
选设备时只顾看低价,买回来才发现加工精度不够、良率上不去,极细的高速线缆屏蔽层剥线总是划伤… · 2026/9/25 17:15:15
MySQL图书管理系统源码实战:事务、锁与索引避坑指南 简介:这份 MySQL 图书管理系统数据库课设资源,面向高校计算机相关专业学生与数据库初学者,用于完成期末大作业或课程设计。系统围绕图书表、读者表、管理员表、借阅表与逾期处罚表五类核心数据表展开,实现了借还书流程、模糊查询以… · 2026/9/25 17:15:15
源头库存回收门店推荐 义乌梓祥商贸 针对苏州市场提供外贸尾单与积压品收购 行业基础科普:什么是正规库存回收?很多人对库存回收的印象,还停留在收旧货、打散货的小商贩,其实经过几十年的行业发展,现代库存回收早已变成链接产能过剩和下沉流通市场的重要中间环节,是帮助实体商家盘活资产的专业… · 2026/9/25 17:15:15
SQL Server字段级Update触发器:精准判断特定字段更新 简介:这份PDF资料聚焦SQL Server中UPDATE触发器的实战用法,面向数据库开发与运维人员,解决“仅当表中特定字段被更新时才触发日志记录”这一常见需求。内容以MasterTable表的Type字段为例,给出完整触发器代码,并讲解in… · 2026/9/25 17:15:15
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37