react-vis AreaSeries 面积图完全指南:数据格式、API 配置与源码实现剖析
数据可视化图表库前端【免费下载链接】react-visData Visualization Components项目地址https://gitcode.com/gh_mirrors/re/react-vis点击查看免费下载react-vis 的面积图组件AreaSeries用于渲染填充区域area chart是折线图LineSeries的填充版。本文以官方文档 docs/area-series.md 为主体结合源码 area-series.js、测试用例 area-series.test.js 与展示示例深入展开。读完本文你将掌握AreaSeries的全部数据字段与 API 参数、曲线插值、堆叠用法、交互事件回调并理解它底层如何基于 d3-shape 生成 SVGpath从而在实战中独立配置出符合业务需求的高质量面积图。注意该库目前处于弃用状态详见 DEPRECATED.md不再接收补丁与新特性但仍可作为学习与既有项目参考。一、AreaSeries 与 LineSeries 的异同面积图本质上是在折线下方填充颜色形成的区域。在 react-vis 中AreaSeries与LineSeries既有共性又有显著差异理解这些差异是正确选型的前提。与 LineSeries 相同之处样式在系列级别series level设置而不是在数据点/标记级别mark level设置。也就是说AreaSeries是一个整体颜色、不透明度等作用于整个区域而非单个数据点。支持curve属性可对数据点之间应用不同的插值算法使折线平滑化。与 LineSeries 不同之处拥有fill填充色属性。默认情况下color属性同时决定面积图的填充色与轮廓色但fill与stroke可以分别独立设置。没有专门的 API 去设置除颜色之外的描边样式如线宽、虚线但仍可通过style属性实现见下文style详解。可以被堆叠stacked多个面积序列可以纵向累加。没有 Canvas 等价实现。仓库中如line-series-canvas.js、bar-series-canvas.js等均存在对应 Canvas 版本而面积序列只有 SVG 实现源码位于 packages/react-vis/src/plot/series/area-series.js对应AreaSeries的render直接输出一个 SVGpath。关于stroke的边界行为stroke属性会围绕整个图形的形状描边包括图形的左侧、右侧和底部。如果你只想得到有填充、左右与底部无独立线条、但顶部有不同线条样式的图表官方给出的方案是画一个面积图再在其上方叠一个折线图。这在展示示例 area-chart-elevated.js 中有完整体现——两个AreaSeries之上再渲染一个LineMarkSeries作为顶部描边。二、数据格式参考AreaSeries的数据由若干对象组成每个对象可包含以下字段x类型number含义数据点在系列中从左到右水平方向的位置。y类型number含义自上而下方向中系列顶部边缘的位置。注意 react-vis 的坐标系中 y 越大越靠下。y0类型number默认值0含义自上而下方向中系列底部边缘的位置。y0与y之间的垂直范围即为面积区域的填充高度。当省略y0时区域默认从0开始填充。三者共同决定了每个数据点处面积区域的上下边界。例如展示示例 area-chart-elevated.js 中AreaSeries classNamearea-elevated-series-1 color#79c7e3 data{[ {x: 1, y: 10, y0: 1}, {x: 2, y: 25, y0: 5}, {x: 3, y: 15, y0: 3} ]} /这里每个数据点都显式给出y0从而将填充区域抬高到坐标系中间形成漂浮的色带效果。三、快速上手最小可运行示例结合展示示例 area-chart.js一个包含坐标轴、网格线的最小面积图代码如下import React from react; import { XYPlot, XAxis, YAxis, VerticalGridLines, HorizontalGridLines, AreaSeries } from react-vis; export default function Example() { return ( XYPlot width{300} height{300} VerticalGridLines / HorizontalGridLines / XAxis / YAxis / AreaSeries classNamearea-series-example curvecurveNatural data{[ {x: 1, y: 10}, {x: 2, y: 5}, {x: 3, y: 15} ]} / /XYPlot ); }AreaSeries必须作为XYPlot的子组件使用XYPlot负责提供 x/y 比例尺与坐标系这与仓库内所有序列组件的用法一致。测试 area-series.test.js 中也是将AreaSeries挂载在XYPlot内断言其渲染结果const AREA_PROPS { className: area-chart-example, color: #12939a, data: [ {x: 1, y: 5, y0: 6}, {x: 2, y: 20, y0: 11}, {x: 3, y: 10, y0: 9} ] }; const $ mount( XYPlot width{300} height{300} AreaSeries {...AREA_PROPS} / /XYPlot ); expect($.find(path.rv-xy-plot__series).length).toBe(1);四、API Reference 详解color可选类型string | number默认值见 colors 文档由颜色比例尺决定作用同时指定面积图的填充色与轮廓色。若同时提供fill或stroke则color会被它们覆盖。curve可选类型string | function默认值null即默认直线连接各数据点作用应用 d3-shape 曲线库中提供的具名或自定义曲线函数对序列进行平滑插值。传递名称字符串时react-vis 会直接从 d3-shape 中查找传递函数时需要自行引入 d3-shape 包并完成配置// 仅用名称 const stringCurveProp AreaSeries data{data} curve{curveMonotoneX} .../; // 使用自定义配置的曲线函数 const configuredCurve d3Shape.curveCatmullRom.alpha(0.5); const funcCurveProp AreaSeries data{data} curve{configuredCurve} .../;从源码 area-series.js 可见其底层解析逻辑let area d3Shape.area(); if (curve ! null) { if (typeof curve string d3Shape[curve]) { area area.curve(d3Shape[curve]); } else if (typeof curve function) { area area.curve(curve); } }即字符串名称会按d3Shape[curve]索引查找如curveMonotoneX、curveNatural、curveCatmullRom等 d3-shape 内置曲线函数则直接传给 d3-shape 的area.curve()。data类型ArrayObject作用序列的数据数组字段遵循上文数据格式参考x、y、y0。fill可选类型string | number默认值见 colors作用指定面积图填充色若与color同时提供则覆盖color。在源码 area-series.js 中最终填充色的取值优先级为fill || colorconst stroke this._getAttributeValue(stroke) || this._getAttributeValue(color); const fill this._getAttributeValue(fill) || this._getAttributeValue(color);getNull可选类型function默认值null源码中的实际默认行为为返回true的恒真函数即全部绘制作用对每个数据元素调用返回布尔值决定该数据点是否被绘制。它会被传入 d3-shape 的area.defined()方法。例如只绘制 y 值非 null 的点// Only draw datapoints where the y value is not equal to null AreaSeries getNull{(d) d.y ! null} data{data} /源码中对应的接线如下area-series.jsarea area.defined(getNull);并在渲染时合并了旧属性nullAccessorconst getNull this.props.nullAccessor || this.props.getNull;需要留意的是nullAccessor这一旧命名已被官方标记为废弃渲染时会输出warning(nullAccessor has been renamed to getNull, true)新代码请统一使用getNull。另外尽管文档声明默认值为null源码AreaSeries.defaultProps中实际将getNull默认设置为() true见 area-series.js即默认所有数据点都会被绘制。opacity可选类型number默认值1作用面积图的不透明度取值范围0完全透明到1不透明。源码在 area-series.js 中先读取属性值仅当其为有限数值时采用否则回退到主题默认值DEFAULT_OPACITYconst newOpacity this._getAttributeValue(opacity); const opacity Number.isFinite(newOpacity) ? newOpacity : DEFAULT_OPACITY;stroke可选类型string | number默认值见 colors作用指定面积图轮廓色若与color同时提供则覆盖color。如第一节所述轮廓会环绕整个区域形状含左、右、底部。style可选类型object作用一个保存 CSS 属性的对象会直接应用到序列渲染出的 SVG 元素上。它可以让你突破上述显式参数的限制、在不依赖 CSS 类名与样式表的情况下自定义系列外观。完整说明见 style 文档。AreaSeries data{data} style{{strokeDasharray: 2 2}} /这也是官方文档明确指出的配置非颜色描边样式如虚线的途径。从源码看style对象会被展开合并到最终path的style上area-series.jsstyle{{ opacity, stroke, fill, ...style }}注意展开顺序...style位于最后因此style中的属性会覆盖前面对应的默认值。五、源码实现一个 SVGpath的诞生AreaSeries继承自 abstract-series.js 中的AbstractSeries其核心渲染逻辑完全基于 d3-shape 的area()生成器创建d3Shape.area()生成器根据curve设置插值曲线见第四节通过area.defined(getNull)配置数据点的绘制条件绑定三个访问器.x(x)、.y0(y0)、.y1(y)——其中x、y由比例尺 functor 提供_getAttributeFunctory0由_getAttr0Functor(y)提供自动处理缺省y0时的基线调用area(data)生成路径字符串d。最终render()输出单个path元素area-series.jspath d{d} className{getCombinedClassName(predefinedClassName, className)} transform{translate(${marginLeft},${marginTop})} onMouseOver{this._seriesMouseOverHandler} onMouseOut{this._seriesMouseOutHandler} onClick{this._seriesClickHandler} onContextMenu{this._seriesRightClickHandler} style{{opacity, stroke, fill, ...style}} /几个值得注意的实现细节预定义类名predefinedClassName为rv-xy-plot__series rv-xy-plot__series--linearea-series.js面积图与折线图共享同一系列类名便于统一主题样式用户传入的className会被拼接在其后。动画支持当传入animation属性时AreaSeries会包裹在Animation组件中并对ANIMATED_SERIES_PROPS声明的属性进行插值过渡然后以animation{null}递归渲染自身area-series.js。空数据安全若data为空则直接返回null不渲染任何元素。测试用例 area-series.test.js 专门验证了将data置为null后系列与path均不再渲染。仅 SVG如第一节所述AbstractSeries.requiresSVG返回true而仓库中并不存在area-series-canvas.js确认面积图只有 SVG 实现。六、堆叠面积图StackingAreaSeries是 react-vis 中少数支持堆叠的序列类型之一。堆叠由两个层面配合实现AbstractSeries在默认属性中声明了stack: false见 abstract-series.js序列可通过stack属性声明参与堆叠父级XYPlot提供stackBy属性指定按哪个维度堆叠如stackByy。堆叠数据的计算集中在 series-utils.js 的getStackedData中它会遍历所有子系列当检测到任一子系列设置了stack时对每个簇cluster内的同类序列按attr0/attr的差值做逐段累加从而得到堆叠后的上下边界。仓库中 stacked-vertical-bar-chart.js 展示了这种用法该示例以柱状图演示AreaSeries的堆叠机制与之相同XYPlot width{300} height{300} stackByy ... BarSeries data{[{x: 2, y: 10}, ...]} / BarSeries data{[{x: 2, y: 12}, ...]} / /XYPlot对于面积图只需将上述序列替换为多个AreaSeries并设置stack即可获得层叠面积效果。七、交互事件处理器AreaSeries的交互回调继承自AbstractSeries并在渲染的path元素上绑定事件。共分为就近点回调与系列级回调两类。onNearestX可选类型function(value, {event, innerX, index})触发时机每次鼠标指针移动时触发可获取 x 位置距光标最近的数据点。回调参数value为命中的数据点info对象包含innerX该数据点的左侧位置x 轴像素坐标index该数据点在数据数组中的下标event事件对象。从 abstract-series.js 的实现看_handleNearestX遍历数据、用 x 比例尺将每个点映射为像素坐标再逐一计算与光标横坐标的绝对距离取最小者data.forEach((item, i) { const currentCoordinate xScaleFn(item); const newDistance Math.abs(coordinate.x - currentCoordinate); if (newDistance minDistance) { minDistance newDistance; value item; valueIndex i; } }); onNearestX(value, { innerX: xScaleFn(value), index: valueIndex, event: event.nativeEvent });onNearestXY可选类型function(value, {event, innerX, innerY, index})触发时机每次鼠标移动获取二维距离最近的数据点。回调的info对象在onNearestX基础上增加了innerY数据点的顶部位置。实现差异_handleNearestXY使用 d3-voronoi 为所有数据点构建最近邻索引.x(xScaleFn).y(yScaleFn)再通过find(coordinate.x, coordinate.y)命中最近点abstract-series.js因此其最近按欧氏距离而非仅横向距离计算。AreaSeries ... onNearestX{(datapoint, event){ // does something on mouseover // you can access the value of the event }} /onSeriesClick类型function默认值无触发时机用户在面积序列上单击时触发回调接收对应的事件对象。AreaSeries ... onSeriesClick{(event){ // does something on click // you can access the value of the event }} /onSeriesMouseOut类型function默认值无触发时机鼠标离开面积序列时触发回调接收对应的事件对象。AreaSeries ... onSeriesMouseOut{(event){ // does something on mouse out // you can access the value of the event }} /onSeriesMouseOver类型function默认值无触发时机鼠标悬停到面积序列上时触发回调接收对应的事件对象。AreaSeries ... onSeriesMouseOver{(event){ // does something on mouse over // you can access the value of the event }} /这些系列级处理器在源码中的实现位于 abstract-series.js_seriesClickHandler、_seriesMouseOutHandler、_seriesMouseOverHandler等均将{event}作为参数回传给用户回调且事件绑定在path元素上见 area-series.js。更多交互组合方式参见 interaction 文档。八、测试与示例工程定位仓库为AreaSeries提供了完整的测试与可运行示例便于读者对照验证单元测试area-series.test.js 覆盖了基础渲染断言输出单个path.rv-xy-plot__series、自定义className生效、空数据不渲染、以及两个展示示例的渲染完整性。展示示例基础面积图 area-chart.js配合curvecurveNatural抬升/多序列面积图 area-chart-elevated.js演示y0与面积图 折线图叠加的组合用法。九、使用前提与注意事项弃用状态react-vis已无活跃维护者并进入弃用状态官方不再接收补丁与新特性见 DEPRECATED.md。在生产项目中接入新依赖时需评估这一前提。坐标系约定react-vis 中 y 方向自上而下递增y表示顶部边缘、y0表示底部边缘这与许多图表库y 为底部的直觉相反配置数据时务必注意。无 Canvas 版本在数据量极大、需要 Canvas 性能的场景下AreaSeries没有对应 Canvas 实现可考虑LineSeriesCanvas或自行评估其他方案。描边范围stroke描边包含左、右、底部边界需要仅顶部描边时应采用叠加LineSeries/LineMarkSeries的方案参考 area-chart-elevated.js。综上AreaSeries是一个 API 精简、实现透明的 SVG 面积图组件一条data数组加上少量可选属性即可完成从直线面积图到平滑曲线、堆叠、交互的全部配置其内部则忠实委托给 d3-shape 的area()生成器理解这条实现链路能帮助你更精准地预判每个属性的行为边界。赞分享数据可视化图表库前端【免费下载链接】react-visData Visualization Components项目地址https://gitcode.com/gh_mirrors/re/react-vis点击查看免费下载相关推荐Apache Pulsar Kinesis Sink Connector 完全指南配置、消息格式与源码实现剖析Apache Pulsar Kinesis Sink Connector 完全指南配置、消息格式与源码实现剖析 本指南以 Apache Pulsar 仓库中的消息队列后端流处理ToolJet Timeline 组件完全指南数据格式、属性配置与源码级原理剖析ToolJet Timeline 组件完全指南数据格式、属性配置与源码级原理剖析 Timeline时间线是 ToolJet 应用构建器中用于可视化展示事件低代码后端前端AI 应用MCP 服务EMQX S3Tables Action 新增 Parquet 数据文件格式配置详解与源码实现剖析EMQX S3Tables Action 新增 Parquet 数据文件格式配置详解与源码实现剖析 导读 本篇文章围绕 EMQX 变更记录 changes/e后端物联网消息队列通信上一篇跨平台终端工具 Tabby 完整上手指南如何用一款终端同时搞定本地 Shell、SSH 与串口调试下一篇Bruce固件为M5Stack和ESP32设备打造的专业渗透测试平台深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

