趋势线

趋势线是图表中用于展示数据趋势和预测未来值的附加线。SpreadJS 支持六种趋势线类型(线性、指数、对数、多项式、幂、移动平均),可以设置趋势线样式、显示公式和 R² 值,以及向前向后预测数据。适用于销售分析、库存管理、财务预测等数据分析场景。

概述 本 Demo 展示了如何为图表添加趋势线并进行自定义配置。Demo 包含两个工作表: Basic 工作表:演示线性趋势线和指数趋势线的基本用法 Advance 工作表:演示多项式趋势线的高级配置(显示公式和 R² 值)以及趋势线的前向预测功能 实现思路 准备两份数据源:广告投放与销售数据、月度销售数据 创建四个图表:两个散点图和两个柱状图 为每个图表的数据系列添加不同类型的趋势线 配置趋势线的样式、阶数、公式显示和预测周期等属性 代码解析 添加线性趋势线 这段代码创建了一个散点图,并为其第一个系列添加线性趋势线。通过 series().get() 获取系列对象,设置 trendlines 属性后,再用 series().set() 更新。趋势线的颜色设置为红色,宽度为 2。 配置多项式趋势线并显示公式 这段代码配置了一个 4 阶多项式趋势线。order 属性设置多项式的阶数(2-6),displayEquation 和 displayRSquared 属性分别控制是否在图表上显示趋势线公式和 R² 值。 设置趋势线前向预测 这段代码添加指数趋势线,并通过 forward: 3 将趋势线向前延伸 3 个周期进行预测。同时使用虚线样式(dashStyle: GC.Spread.Sheets.Charts.LineDashStyle.dash)区分趋势线和数据线。 运行效果 Basic 工作表: 第一个散点图显示广告投放与销量的关系,包含红色线性趋势线 第二个柱状图显示月度销售数据,包含橙色虚线的指数趋势线 Advance 工作表: 第一个散点图显示带公式和 R² 值的 4 阶多项式趋势线 第二个柱状图显示向前预测 3 个周期的指数趋势线 API 参考 趋势线配置属性 type:趋势线类型,使用 GC.Spread.Sheets.Charts.TrendlineType 枚举(linear、exponential、polynomial 等) order:多项式趋势线的阶数(2-6) forward / backward:向前或向后预测的周期数 displayEquation:是否显示趋势线公式 displayRSquared:是否显示 R² 值 style:趋势线样式,包括 color、width、dashStyle 等 period:移动平均趋势线的周期数 系列操作方法
var advData = [ ['Advertising', 'Items sold'], [28, 17], [34, 19], [41, 18], [47, 20], [52, 24], [59, 26], [65, 29], [72, 31], [80, 34], [87, 39], [94, 40], [102, 42], ]; var salesData = [ ['', 'Sales'], ['Jan', 54], ['Feb', 60], ['Mar', 86], ['Apr', 92], ['May', 112], ['Jun', 157], ['Jul', 202], ['Aug', 195], ['Sep', 187], ['Oct', 194], ['Nov', 238], ['Dec', 289], ]; window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 2 }); initSheet1(spread); initSheet2(spread); }; function initSheet1(spread) { var sheet1 = spread.getSheet(0); sheet1.name('Basic'); sheet1.setArray(0, 0, advData); sheet1.setArray(18, 0, salesData); for (var i = 0; i < 12; i ++) { sheet1.getCell(i + 1, 0).formatter('$#,##0'); } // Choose a suitable trendline type from GC.Spread.Sheets.Charts.TrendlineType to fit your chart var chart1 = sheet1.charts.add("chart1", GC.Spread.Sheets.Charts.ChartType.xyScatter, 130, 5, 500, 350, "A1:B13", GC.Spread.Sheets.Charts.RowCol.columns); var axes = chart1.axes(); axes.primaryValue.title.text = 'Items sold'; axes.primaryCategory.title.text = 'Advertising'; axes.primaryCategory.majorGridLine.visible = true; axes.primaryCategory.majorUnit = 10; chart1.axes(axes); var targetSeriesIndex = 0; var targetSeries = chart1.series().get(targetSeriesIndex); var linearTrendline = { type: GC.Spread.Sheets.Charts.TrendlineType.linear, style: { color: 'red', width: 2 } }; targetSeries.trendlines = [ linearTrendline ]; chart1.series().set(targetSeriesIndex, targetSeries); var chart2 = sheet1.charts.add("chart2", GC.Spread.Sheets.Charts.ChartType.columnClustered, 130, 360, 500, 350, "A19:B31", GC.Spread.Sheets.Charts.RowCol.columns); var targetSeriesIndex = 0; var targetSeries = chart2.series().get(targetSeriesIndex); var exponentialTrendline = { type: GC.Spread.Sheets.Charts.TrendlineType.exponential, style: { color: 'orange', width: 2, dashStyle: GC.Spread.Sheets.Charts.LineDashStyle.dash } }; targetSeries.trendlines = [ exponentialTrendline ]; chart2.series().set(targetSeriesIndex, targetSeries); } function initSheet2(spread) { // More settings var sheet2 = spread.getSheet(1); sheet2.name('Advance'); sheet2.setArray(0, 0, advData); sheet2.setArray(18, 0, salesData); for (var i = 0; i < 12; i ++) { sheet2.getCell(i + 1, 0).formatter('$#,##0'); } // Change the order(the highest power for the independent variable) of polynomial trendline to adjust R-squared value // Also you could show the equation and R-squared value in chart area if you want var chart3 = sheet2.charts.add("chart3", GC.Spread.Sheets.Charts.ChartType.xyScatter, 130, 5, 500, 350, "A1:B13", GC.Spread.Sheets.Charts.RowCol.columns); var axes = chart3.axes(); axes.primaryValue.title.text = 'Items sold'; axes.primaryCategory.title.text = 'Advertising'; axes.primaryCategory.majorGridLine.visible = true; axes.primaryCategory.majorUnit = 10; chart3.axes(axes); var targetSeriesIndex = 0; var targetSeries = chart3.series().get(targetSeriesIndex); var polynomialTrendline = { type: GC.Spread.Sheets.Charts.TrendlineType.polynomial, order: 4, displayEquation: true, displayRSquared: true, style: { color: 'red', width: 2 } }; targetSeries.trendlines = [ polynomialTrendline ]; chart3.series().set(targetSeriesIndex, targetSeries); // Set a value in the Forward and Backward fields to project your data into the future. var chart4 = sheet2.charts.add("chart4", GC.Spread.Sheets.Charts.ChartType.columnClustered, 130, 360, 500, 350, "A19:B31", GC.Spread.Sheets.Charts.RowCol.columns); var targetSeriesIndex = 0; var targetSeries = chart4.series().get(targetSeriesIndex); var exponentialTrendline = { type: GC.Spread.Sheets.Charts.TrendlineType.exponential, forward: 3, style: { color: 'orange', width: 2, dashStyle: GC.Spread.Sheets.Charts.LineDashStyle.dash } }; targetSeries.trendlines = [ exponentialTrendline ]; chart4.series().set(targetSeriesIndex, targetSeries); }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta name="spreadjs culture" content="zh-cn" /> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets-shapes/dist/gc.spread.sheets.shapes.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets-charts/dist/gc.spread.sheets.charts.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div class="sample-tutorial"> <div id="ss" class="sample-spreadsheets"></div> </div> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: 100% ; height: 100%; overflow: hidden; float: left; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }