通过循环分配的 highcharts 的系列名称和数据

Posted

技术标签:

【中文标题】通过循环分配的 highcharts 的系列名称和数据【英文标题】:series name and data for highcharts assigned via loop 【发布时间】:2020-02-20 03:37:41 【问题描述】:

我正在尝试循环 JSON 对象列表,并将一些键指定为 highcharts 系列的名称,并将 converversData 指定为数据列表。我已经放置了一个静态图表示例,其中包含我试图为图表的系列数据实现的目标。如果有帮助,我也给出了我的 JSON 模式的示例。

我也有一个 jsfiddle static expected chart jsfiddle

这是我的静态预期输出图表:

Highcharts.chart('container', 

    title: 
        text: 'mychart'
    ,

    subtitle: 
        text: 'mychart'
    ,

    xAxis: 
    categories: [
      'r611.10i',
      'r622.15i',
      'r633.7i',
      '701.10i',
      '702.11i',
    ],
    crosshair: true
  ,
  yAxis: 
    min: 0,
    title: 
      text: 'Convergence'
    
  ,
    
    series: [
        name: 'tc1',
        data: [1.1, 1.2, 1.3, 1.4, 1.5]
    , 
        name: 'tc2',
        data: [2.1, 2.2, 2.3, 2.4, 2.5]
    , 
        name: 'tc3',
        data: [3.1, 3.2, 3.3, 3.4, 3.5]
    ],

    responsive: 
        rules: [
            condition: 
                maxWidth: 500
            ,
            chartOptions: 
                legend: 
                    layout: 'horizontal',
                    align: 'center',
                    verticalAlign: 'bottom'
                
            
        ]
    

);
#container 
	min-width: 310px;
	max-width: 800px;
	height: 400px;
	margin: 0 auto
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/series-label.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script src="https://code.highcharts.com/modules/export-data.js"></script>
<div id="container"></div>

这是我的 JSON 架构数据:

var data1 = 
  "TestBedGeneralInfo": 
    "TestCaseName": ['tc1','tc2', 'tc3', 'tc4', 'tc5']
  ,

  "TestCaseData": 
    "tc1": 
      "convergenceData":1.1
    ,
    "tc2": 
      "convergenceData":1.2
    ,
    "tc3": 
      "convergenceData": 1.3
    ,
    "tc4": 
        "convergenceData":1.4
    ,
    "tc5": 
       "convergenceData":1.5
    
  

var data2 = 
  "TestBedGeneralInfo": 
    "TestCaseName": ['tc1','tc2', 'tc3', 'tc4', 'tc5']
  ,

  "TestCaseData": 
    "tc5": 
      "convergenceData":2.5
    ,
    "tc4": 
      "convergenceData":2.4
    ,
    "tc3": 
      "convergenceData": 2.3
    ,
    "tc2": 
        "convergenceData":2.2
    ,
    "tc1": 
       "convergenceData":2.1
    
  

var data3 = 
  "TestBedGeneralInfo": 
    "TestCaseName": ['tc1','tc2', 'tc3', 'tc4', 'tc5']
  ,

  "TestCaseData": 
    "tc4": 
      "convergenceData":3.4
    ,
    "tc5": 
      "convergenceData":3.5
    ,
    "tc1": 
      "convergenceData": 3.1
    ,
    "tc2": 
        "convergenceData":3.2
    ,
    "tc3": 
       "convergenceData":3.3
    
  

这里有一些我尝试过的循环:

var tc_name_list = ['tc1','tc2', 'tc3', 'tc4', 'tc5']
var tc_data = [data1,data2,data3]
for(objNum=0; objNum < tc_data.length; objNum++) 
     var tc_temp_name;
    console.log('objNum is ' + objNum)
    for(i=0; i < tc_name_list.length; i++) 
        tc_temp_name = tc_name_list[i];
        console.log('tc_temp_name is ' + tc_temp_name + '  :->' + tc_data[objNum]['TestCaseData'][tc_temp_name]['convergenceData'])
        var output = tc_data[objNum]
    ;

【问题讨论】:

【参考方案1】:

你可以这样做:

var data = [data1, data2, data3],
    categories = ['tc1', 'tc2', 'tc3', 'tc4', 'tc5'],
    finalData = ,
    series;

categories.forEach(function (cat) 
  if (!finalData[cat]) 
    finalData[cat] = 
      name: cat,
      data: []
    
  

  data.forEach(function(dataElem) 
    finalData[cat].data.push(dataElem.TestCaseData[cat].convergenceData);
  );
);

series = Object.keys(finalData).map(i => finalData[i]);

演示:

https://jsfiddle.net/BlackLabel/3jo2z8kf/

【讨论】:

非常感谢。这非常有帮助。我的一个问题是在我的第一个示例中,类别列表设置为这样categories = ['tc1', 'tc2', 'tc3', 'tc4', 'tc5'],,我认为您使用series = Object.keys(finalData).map(i =&gt; finalData[i]); 来订购它。但是,如果类别不是数字而是像这样categories = ['tc-A', 'tc-B', 'tc-C', 'tc-D', 'tc-E'],,我怎么能让它工作呢@我在这里放了另一个 jsfiddle 来解释我的意思。 jsfiddle.net/mastarke/gwj9stym/3 对不起,我想出了我的问题。它确实适用于categories = ['tc-A', 'tc-B', 'tc-C', 'tc-D', 'tc-E']jsfiddle.net/mastarke/gwj9stym/6

以上是关于通过循环分配的 highcharts 的系列名称和数据的主要内容,如果未能解决你的问题,请参考以下文章

在循环中在 Highcharts 中创建多个系列

HighCharts 禁用图例中的某些系列名称

HighCharts 从图例中隐藏系列名称

如何使用值数组在 Highcharts 饼图图例中获取数据名称而不是“切片”?

通过R中的循环为数据框分配名称

如何构造 HighCharts 数据系列以匹配通过 ajax 调用返回的 Json