折线图

SpreadJS 支持多种折线图类型,包括普通折线图、堆积折线图、百分比堆积折线图,以及带有数据标记的折线图变体。折线图通过连续的线条显示数据趋势,适合展示随时间或类别变化的连续数据,广泛应用于销售趋势分析、市场份额追踪等场景。

本 Demo 展示了 6 种折线图类型,每种图表都展示了平滑和非平滑两种线条样式,帮助用户直观理解不同折线图的应用场景和视觉效果。

概述 本 Demo 展示了 SpreadJS 支持的 6 种折线图类型及其样式定制功能。通过创建多个工作表,每种工作表展示一种折线图类型(包括普通折线图、堆积折线图、百分比堆积折线图及其带数据标记的变体),并对比展示平滑线条和非平滑线条的视觉效果。Demo 还演示了如何自定义图表标题、图例位置、数据标签、坐标轴格式以及数据标记样式。 实现思路 创建包含 6 个工作表的 Workbook,每个工作表对应一种折线图类型 为所有工作表准备相同的浏览器市场份额数据(2012-2017年) 在每个工作表中创建 2 个图表:左侧图表使用折线连接,右侧图表使用平滑曲线连接 统一设置图表的标题、图例位置(底部)、数据标签(显示百分比)和坐标轴格式 为带数据标记的图表类型自定义标记的形状、大小、颜色和边框 代码解析 创建折线图 使用 sheet.charts.add() 方法创建图表,参数依次为图表名称、图表类型、x坐标、y坐标、宽度、高度、数据范围、数据方向。ChartType 枚举定义了不同的折线图类型。 设置平滑线条 通过 series.smooth 属性控制线条是否平滑。smooth = true 时使用曲线连接数据点,smooth = false 时使用折线连接。同时设置 border.width 调整线条粗细。 自定义数据标记 为每个系列设置不同的数据标记样式。symbol 对象包含 shape(形状,0=圆形,2=菱形,8=星形)、size(大小)、fill(填充色)和 border(边框样式)属性。 配置图表元素 通过 chart.legend() 设置图例可见性和位置,通过 chart.dataLabels() 配置数据标签的显示内容和格式。 运行效果 Demo 创建了 6 个工作表标签,分别对应 line、lineStacked、lineStacked100、lineMarkers、lineMarkersStacked、lineMarkersStacked100 六种折线图类型 每个工作表中包含 2 个图表,左侧使用折线连接,右侧使用平滑曲线连接,方便对比视觉效果 所有图表显示 2012-2017 年 Chrome、FireFox、IE 三种浏览器的市场份额变化趋势 带数据标记的图表(后三个工作表)在每个数据点显示不同形状和颜色的标记(圆形、星形、菱形) 图表标题显示为 "Browser Market Share",图例位于底部,数据标签显示百分比值 API 参考 charts.add() 方法 name: 图表名称 chartType: 图表类型,使用 GC.Spread.Sheets.Charts.ChartType 枚举 x、y: 图表在工作表中的位置 width、height: 图表尺寸 dataRange: 数据范围字符串 dataOrientation: 数据方向(行或列) series 属性 折线图类型 ChartType.line: 普通折线图 ChartType.lineStacked: 堆积折线图 ChartType.lineStacked100: 百分比堆积折线图 ChartType.lineMarkers: 带数据标记的折线图 ChartType.lineMarkersStacked: 带数据标记的堆积折线图 ChartType.lineMarkersStacked100: 带数据标记的百分比堆积折线图
window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 6}); initSpread(spread); }; function initSpread(spread) { var chartType = [{ type: GC.Spread.Sheets.Charts.ChartType.line, desc: "line", }, { type: GC.Spread.Sheets.Charts.ChartType.lineStacked, desc: "lineStacked", }, { type: GC.Spread.Sheets.Charts.ChartType.lineStacked100, desc: "lineStacked100", }, { type: GC.Spread.Sheets.Charts.ChartType.lineMarkers, desc: "lineMarkers", withMarker: true, }, { type: GC.Spread.Sheets.Charts.ChartType.lineMarkersStacked, desc: "lineMarkersStacked", withMarker: true, }, { type: GC.Spread.Sheets.Charts.ChartType.lineMarkersStacked100, desc: "lineMarkersStacked100", withMarker: true, }]; spread.suspendPaint(); var sheets = spread.sheets; for (var i = 0; i < chartType.length; i++) { var sheet = sheets[i]; initSheet(sheet, chartType[i].desc); initChart(sheet, chartType[i].type, chartType[i].withMarker);//add chart } spread.options.tabStripRatio = 0.8; spread.resumePaint(); } function initSheet(sheet, sheetName) { sheet.name(sheetName); //prepare data for chart var dataArray = [ ["", '2012', '2013', '2014', '2015', '2016', '2017'], ["Chrome", 0.3782, 0.5663, 0.4966, 0.6689, 0.4230, 0.6360], ["FireFox", 0.1284, 0.2030, 0.2801, 0.2560, 0.1531, 0.3304], ["IE", 0.3214, 0.2491, 0.2455, 0.1652, 0.2073, 0.0834], ]; sheet.setArray(0, 0, dataArray); } function initChart(sheet, chartType, marker) { //add chart let chart = sheet.charts.add((sheet.name() + 'Chart1'), chartType, 10, 85, 450, 350, "A1:G4", GC.Spread.Sheets.Charts.RowCol.rows); changeChartLegend(chart); changeChartArea(chart); changChartDataLabels(chart); changeGridLines(chart); changeLineStyle(chart, false); changeChartAxes(chart); changeChartTitle(chart); if (marker) { changeMarker(chart); } chart = sheet.charts.add((sheet.name() + 'Chart2'), chartType, 470, 85, 450, 350, "A1:G4", GC.Spread.Sheets.Charts.RowCol.rows); changeChartLegend(chart); changeChartArea(chart); changChartDataLabels(chart); changeGridLines(chart); changeLineStyle(chart, true); changeChartAxes(chart); changeChartTitle(chart); if (marker) { changeMarker(chart); } } function changeChartTitle(chart) { var title = chart.title(); title.text = "Browser Market Share"; title.fontSize = 18; chart.title(title); } //change legend position function changeChartLegend(chart) { var legend = chart.legend(); legend.visible = true; var legendPosition = GC.Spread.Sheets.Charts.LegendPosition; legend.position = legendPosition.bottom; chart.legend(legend); } //change backColor function changeChartArea(chart) { var chartArea = chart.chartArea(); chartArea.fontSize = 14; chart.chartArea(chartArea); } // show dataLabels function changChartDataLabels(chart) { var dataLabels = chart.dataLabels(); dataLabels.showValue = true; dataLabels.showSeriesName = false; dataLabels.showCategoryName = false; dataLabels.format = "0%"; var dataLabelPosition = GC.Spread.Sheets.Charts.DataLabelPosition; dataLabels.position = dataLabelPosition.above; chart.dataLabels(dataLabels); } // hide gridLines function changeGridLines(chart) { var gridLinesAxes = chart.axes(); gridLinesAxes.primaryValue.min = null; chart.axes(gridLinesAxes); } //change legend position function changeChartAxes(chart) { chart.axes({primaryValue:{format:"0%"}}); } // change line style function changeLineStyle(chart, smooth) { var series = chart.series().get(); var seriesItem; for (var i = 0; i < series.length; i++) { seriesItem = series[i]; seriesItem.border.width = 2; seriesItem.smooth = smooth; chart.series().set(i, seriesItem); } } // change Marker function changeMarker(chart) { var preSet = [ { fill: "", shape: 0 /** circle */, size: 7, border: { color: "blue", width: 1 } }, { fill: "", shape: 8/** star */, size: 9, border: { color: "black", width: 1 } }, { fill: "yellow", shape: 2 /** diamond */, size: 7, border: { color: "red", width: 2 } }, ]; var series = chart.series().get(); var seriesItem; for (var i = 0; i < series.length; i++) { seriesItem = series[i]; seriesItem.symbol = preSet[i]; chart.series().set(i, seriesItem); } }
<!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$/zh/purejs/node_modules/@grapecity-software/spread-sheets-resources-zh/dist/gc.spread.sheets.resources.zh.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 id="ss" class="sample-tutorial"></div> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }