如何使用LightningChart JS创建高性能可视化的HTML图表?

news2025/1/17 0:58:28

LightningChart JS是一款高性能的JavaScript图标库,专注于实时数据可视化,以“快如闪电”享誉全球,是Microsoft Visual Studio数据展示速度最快的2D和3D图表制图组件,可实时呈现超过10亿数据点的海量数据。

LightningChart .JS | 下载试用(qun:740060302)icon-default.png?t=MBR7https://www.evget.com/product/4189/download

本文将带来如何使用 LightningChart 创建 JavaScript HTML可视化动图,我们主要通过六部分进行讲解,分别是带有 JavaScript 的 HTML 图表、项目概况、配置模板、条形图、环形图、游标图表、使用 JavaScript 的 HTML 图表,希望为您的开发带来帮助。

带有 JavaScript 的 HTML 图表

制作HTML图表对于各个级别的开发工作者来说可以轻松实现,但基础的HTML 5图表功能和性能有限,特别是在数据点的数量或渲染性能方面。
今天我们将用一个HTML模板和LightningCharts制作一个具有高性能可视化的HTML图表。其中一些库可以作为嵌入式JavaScript代码使用。
本次我们将创建三个图表。

  • HTML光标图
  • 条形图
  • 环形图

项目概况

下方视频演示了在运用"lc js"HTML模板时,带有JavaScript的HTML图表是怎样展示的,本个应用程序有三种不同的图表类型。
您可以看到,对于这个特定的项目,您只需要一个 Web 浏览器就可以对该HTML 图表进行可视化,这次我们将创建一些更高级的东西,通过使用LightningChart JS来确保高性能和快速交互式 HTML 图表与 JavaScript 的安全。

配置模板

  1. 请下载本文中提供的模板。
  2. 您将看到一个文件树,其中每个 HTML 文件都具有 Head – Style – Body 结构。

在标题部分,我们将指定页面的属性。在这里,我们将为模板指定样式属性 (CSS)。
在正文中,我们将嵌入我们的 JavaScript 代码。对于 HTML,我们将使用 <script> 标签来处理客户端 JavaScript。HTML 模板非常简单,但您可以根据需要对其进行编辑并使其变得更复杂。

注意:与我们之前的文章和教程相反,这次我们不会运行 NPM INSTALL 代码,因为这不是 NodeJS 项目。

条形图

在这三个文件中,我们将看到以下源脚本部分:

const {
lightningChart,
emptyLine,
AutoCursorModes,
UIOrigins,
LegendBoxBuilders,
AxisScrollStrategies,
AxisTickStrategies,
UIElementBuilders,
Themes
} = lcjs
const lc = lightningChart()

IIFE 文件(立即调用函数表达式)包含创建图表所需的所有 Lightning Chart 函数和属性。导入此文件,我们将能够提取每个图表所需的部分:

const {
lightningChart,
emptyLine,
AutoCursorModes,
UIOrigins,
LegendBoxBuilders,
AxisScrollStrategies,
AxisTickStrategies,
UIElementBuilders,
Themes
} = lcjs
const lc = lightningChart()

现在我们必须为条形图构建一个界面。该界面将包含该图表的所有属性。