METATRON数据库设计剖析:5张MariaDB联动表如何支撑渗透测试全量历史

METATRON数据库设计剖析:5张MariaDB联动表如何支撑渗透测试全量历史

METATRON数据库设计剖析:5张MariaDB联动表如何支撑渗透测试全量历史 【免费下载链接】METATRON AI-powered penetration testing assistant using local LLM on linux (Parrot OS) 项目地址: https://gitcode.com/gh_mirrors/meta/METATRON METATRON 是一款运…

2026/9/25 7:23:45 阅读更多 →
STM32定时器TIM组件化设计:定时中断与输出比较实战

STM32定时器TIM组件化设计:定时中断与输出比较实战

/* 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 7:23:45 阅读更多 →
SwiftPM 跨平台编译指南:swift sdk install 命令完整解析与实战

SwiftPM 跨平台编译指南:swift sdk install 命令完整解析与实战

开发工具构建工具 【免费下载链接】swift-package-manager The Package Manager for the Swift Programming Language 项目地址: https://gitcode.com/gh_mirrors/sw/swift-package-manager 点击查看 免费下载 导读 swift sdk install 是 Swift Package Manager&a…

2026/9/25 7:23:45 阅读更多 →

最新新闻

Atlas 300V推理加速卡实战:从环境配置到YOLO模型部署全解析

Atlas 300V推理加速卡实战:从环境配置到YOLO模型部署全解析

先把结论放到最前面:Atlas 300V系列毫无疑问是运算加速卡,但它的"加速"和大多数人熟悉的GPU加速完全是两码事。我见过不少朋友把这张卡买回来,插上服务器,装好驱动,然后对着npu-smi里那一串输出发呆——接下…

2026/9/26 8:51:37 阅读更多 →
Cosine学习率调度器原理与实战调优指南

Cosine学习率调度器原理与实战调优指南

1. 为什么你调不出SOTA模型?——学习率调度器不是“开关”,而是“油门刹车方向盘”的协同系统我带过三届AI方向的毕业设计,每年都有学生拿着同样的ResNet50架构、同样的数据集、同样的优化器,最后指标差了3~5个点。追问原因&#…

2026/9/26 8:51:37 阅读更多 →
WorkBuddy Enterprise企业级AI平台与Agent生态架构设计及落地实践

WorkBuddy Enterprise企业级AI平台与Agent生态架构设计及落地实践

1. 从WorkBuddy Enterprise看企业级AI平台的真实需求第一次看到“WorkBuddy Enterprise 企业级AI平台与Agent生态产品概要”这个标题,我脑子里蹦出来的第一个念头是:又一个企业级AI平台?但仔细琢磨“Agent生态”这四个字,事情就没…

2026/9/26 8:51:36 阅读更多 →
Atlas 300V 24G部署YOLO全指南:环境搭建、模型转换与性能调优

Atlas 300V 24G部署YOLO全指南:环境搭建、模型转换与性能调优

如果你最近在搜索框里敲下“atlas部署yolo”,又顺手翻了翻“atlas 300v 24g 是运算加速卡吗”,我猜你多半是刚拿到一块昇腾Atlas板卡,正琢磨怎么把它用起来。先直接回答那个朴素的疑问:是的,Atlas 300V 24G就是一张运算…

2026/9/26 8:51:36 阅读更多 →
DeskcommCRM实战:从客户全生命周期到私有化部署的完整指南

DeskcommCRM实战:从客户全生命周期到私有化部署的完整指南

做业务的人最头疼的往往不是拿到不客户,而是客户信息全散在Excel表、微信聊天、售后记录和一堆名片里。团队一旦超过几个人,这种“个人通讯录式”的客户管理方式就会慢慢变成黑洞:销售跟到哪一步了没人知道,老客户谁在跟进搞不清楚…

2026/9/26 8:51:36 阅读更多 →
数智码力:普通人学Python,不必追求独立开发项目,会“改造脚本”就够用

数智码力:普通人学Python,不必追求独立开发项目,会“改造脚本”就够用

很多新手自学Python,都被错误的学习标准误导:认为学Python的终极目标,是从零独立开发完整项目,写出专属代码。达不到这个标准,就觉得自己没学好、学无用功。其实对于99%的普通人、职场人、学生而言,完全不需…

2026/9/26 8:50:36 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →