如何使用Highcharts SVG渲染器?

如何使用SVG渲染器

SVG 渲染器允许直接访问 Highcharts 的渲染层,以便直接在图表上绘制基本形状,如圆形、矩形、路径或文本,或者 独立于任何图表之外。它代表了一个 SVG 的 JavaScript 包装对象。

独立使用

作为一个独立的API,Highcharts渲染器是一个方便的抽象,用于在浏览器中绘制矢量图形。

js 复制代码
const renderer = new Highcharts.SVGRenderer(
    document.getElementById('container'),
    600,
    400
);

一旦实例化渲染器,就可以用它在 SVG 上绘制基本形状。常用元素包括 rect, circle, path, labeltext, 以及分组元素 g 和其他方法。请参阅 类参考class
reference

获取完整列表和实时演示。

js 复制代码
renderer.circle(100, 100, 50).attr({
    fill: 'red',
    stroke: 'black',
    'stroke-width': 1
}).add();

renderer.text('Hello world', 200, 100).attr({
    rotation: 45
}).css({
    fontSize: '16pt',
    color: 'green'
}).add();

赋予它生命

所有生成的元素都可以动态更新,可以立即通过 attr方法进行修改,或者通过 animate 方法实现动画效果。查看这个演示,了解一些 带动画的简单元素:

将其应用到图表中

虽然自由绘图功能是一个不错的特性,但当它可以用于在图表上绘制自定义图形时,渲染器变得非常有用。

每个Chart实例都拥有自己对渲染器的引用。可以通过它直接在图表的SVG上绘制形状。

将自定义绘图集成到图表渲染流程中的最佳方法是监听chart.events.render事件。 这个事件非常适合这个目的,因为它在首次渲染时触发, 以及每次图表因更新数据、选项或容器尺寸而重新绘制时也会触发。详细内容请看下面。

render事件处理器可以通过两种不同的方式分配。

  1. 将其添加到选项结构中,chart.events.render。这适用于每个实例。

  2. 另外,也可以将其添加到 Chart 类中,这样所有实例都会应用。 Highcharts.addEvent(Highcharts.Chart, 'render', eventHandler)。这种方法更具模块化,便于保持配置结构的整洁,但需要用到其他选项,比如 chart.className,以便识别不同的图表。更多关于 addEvent 的内容,以及查看 addEvent and render demo

添加响应式形状

让我们更详细地了解如何创建一个自定义注释,并在更改图表大小时保持其位置。

查看渲染器在图表上的演示 renderer on a chart.

在这种情况下,注释与这个特定的图表紧密相关,因此我们希望在选项结构中添加 render 事件处理程序。我们正在构建的图表是一个显示降水量的柱状图。为了演示的需要,我们希望显示一个括号和一段文字,以吸引注意力,突出通常的秋季降雨月份。此外,由于图表是响应式的,会根据包含它的 div 的大小进行缩放,因此这个元素也需要能够缩放。

在第一次调用render事件时,我们创建元素。

js 复制代码
let isNew = false;
if (!this.autumnBracket) {
    this.autumnBracket = this.renderer.path()
        .attr({
            stroke: '#333333',
            'stroke-width': 1
        })
        .add();
    this.autumnText = this.renderer.text('Autumn months')
        .attr({
            'text-anchor': 'middle'
        })
        .css({
            fontStyle: 'italic'
        })
        .add();
    isNew = true;
}

请注意,我们尚未提供实际的路径定义,也未设置文本的x和y位置。我们所做的是直接在图表实例(this)上注册元素,这样后续的渲染事件就会拾取并重用它们,而不是创建新的元素。另请注意,我们定义了一个标志(isNew),我们将在下面使用。

在进行一些数学计算以确定元素的准确位置后,我们进行 实际的放置:

js 复制代码
this.autumnBracket[isNew ? 'attr' : 'animate']({
    d: [
        ['M', left, top + 10],
        ['L', left, top],
        ['L', right, top],
        ['L', right, top + 10]
    ]
});
this.autumnText[isNew ? 'attr' : 'animate']({
    x: (right + left) / 2,
    y: top - 5
});

这个定位在首次绘制和后续重绘时都起作用。唯一的区别是我们使用 isNew 标志来判断元素是否是新创建的。如果 isNew 为真,我们会运行 attr 函数,因为我们不希望从 [0, 0] 位置开始动画。如果 isNew 为假,意味着该元素是在之前的渲染调用中创建的,这也就意味着我们希望与其他原生图表元素一起实现平滑的动画过渡到新位置。

在这里查看完整示例,并注意如果你改变视口大小,元素会重新定位:

在图表上定位元素

在上面的演示中,我们使用了 Point.pos()来决定如何绘制我们的注释。在放置自定义图形到图表上时,其他一些定位属性也很有用:

相关推荐
码界筑梦坊15 小时前
327-基于Django的兰州空气质量大数据可视化分析系统
python·信息可视化·数据分析·django·毕业设计·数据可视化
郝学胜-神的一滴15 小时前
超越Spring的Summer(一): PackageScanner 类实现原理详解
java·服务器·开发语言·后端·spring·软件构建
啊阿狸不会拉杆15 小时前
《机器学习导论》第 7 章-聚类
数据结构·人工智能·python·算法·机器学习·数据挖掘·聚类
摇滚侠15 小时前
Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程
java·开发语言·python
阿里嘎多学长15 小时前
2026-02-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
Tony Bai15 小时前
“Go 2,请不要发生!”:如果 Go 变成了“缝合怪”,你还会爱它吗?
开发语言·后端·golang
打工的小王15 小时前
java并发编程(七)ReentrantReadWriteLock
java·开发语言
lang2015092815 小时前
Java并发革命:JSR-133深度解析
java·开发语言
禹凕15 小时前
Python编程——进阶知识(面向对象编程OOP)
开发语言·python