数据可视化图表库前端【免费下载链接】react-visData Visualization Components项目地址https://gitcode.com/gh_mirrors/re/react-vis点击查看免费下载本文基于仓库 docs/examples/extensibility.md 展开当 react-vis 内置的系列组件无法满足需求时如何通过继承AbstractSeries快速打造属于你自己的可视化系列。读完本文你将掌握自定义系列的完整套路——从继承基类、调用属性 functor 完成坐标映射到把新系列无缝嵌入XYPlot并复用其交互回调体系并以仓库自带的 CandlestickK 线图系列为完整实战样例。扩展性的入口AbstractSeriesreact-vis 的扩展性设计非常直接如果你找不到想要的图表类型就自己造一个。官方文档用一句话点明了核心思路——上面的图表只是简单地继承了 abstract series 并加了一点糖the above chart was made by simply extending abstract series and adding a little sugar并直接给出了源码路径 packages/showcase/examples/candlestick/candlestick.js。所有内置系列LineSeries、AreaSeries、BarSeries、MarkSeries、ArcSeries、HeatmapSeries、CustomSVGSeries等见 packages/react-vis/src/plot/series/都是AbstractSeries的子类AbstractSeries从公共入口导出见 packages/react-vis/src/index.jsexport AbstractSeries from plot/series/abstract-series;因此自定义系列与官方系列站在同一起跑线上能天然继承整个图表框架的能力。注意本仓库当前处于弃用状态见 DEPRECATED.mdreact-vis 不再接收补丁与新特性。本文内容以当前仓库代码为准主要用于学习其扩展机制或作为 fork 维护的参考。理解 AbstractSeries 提供的契约AbstractSeries定义在 packages/react-vis/src/plot/series/abstract-series.js类定义于第 66 行继承自PureComponent它是自定义系列的地基具体提供了以下几类能力。1. 完整的属性契约propTypes基类通过getScalePropTypesByAttribute为x、y、size、opacity、color五个属性展开了一整套 scale 相关的 props见 packages/react-vis/src/utils/scales-utils.jsconst propTypes { ...getScalePropTypesByAttribute(x), ...getScalePropTypesByAttribute(y), ...getScalePropTypesByAttribute(size), ...getScalePropTypesByAttribute(opacity), ...getScalePropTypesByAttribute(color), width: PropTypes.number, height: PropTypes.number, data: PropTypes.arrayOf( PropTypes.oneOfType([PropTypes.object, PropTypes.array]) ), onValueMouseOver: PropTypes.func, onValueMouseOut: PropTypes.func, onValueClick: PropTypes.func, onValueRightClick: PropTypes.func, onSeriesMouseOver: PropTypes.func, onSeriesMouseOut: PropTypes.func, onSeriesClick: PropTypes.func, onSeriesRightClick: PropTypes.func, onNearestX: PropTypes.func, onNearestXY: PropTypes.func, style: PropTypes.object, animation: AnimationPropType, stack: PropTypes.bool };每个属性对应的 scale 属性形如xDomain、xRange、xType、xDistance以及getX访问器函数toTitleCase会把x变成X。这意味着你的自定义系列自动获得坐标映射、颜色映射、透明度映射的完整配置能力。2. 属性 functor把数据翻译成坐标的工具方法在render()里你无法直接拿原始数据画图——数据值需要经过 scale 转换才能变成屏幕坐标。基类为此提供了三个受保护的工具方法源码见 abstract-series.js_getAttributeFunctor(attr)返回一个d scaleFn(accessor(d))的函数是核心翻译器。其底层实现在 scales-utils.js先从 props 中找到该属性的 scale 对象getScaleObjectFromProps再用它构建访问器。_getAttr0Functor(attr)读取[attr]0属性如y0用于绘制面积图、堆叠图这类从基线出发的图形无值时回退到baseValuescales-utils.js。_getAttributeValue(attr)获取标量属性值如固定颜色、固定透明度没有值时报 warning 并回退到 scale 的 range[0]scales-utils.js。_getScaleDistance(attr)返回该属性的 scale 距离常用于计算 mark 半径、柱宽等几何尺寸。3. 现成的交互回调基类预置了一整套可继承的处理器abstract-series.js方法作用_valueClickHandler(d, e)数据点点击_valueMouseOverHandler(d, e)数据点悬停_valueMouseOutHandler(d, e)数据点移出_valueRightClickHandler(d, e)数据点右键_seriesClickHandler(e)/_seriesMouseOverHandler(e)等系列级事件它们会检查 props 中是否传入了onValueClick、onSeriesMouseOver等回调有则自动触发。自定义系列只需在渲染的图形元素上挂上这些方法就立即获得与内置系列一致的事件体验。4. 参与 XYPlot 的协作协议XYPlot在渲染前会用React.cloneElement给每个系列子组件注入dimensions尺寸与边距、scaleMixins含_allData、_adjustBy、_stackBy等以及整理后的data见 packages/react-vis/src/plot/xy-plot.js。同时XYPlot在构建 scale 时会对每个系列调用静态方法child.type.getParentConfig(attr, child.props)xy-plot.js并根据返回值决定是否需要调整 domain、是否设置零基线。AbstractSeries默认提供空实现static getParentConfig() { return {}; }此外还有静态 getterget requiresSVG()返回true告诉框架该系列需要 SVG 环境。如果你要绘制的是面积类、堆叠类图形可以在自定义系列中覆写getParentConfig返回{isDomainAdjustmentNeeded: true}或{zeroBaseValue: true}让框架替你完成 domain 对齐。实战手写 CandlestickSeriesK 线图系列现在用仓库的真实代码走一遍完整流程。K 线图需要每个数据点同时承载开、高、低、收四个价格react-vis 没有内置因此官方 showcase 通过继承AbstractSeries亲手实现完整源码见 packages/showcase/examples/candlestick/candlestick.js。第一步继承基类并声明样式类import React from react; import {AbstractSeries} from react-vis; const predefinedClassName rv-xy-plot__series rv-xy-plot__series--candlestick; class CandlestickSeries extends AbstractSeries { render() { const {className, data, marginLeft, marginTop} this.props; if (!data) { return null; } // ... } }沿用rv-xy-plot__series前缀可以保证新系列自动匹配 react-vis 的样式体系className则允许外部追加自定义类名。第二步获取属性 functorconst xFunctor this._getAttributeFunctor(x); const yFunctor this._getAttributeFunctor(y); const strokeFunctor this._getAttributeFunctor(stroke) || this._getAttributeFunctor(color); const fillFunctor this._getAttributeFunctor(fill) || this._getAttributeFunctor(color); const opacityFunctor this._getAttributeFunctor(opacity);这里展示了两个实用技巧stroke/fill没有显式定义时可以回退到colorfunctoropacityFunctor可能为空因此后面取值时要兜底为1。第三步用 functor 计算几何形状K 线图由影线 实体组成。仓库实现用相邻两个数据点 x 坐标的差计算柱体宽度const distance Math.abs(xFunctor(data[1]) - xFunctor(data[0])) * 0.2;然后对每个数据点做四值映射——注意它先把d展开再注入单个字段复用同一个yFunctordata.map((d, i) { const xTrans xFunctor(d); // 字段命名参考 https://en.wikipedia.org/wiki/Candlestick_chart const yHigh yFunctor({...d, y: d.yHigh}); const yOpen yFunctor({...d, y: d.yOpen}); const yClose yFunctor({...d, y: d.yClose}); const yLow yFunctor({...d, y: d.yLow}); const lineAttrs { stroke: strokeFunctor strokeFunctor(d) }; const xWidth distance * 2; // ... });最终渲染三根线上影、实体上下沿、下影加一个矩形实体g transform{translate(${xTrans})} opacity{opacityFunctor ? opacityFunctor(d) : 1} key{i} onClick{e this._valueClickHandler(d, e)} onMouseOver{e this._valueMouseOverHandler(d, e)} onMouseOut{e this._valueMouseOutHandler(d, e)} line x1{-xWidth} x2{xWidth} y1{yHigh} y2{yHigh} {...lineAttrs} / line x1{0} x2{0} y1{yHigh} y2{yLow} {...lineAttrs} / line x1{-xWidth} x2{xWidth} y1{yLow} y2{yLow} {...lineAttrs} / rect x{-xWidth} width{Math.max(xWidth * 2, 0)} y{yOpen} height{Math.abs(yOpen - yClose)} fill{fillFunctor fillFunctor(d)} / /g最外层g还要用transform{translate(${marginLeft},${marginTop})}对齐绘图区的边距。注意交互处理直接复用了基类的_valueClickHandler/_valueMouseOverHandler/_valueMouseOutHandler——你的自定义系列零成本获得了与内置系列一致的悬停、点击事件语义。第四步设置 displayNameCandlestickSeries.displayName CandlestickSeries; export default CandlestickSeries;把它接进 XYPlot完整用例官方示例 packages/showcase/examples/candlestick/candlestick-example.js 展示了如何把新系列嵌入图表。数据生成函数构造出 K 线所需字段并利用color、opacity字段做涨跌着色与透明度区分function buildRandomBinnedData(total) { const result Array(total) .fill(0) .map((x, i) { const values [Math.random(), Math.random(), Math.random(), Math.random()] .sort() .map(d Math.floor(d * 100)); const y (values[2] values[1]) / 2; return { x: i, y, yHigh: values[3], yOpen: values[2], yClose: values[1], yLow: values[0], color: y 25 ? #EF5D28 : #12939A, opacity: y 75 ? 0.7 : 1 }; }); return result; }渲染时把Candlestick与官方XAxis、YAxis、LineSeries一起放进FlexibleWidthXYPlotFlexibleWidthXYPlot animation yDomain{[0, 100]} height{300} XAxis / YAxis / LineSeries color#12939A data{data} / LineSeries color#FF9833 classNamedashed-example-line data{[ {x: 0, y: 25}, {x: 30, y: 25} ]} / LineSeries color#1A3177 classNamedashed-example-line opacity{0.3} data{[ {x: 0, y: 75}, {x: 30, y: 75} ]} / Candlestick colorTypeliteral opacityTypeliteral stroke#79C7E3 data{data} / /FlexibleWidthXYPlot这里有几个值得注意的配置细节colorTypeliteral/opacityTypeliteral告诉 scale 系统按数据里的字面值直接取色、取透明度而不是走连续色带映射。对应源码中XYPlot._getDefaultScaleProps对colorType category与连续模式的不同色带选择xy-plot.js。stroke#79C7E3覆盖影线颜色而实体填充色来自每根 K 线的color字段。同一份data同时喂给LineSeries和Candlestick因为XYPlot会把所有子系列的数据聚合起来统一计算 domaingetStackedData与_getScaleMixins见 xy-plot.js所以叠加绘制的多系列天然共享坐标系。样式收尾官方示例还配套了一个 SCSS 文件 packages/showcase/examples/candlestick/candlestick.scss通过.dashed-example-line给参考线加上虚线.candlestick-example { width: 100%; .chart { width: 100%; } .dashed-example-line { stroke-dasharray: 2, 2; } }组件内部的predefinedClassName前缀rv-xy-plot__series也意味着你可以像内置系列一样通过全局样式或styleprop 统一微调自定义系列的外观。扩展点速查综合源码自定义系列可用的扩展入口归纳如下扩展点位置说明_getAttributeFunctor(attr)abstract-series.js数据 → 像素坐标/颜色的核心翻译_getAttr0Functor(attr)abstract-series.js基线值映射绘制面积/堆叠图用_getAttributeValue(attr)abstract-series.js取标量属性值_getScaleDistance(attr)abstract-series.js取 scale 距离算几何尺寸_value*Handler/_series*Handlerabstract-series.js复用交互回调onNearestX/onNearestXYabstract-series.js最近点查询onNearestXY基于 d3-voronoi 实现static getParentConfig()abstract-series.js向XYPlot声明 domain 调整 / 零基线需求static get requiresSVG()abstract-series.js声明是否需要 SVG 渲染环境从代码结构看react-vis 的扩展机制之所以顺滑是因为XYPlot把数据聚合 → scale 计算 → 属性注入这套重活全部包办了xy-plot.js自定义系列只需聚焦怎么画这一件事取 functor、算几何、挂事件。若内置系列不够用照抄 candlestick.js 的结构写一个新的AbstractSeries子类即可在一小时之内获得一个具备完整坐标体系、交互回调与动画能力的全新图表类型。赞分享数据可视化图表库前端【免费下载链接】react-visData Visualization Components项目地址https://gitcode.com/gh_mirrors/re/react-vis点击查看免费下载相关推荐Yup 扩展指南通过 addMethod、transform 与继承构建自定义 Schema 校验能力Yup 扩展指南通过 addMethod、transform 与继承构建自定义 Schema 校验能力 Yup 是一个用于运行时值解析与校验的 schema后端H1st AI在网络安全领域的应用实战案例分析H1st AI在网络安全领域的应用实战案例分析 H1st作为面向AI工程师的强大工具集凭借其独特的Oracle模型和时间序列分析能力在网络安全威胁检测与异数据可视化图表库前端10个Mergeable配置示例解决90%的GitHub协作难题10个Mergeable配置示例解决90%的GitHub协作难题 Mergeable是一款强大的GitHub自动化工具能够帮助团队解决协作过程中的各种问题上一篇NetBox Docker 项目教程下一篇LIKWID性能分析案例优化科学计算应用性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
