在数组问题中存储 Highcharts

Posted

技术标签:

【中文标题】在数组问题中存储 Highcharts【英文标题】:Storing Highcharts in array issue 【发布时间】:2020-03-06 20:24:12 【问题描述】:

我在一个循环中动态地绘制了许多 highcharts 并将每个 highchart 推送到一个数组中。因此,在单击外部按钮时,我可以导出图表。但是在将图表推送到数组时,只有最后一个条目是用选项正确设置的。

我参考了一个建议克隆选项的小提琴。 [https://jsfiddle.net/ndb21y1w/][2]

https://www.highcharts.com/forum/viewtopic.php?t=38574

小提琴在所有图表上绘制了相同的系列数据。如果填充的每个图表的数据不同,如何解决这个问题。感谢您提前提供任何帮助。

使问题更加清晰: 数据在循环中动态填充。我的代码逻辑是这样的:

counter i; 
setInterval(function() 
//logic to populated data...
//It is a multiline chart, so three sets of arrays are populated. 
//filling data1[], data2[] and data3[] .
drawChart(data1, data2, data3);
if(condition true) clearInterval();
i++;
);

drawChart(data1, data2, data3) 
var chart = new Highcharts.Chart(
 title: 
            text: "title",
        ,
        xAxis: 
            categories: [1,2,3,4...],
        ,
    series: [
        type: 'line',
        data: data1,
    , 
        type: 'line',
        data: data2,
    , 
        type: 'line',
        data: data3,
    ,
);
chartArray.push(chart);

这个 chartArray 是我提到的正确获取最后一个条目的地方。

【问题讨论】:

最后你想导出数据库列中的数据,或者你想导出为文件(即pdf,csv等)? (你想要什么选项) 似乎是id 的问题。你也可以发布导出图表方法吗? @ShantanuSharma 导出为单个 pdf。 我发现如果我们只使用同一个容器,克隆选项后会出现这个问题。无论如何,所有图表都可以重复使用相同的容器。 【参考方案1】:

要创建图表,您必须传递一个将成为图表容器的 html 元素。在您的代码中缺少什么。查看我准备重现此问题的演示:https://jsfiddle.net/BlackLabel/c60y1t2v/

代码:

var chartArray = [],
  counter = 1,
  dataArr = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ],
  containers = document.getElementById('containers');

function drawChart(data) 
  var cnt = document.createElement('div'),
    cntId = 'container' + counter++,
    chart;

  cnt.setAttribute('id', cntId);
  containers.appendChild(cnt);

  chart = new Highcharts.Chart(cntId, 
    title: 
      text: "title",
    ,
    xAxis: 
      categories: [1, 2, 3, 4],
    ,
    series: [
      type: 'line',
      data: data,
    ]
  );

  return chart;


dataArr.forEach(function(data) 
  var chart = drawChart(data);

  chartArray.push(chart);
);

【讨论】:

这里所有的图表选项都没有包含在代码中,所以我没有提到renderTo容器选项。无论如何,我的要求是每隔 3 秒在同一个容器中显示一些图表。 在同一个容器中创建新图表时,旧图表将被销毁。这可能是问题所在。 是的,当然,所以我想在不同的重叠容器中绘图。你能建议任何其他标准的做事方式吗? 在不同的重叠容器中绘制图表的结果是什么?对于每个图表,您有不同或相同的选项吗?你能在像 jsfiddle 这样的在线代码编辑器中重现你的问题吗?【参考方案2】:

您需要在每次使用新图表时定义选项。每次创建新图表时重新初始化 OriginalOptions。

const options = [...Array(5)].map(() => 
  const originalOptions = 
    series: [
      data: [], // some random data
      type: 'column'
    ]
  
  return Object.assign(originalOptions)
)

Fiddle

更新:

为了动态重新填充图表,您必须初始化一个空图表,然后在填充数据时添加新系列 + 重绘。

您的重绘函数将如下所示:

var i = 0;
var data = [];

var chart = new Highcharts.Chart('container',
    series: []
);

var interval = setInterval(function() 
i++;
data[i] = [i*10 + 1, i*10+2, i*10+3];
drawChart(data[i]);
if(i > 2) clearInterval(interval);

,1000);

function drawChart(data) 
var series = 
type: 'line',
data: data

chart.addSeries(series, false);
chart.redraw();

See Updated Fiddle

【讨论】:

数据在一个区间内动态填充。 您想在填充所有数据时显示图表还是在填充每个数据集时显示图表? 当每组定期填充时。请查看包含的更新代码。 所以在这种情况下,您需要重新绘制图表。查看更新的答案 那么这里存储图表的数组是什么?而且只有一张图表填充【参考方案3】:

要将HTML打印为PDF,您可以使用此软件“wkhtmltopdf

在 Linux 中你需要使用这个命令:

sudo apt-get install wkhtmltopdf

有很多基于“wkhtmltopdf”的多种语言的库,所以你可以使用它。


PHP 库:https://github.com/mikehaertl/phpwkhtmltopdf

【讨论】:

【参考方案4】:

将图表选项存储在 Array 中,然后映射到每个选项的 Initialize Highchart。

var chartArray = [];

function drawChart(data1, data2, data3, i) 
// Create container for charts
const el = document.createElement('div');
document.body.appendChild(el).setAttribute("id", "container"+i);

// Create charts
var chart = new Highcharts.chart(el, 
  series: [
    type: 'line',
    data: data1,
  , 
    type: 'line',
    data: data2,
  , 
    type: 'line',
    data: data3,
  ]
);
chartArray.push(chart);
console.log(chartArray);


var counter = 0;
var delayTime = 2000;
var timer = setInterval(function()
  var data1 = [30, 70, 50];
  var data2 = [40, 70, 60];
  var data3 = [10, 90, 20];
  drawChart(data1, data2, data3, counter);
  if(counter == 2)
    clearInterval(timer);
  
  counter++;
,delayTime);
<script src="https://code.highcharts.com/highcharts.js"></script>

【讨论】:

是否有相同的容器可以重复用于所有图表。比如 Highcharts.chart('my-graph-area',o) 您想在一个容器中放置多个图表吗?有间隔计时。 即使是现在,也是加载到同一个容器中的图表,所以存入数组时,无法正确获取。在不同的容器中绘制重叠每个容器是一种解决方法。您能提出更好的解决方案吗 我在sn-p上面编辑过。图表在不同的容器中绘制并存储到chartArray。检查控制台以获取 chartArray 值。 如果它在这里不起作用。将此JS 代码放入您的fiddle 并检查。

以上是关于在数组问题中存储 Highcharts的主要内容,如果未能解决你的问题,请参考以下文章

3D 数组如何存储在 C 中?

在数据库字段中存储数字数组

在数组问题中存储 Highcharts

将结构存储在数组中(C++)

在数据库中存储字符串数组

c语言问题:c语言中二维数组在内存中怎样存储?