let barChart
{
barChart = (options) => {
const figureThickness = 10
                const figureGap = figureThickness * .25
                const groupGap = figureGap * 3.0
                const groups = []
const categories = []

在上图中,我们指定了所有垂直条的大小。对于此图表,坐标轴和图表对象是必需的。在图表对象中,我们将指定全局属性,如标题、页面填充和鼠标行为。

const chart = lc.ChartXY(options)
.setTitle('Grouped Bars (Employee Count)')
.setAutoCursorMode(AutoCursorModes.onHover)
// Disable mouse interactions (e.g. zooming and panning) of plotting area
.setMouseInteractions(false)
// Temporary fix for library-side bug. Remove after fixed.
.setPadding({ bottom: 30 })
// X-axis of the series
const axisX = chart.getDefaultAxisX()
.setMouseInteractions(false)
.setScrollStrategy(undefined)
// Disable default ticks.
.setTickStrategy(AxisTickStrategies.Empty)
// Y-axis of the series
const axisY = chart.getDefaultAxisY()
.setMouseInteractions(false)
.setTitle('Number of Employees')
.setInterval(0, 70)
.setScrollStrategy(AxisScrollStrategies.fitting)

要创建引用特定轴的对象,我们将使用函数[getDefaultAxisX -Y]并添加一些其他属性。[ setAutoCursor]函数可以让我们修改光标在图表上的视觉属性。

chart.setAutoCursor(cursor => cursor
.disposePointMarker()
.disposeTickMarkerX()
.disposeTickMarkerY()
.setGridStrokeXStyle(emptyLine)
.setGridStrokeYStyle(emptyLine)
.setResultTable((table) => {
table
.setOrigin(UIOrigins.CenterBottom)
})
)

emptyLine 属性将隐藏线指示器:

以下函数创建了一个矩形系列(针对每个类别),它向其中添加了游标功能。

const createSeriesForCategory = (category) => {
const series = chart.addRectangleSeries()
// Change how marker displays its information.
series.setCursorResultTableFormatter((builder, series, figure) => {
// Find cached entry for the figure.
    let entry = {
name: category.name,
value: category.data[category.figures.indexOf(figure)]
}
// Parse result table content from values of 'entry'.
    return builder
.addRow('Department:', entry.name)
.addRow('# of employees:', String(entry.value))
})
return series
} 

在前面的函数中,我们添加了部门名称和员工人数。这些值现在将作为垂直线内的行数据添加。在以下属性中,我们可以将这些值的行为指定为“图例框”。

const legendBox = chart.addLegendBox(LegendBoxBuilders.VerticalLegendBox)
                  
    .setAutoDispose({
        type: 'max-width',
        maxWidth: 0.20,
    })
    .setTitle('Department') 

以下函数根据组和类别的值重新绘制条形图:

const redraw = () => {
    let x = 0
    for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {
        const group = groups[groupIndex]
        const xStart = x
        for (const category of categories) {
            const value = category.data[groupIndex]
            if (value !== undefined) {
                // Position figure of respective value.
                const figure = category.figures[groupIndex]
                figure.setDimensions({
                     x,
                     y: 0,
                     width: figureThickness,
                     height: value
                })
                // Figure gap
                x += figureThickness + figureGap
            }
        }
        // Position CustomTick
        group.tick.setValue((xStart + x - figureGap) / 2)
                    
        // Group gap
        x += groupGap
    }
    axisX.setInterval(-(groupGap + figureGap), x)
}

我们必须添加组和类别。对于每个类别,我们将使用重绘函数绘制一个条形图。最后,barChart 对象将提供类别和组。

const addGroups = (names) => {
    for (const name of names)
        groups.push({
            name,
            tick: axisX.addCustomTick(UIElementBuilders.AxisTick)
                .setGridStrokeLength(0)
                .setTextFormatter((_) => name)
        })
}
const addCategory = (entry) => {
    // Each category has its own series.
    const series = createSeriesForCategory(entry)
        .setName(entry.name)
    entry.figures = entry.data.map((value) => series.add({ x: 0, y: 0, width: 0, height: 0 }))
    legendBox.add(series)
    categories.push(entry)
    redraw()
}
// Return public methods of a bar chart interface.
return {
    addCategory,
    addGroups
}

最后,我们可以为图表指定主题 (UI),并将类别和数据添加到该对象。

const chart = barChart({
    theme: Themes.darkGreen,
})

// Add groups
chart.addGroups(['Finland', 'Germany', 'UK'])

// Add categories of bars
const categories = ['Engineers', 'Sales', 'Marketing']
const data = [  [50, 27, 24],
  [19, 40, 14],
  [33, 33, 62]
]
data.forEach((data, i) =>  chart.addCategory({
   name: categories[i],
    data
    })
) 

环形图

现在,我们需要创建一个包含此类图表所有属性的对象。在这种情况下,我们将创建 [donut] 对象。我们可以添加主题和类型图表属性。
对于 HTML 属性,我们可以设置标题、填充、动画和半径属性:

const donut = lightningChart().Pie({
    theme: Themes.darkGold,
    type: PieChartTypes.LabelsInsideSlices
})
    .setTitle('Inter Hotels - hotel visitors in June 2016')
    .setPadding({ top: 40 })
    .setAnimationsEnabled(true)
    .setMultipleSliceExplosion(false)
    // Style as "Donut Chart"
    .setInnerRadius(60)

// ----- Static data -----
const data = {
    country: ['US', 'Canada', 'Greece', 'UK', 'Finland', 'Denmark'],
    values: [15000, 20030, 8237, 16790, 9842, 4300]
} 

[data] 对象将是一个 JSON 对象,其中包含要在此图表上显示的数据。这个 JSON 可以从另一个文件导入,对于这个例子,我直接在嵌入式代码中创建了 JSON 对象。

在下面的函数中,我们将映射数组对象中的所有 JSON 成员:

const processedData = []
let totalVisitor = 0
for (let i = 0; i < data.values.length; i++) {
    totalVisitor += data.values[i]
    processedData.push({ name: `${data.country[i]}`, value: data.values[i] })
}

现在我们可以映射数组对象中的所有成员。所有值都将作为新的“切片”添加到甜甜圈中(使用 [addSlice] 函数)。

processedData.map((item) => donut.addSlice(item.name, item.value))
donut.setLabelFormatter(SliceLabelFormatters.NamePlusValue)
// ----- Add LegendBox -----
donut.addLegendBox(LegendBoxBuilders.HorizontalLegendBox)
           
    .setAutoDispose({
        type: 'max-width',
        maxWidth: 0.80,
    })
    .add(donut) 

[addLegendBox] 函数将创建一个框,其中包含甜甜圈中切片的名称。我们可以将其创建为水平框或垂直框:

为了完成此图表,我们可以添加具有某些属性的 HTML 文本。

donut.addUIElement(UIElementBuilders.TextBox)
    .setPosition({ x: 50, y: 50 })
    .setOrigin(UIOrigins.CenterTop)
    .setDraggingMode(UIDraggingModes.notDraggable)
    .setMargin(5)
    .setTextFont(fontSettings => fontSettings.setSize(25))
    .setText(`Total: ${totalVisitor} visitors`)
    .setBackground((background) => background
        .setFillStyle(emptyFill)
        .setStrokeStyle(emptyLine)
    )

这有助于显示汇总数据:

游标图表

对于此图表,我们有以下三个常量:

// names of the data the series
const names = ["Stock Price A", "Stock Price B", "Stock Price C"];
// define date that matches value of 0 on date time axis.
const dateOrigin = new Date(2020, 0, 1);
// X step between data points.
const dataFrequency = 30 * 24 * 60 * 60 * 1000;

数组 [names] 将包含三个类别;每个类别将对应于图表中的线条。我们现在将创建图表对象。

图表对象的类型为 [ChartXY];我们可以添加一些 UI 属性,例如主题和标题。
要配置轴,我们将使用 [getDefaultAxis] 函数。对于 X 轴,我们将指定计算策略,在本例中为 [DateTime]。我们可以使用 dateOrigin 常量的值来设置起始日期。

// Create a XY Chart.
const chart = lightningChart()
  .ChartXY({
    theme: Themes.darkGold,
  })
  // Disable native AutoCursor to create custom
  .setAutoCursorMode(AutoCursorModes.disabled)
  // set title of the chart
  .setTitle("Custom Cursor using HTML");
      
// Configure X axis as date time.
chart
  .getDefaultAxisX()
  .setTickStrategy(AxisTickStrategies.DateTime, (tickStrategy) =>
    tickStrategy.setDateOrigin(dateOrigin)
  );
      
chart.getDefaultAxisY().setTitle("Stock price variation €");

为了填充我们的图表,我们需要创建一个系列数据。对于此图表,我们将提供系列数组。

数组的大小是三个,参考图表中显示的线条。点数限制为 20,而 X 轴的值将使用 [dataFrequency] 常量计算。

const series = new Array(3).fill(0).map((_, i) => {
const nSeries = chart
.addPointLineSeries()
.setMouseInteractions(false)
createProgressiveTraceGenerator()
.setNumberOfPoints(20)
.generate()
.toPromise()
.then((data) => {
return nSeries.setName(names[i]).add(
data.map((point) => ({
x: point.x * dataFrequency,
y: point.y,
}))
);
});
return nSeries;
}); 

现在我们将文本框添加到数据点。基本上,我们创建了一些带有 id 的 HTML div。这些 div 将使用 id 作为标识符动态修改。

const styleElem = document.head.appendChild(document.createElement("style"));
const textBox = document.createElement("div");
textBox.id = "resultTable";
const line = document.createElement("div");
line.id = "line";
const line2 = document.createElement("div");
line2.id = "line2";
const arrow = document.createElement("div");
arrow.id = "arrow";
textBox.appendChild(line);
textBox.appendChild(line2);
textBox.appendChild(arrow);
chart.engine.container.append(textBox);

您会找到 [onSeriesBackgroundMouseMove] 函数。在这里您将能够修改光标行为,例如,添加淡入淡出效果、修改文本框的比例以及向光标添加 HTML 属性。

chart.onSeriesBackgroundMouseMove((_, event) => {
  const mouseLocationClient = { x: event.clientX, y: event.clientY };
  // Translate mouse location to LCJS coordinate system for solving data points from series, and translating to Axes.
  const mouseLocationEngine = chart.engine.clientLocation2Engine(
    mouseLocationClient.x,
    mouseLocationClient.y
  );
        
  // Translate mouse location to Axis.
  const mouseLocationAxis = translatePoint(
    mouseLocationEngine,
    chart.engine.scale,
    series[0].scale
  );
        
  // Solve nearest data point to the mouse on each series.
  const nearestDataPoints = series.map((el) =>
    el.solveNearestFromScreen(mouseLocationEngine)
  );

最后,我们只需要为我们之前创建的 div 添加 CSS 样式。我们可以将 CSS 字符串类附加到文档标头。

function addStyle(styleString) {
  const style = document.createElement("style");
  style.textContent = styleString;
  document.head.append(style);
} 

在 addStyle 对象中,我们将使用我们之前指定的 ID 找到每个 div 的属性:

addStyle(`
    #resultTable {
        background-color: rgba(24, 24, 24, 0.9);
        color: white;
        font-size: 12px;
        border: solid white 2px;
        border-radius: 5px;
        width: 142px;
        // height: 110px;
        height: auto;
        top: 0;
        left: 0;
        position: fixed;
        padding: 0;
        pointer-events:none;
        z-index: 1;
        transition: left 0.2s, top 0.2s, opacity 0.2s;
        opacity: 0.0;
    }

使用 JavaScript 制作 HTML 图表

在之前的文章中,我们使用了 Node JS、Electron JS、Quasar JS 以及即将推出的 Android 和 iOS 等技术……但在所有这些中,都需要预先了解这些框架的使用。
并非所有人都能在复杂的 Web 项目上花费大量时间,大部分人可能只是需要一种更专业的方式来展示他们的数据。
本文展示了 LightningChart 作为简单 HTML 模板中嵌入式代码的灵活性,以及如何使用 JavaScript 轻松创建 HTML 图表。
LightningChart 为我们提供了各种示例或模板,使我们能够将代码复制并粘贴到脚本标签中来创建高级图表。
很明显,自定义这些图表可能会很复杂,但是在之前和即将发布的文章中,我们将尝试涵盖所有需求,这样一个简单的 HTML 实现可能就非常简单了。

另一个优点是 LC 可以为我们提供的出色的图形界面。不用创建复杂的 JavaScript、JQuery 或 CSS 函数,我们只需使用带有 JavaScript 的 HTML 图表,就可以生成与任何 Web 浏览器兼容的漂亮图表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis基础篇——Redis常见命令及数据类型详解

文章目录1. Redis常见命令2. Redis数据结构介绍3. 通用命令KEYSDELEXISTSEXPIRETTL4. Redis 命令类型4.1 String 类型String 类型常见命令key的层级格式4.2 Hash 类型Hash 类型常用命令4.3 List 类型List 类型的常见命令4.4 Set 类型Set 类型的常见命令4.5 SortSet 类型SortedS…

全局描述符表

文章目录段描述符全局描述符表GDT段选择子进入保护模式步骤在开始介绍全局描述符之前&#xff0c;先了解一下段描述符。 段描述符 内存段是一片内存区域&#xff0c;访问内存就要提供段基址&#xff08;段基址属性&#xff09;以及段界限属性&#xff08;约束段大小&#xff…

美团前端一面必会react面试题

state 和 props 触发更新的生命周期分别有什么区别&#xff1f; state 更新流程&#xff1a; 这个过程当中涉及的函数&#xff1a; shouldComponentUpdate: 当组件的 state 或 props 发生改变时&#xff0c;都会首先触发这个生命周期函数。它会接收两个参数&#xff1a;nextP…

分布式存储综述与方案选型

文章目录引言基本诉求存储选型考虑的要素分布式存储的野蛮生长史主要开源选型GFS(Google File System)HDFS (Hadoop Distributed File System)miniocephTFSSwiftfastDFSGridFSMooseFSGlusterFSMogileFS一些国产的xFS阿里腾讯百度京东网易字节跳动美团滴滴结论数据库选型分布式存…

Java基础之《netty(21)—WebSocket长连接开发》

一、实例要求 1、http协议是无状态的&#xff0c;浏览器和服务器间的请求响应一次&#xff0c;下一次会重新创建连接 2、要求&#xff1a;实现基于webSocket的长连接的全双工的交互 3、改变http协议多次请求的约束&#xff0c;实现长连接了&#xff0c;服务器可以发送消息给浏…

Go第 10 章 :面向对象编程(上)

Go第 10 章 &#xff1a;面向对象编程(上) 10.1 结构体 10.1.1 看一个问题 10.1.2 使用现有技术解决 单独的定义变量解决 代码演示&#xff1a; 使用数组解决 代码演示&#xff1a; 10.1.3 现有技术解决的缺点分析 使用变量或者数组来解决养猫的问题&#xff0c;不利于数…

AI与艺术——图像生成网络经典算法

生成模型是一种训练模型进行无监督学习的模型&#xff0c;即&#xff0c;给模型一组数据&#xff0c;希望从数据中学习到信息后的模型能够生成一组和训练集尽可能相近的数据。图像生成&#xff08;Image generation&#xff0c;IG&#xff09;则是指从现有数据集生成新的图像的…

代码块和执行顺序

1、什么是代码块 使用{}定义的一段代码我们称之为代码块 一般分为&#xff1a; 1. 普通代码块 2. 实例代码块 3. 静态代码块 2、普通代码块 定义在方法中的代码块&#xff0c;可以用于限定局部变量的生命周期。 public class Main{public static void main(String[] args) {{…

【分享】百度更喜欢自媒体站,9种方法让你轻松玩转微博营销

微博营销是指通过微博平台为商家、个人等创造价值而执行的一种营销方式。 以下九种方式&#xff0c;你一定要学习一下&#xff0c;视频最后&#xff0c;有干货。 1、注重价值的传递 企业博客经营者首先要改变观念——企业微博的“索取”与“给予”之分&#xff0c;企业微博是…

2023你冲不冲,冲冲冲冲~~

前言&#xff1a;\textcolor{Green}{前言&#xff1a;}前言&#xff1a; &#x1f49e;2022已经成为历史&#xff0c;趁着还没有遗忘来看看我这一年发生了什么事。 在这一年中有很多的收获也有一些遗憾&#xff0c;但是这不会让我停下来&#xff0c;未来的2023又会发生什么&…

ArcGIS 中的 7 种主要地理处理工具

地理处理工具可以提高人们的工作效率&#xff0c;并且这些工具可以批量应用于编辑&#xff0c;例如应用于所有功能或所有选定功能。本文将和大家一起探讨 7 个 ArcGIS 中的地理处理工具。 地理处理的用途 模型中的地理处理工具可解决许多空间完整性的问题&#xff0c;应用地理…

分布式缓存系统 Ignite、Hazelcast、Ehcache

一、Apache IgniteApache Ignite是一个以内存为中心的分布式数据库、缓存和处理平台&#xff0c;支持事务、分析以及流式负载&#xff0c;可以在PB级数据上享有内存级的性能。如果禁用原生持久化&#xff0c;Ignite就是一个分布式缓存&#xff0c;它实现了JCache规范&#xff0…

深入解析Linux虚拟化KVM-Qemu分析之中断虚拟化

说明&#xff1a; KVM版本&#xff1a;5.9.1QEMU版本&#xff1a;5.0.0工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 本文会将ARM GICv2中断虚拟化的总体框架和流程讲清楚&#xff0c;这个曾经困扰我好几天的问题在被捋清的那一刻&#xff0c;让我有点每有…

JsonUtility读写json简单应用

使用Unity提供的JsonUtility 简单封装了一个将数据以json格式存储到本地,方便数据读写的案例;一共三个脚本:MyJsonRW : 提供SaveJsonData和LoadWithJson,实现数据与json的转换和读写;TestData : 测试数据类,列举了部分常用的简单数据类型(不过有坑,后面会说);MyJsonExample : 例…

新诤信张强—兔年展望|2023-2025:看风的必不撒种、望云的必不收割

新诤信知识产权服务股份有限公司 首席技术官 张强 “看风的必不撒种、望云的必不收割”出自古老的犹太智慧书《传道书》&#xff0c;意思是&#xff0c;如果要等刮风才撒种&#xff0c;快要下雨才收割&#xff0c;一切就都来不及了。元宇宙的发展布局&#xff0c;也是这个道理…

基础算法[四]之图的那些事儿

文章目录前言图的表示邻接矩阵邻接表结构存储遍历路径搜索多源最短路问题问题描述Floyd实现模板单源最短路径问题Dijkstra算法朴素版本堆优化邻接表python实现Bellman-Ford 算法实现SPFA 算法实现python 版本判断负环小结最小生成树Prim算法Kruskra算法实现python版本二分图二分…

网络资源归档标准WARC介绍

WARC---Web ARChive 01 ● WARC格式概述 ● WARC&#xff08;Web ARChive&#xff09;格式是网络资源存档中使用的常见文件格式&#xff0c;全称为Web Archive File Format&#xff0c;由互联网保存联盟&#xff08;International Internet Preservation Consortium&#xff0…

2023年1月6日星期五-PPP/BPP相关学习

独立均匀分布matlab的rand指令可以帮助我们生成[0,1]的均匀分布的数据,这样,如果我们想要[a,b]的分布数据,只需要a+(b-a)*rand就可以了。 [a,b] 均值,标准差 均值

Git 常用基本命令

文章目录基本命令仓库相关命令提交相关命令分支相关命令tag 相关命令撤销相关命令IDEA Git 相关操作仓库相关操作提交相关操作提交代码步骤分支相关操作tag 相关操作撤销相关操作参考资料本文主要介绍 Git 常用的基本命令。基本命令 仓库相关命令 创建新仓库 git init克隆项…

C#,图像二值化(15)——全局阈值的一维最大熵(1D maxent)算法及源程序

1、最大熵&#xff08;maxent&#xff09; 最大熵&#xff08;maxent&#xff09;方法植根于信息理论&#xff0c;并已成功应用于许多领域&#xff0c;包括物理学和自然语言处理。它创建了一个模型&#xff0c;该模型最好地解释了可用数据&#xff0c;但有一个约束&#xff0c…