在 Highcharts 中通过循环添加系列的性能问题
Performance issue adding series through loop in Highcharts
我必须使用 Highcharts 从 api 中获取数据来创建散点图。
api 是使用 Django Rest Framework 在 Python 中编写的,return 从 Pandas Dataframe 开始的数据将被转换为列表并作为 JSON 传递.
我有一个名为 data 的主数据框,它有 3 列,结构如下:
| speed | acc | id |
| 0.09588048242649731 | 0.16578595340251923 | 185.0 |
| 1.8956370379738738 | 1.2269583940505981 | 192.0 |
| 0.12784064323532973 | 0.2449648529291153 | 185.0 |
...
我将这个数据帧分成 N 个小数据帧,按列 ID 对行进行分组,我 return 列表中的 N 个小数据帧。所以 python 中的 api 视图是这个:
@action(detail=True, methods=['get'])
def chart_points(self, request, pk):
instance = MyObject.objects.get(pk=pk)
data = instance.data
data_list = {
"data_list": [v.values.tolist() for k, v in data.groupby('id')]
}
return Response(data_list)
当我调用它时,它给我这样的响应:
{ "data_list": [
[
[
0.09588048242649731,
0.16578595340251923,
185.0
],
[
0.12784064323532973,
0.2449648529291153,
185.0
],
[
0.14382072363974596,
0.14911147952079773,
185.0
],
...
],
[
[
1.8956370379738738,
0.18043938279151917,
192.0
],
[
1.8976345480244257,
1.2269583940505981,
192.0
],
[
1.8986333030497016,
0.2929287254810333,
192.0
],
...
],
...
}
我正在将 Backbonejs 用于应用程序的客户端,并且我有一个调用前一个端点并保存响应数据的模型。
数据的检索速度相对较快(大约需要 10 秒,这与我手动调用 api 时等待的时间相同)。
在此期间,我在页面上创建了空图表并等待 api 响应。
当我检索数据时,我遍历它们并以这种方式将每个系列添加到图表中:
var data_list = this.model.get('data_list');
for( let i = 0; i < data_list.length; i++ ) {
this.chart.addSeries({
type: 'scatter',
name: `Element number ${data_list[i][0][2]}`,
data: data_list[i],
});
}
其中 this.chart
是我要填充所有 N 系列的 Highcharts 图表。
问题是这个最后的过程很慢(它需要越来越多的分钟,而且还冻结了页面)。
我注意到,如果我将 相同 系列添加到图表 N 次(也是具有最大长度的系列),则花费的时间要少得多。例如这样:
var data_list = this.model.get('data_list');
for( let i = 0; i < data_list.length; i++ ) {
this.chart.addSeries({
type: 'scatter',
name: `Element number ${data_list[0][0][2]}`,
data: data_list[0],
});
}
我可以做些什么来提高性能吗?
图表在每次迭代后重新绘制,您可以通过将 addSeries
方法调用中的 redraw
参数设置为 false
并在循环后调用 redraw
来防止这种情况.
for( let i = 0; i < data_list.length; i++ ) {
this.chart.addSeries({
name: ...,
data: ...,
}, false);
}
chart.redraw();
现场演示: http://jsfiddle.net/yqo8hrbn/
API参考:
https://api.highcharts.com/class-reference/Highcharts.Chart#addSeries
https://api.highcharts.com/class-reference/Highcharts.Chart#redraw
我必须使用 Highcharts 从 api 中获取数据来创建散点图。 api 是使用 Django Rest Framework 在 Python 中编写的,return 从 Pandas Dataframe 开始的数据将被转换为列表并作为 JSON 传递.
我有一个名为 data 的主数据框,它有 3 列,结构如下:
| speed | acc | id |
| 0.09588048242649731 | 0.16578595340251923 | 185.0 |
| 1.8956370379738738 | 1.2269583940505981 | 192.0 |
| 0.12784064323532973 | 0.2449648529291153 | 185.0 |
...
我将这个数据帧分成 N 个小数据帧,按列 ID 对行进行分组,我 return 列表中的 N 个小数据帧。所以 python 中的 api 视图是这个:
@action(detail=True, methods=['get'])
def chart_points(self, request, pk):
instance = MyObject.objects.get(pk=pk)
data = instance.data
data_list = {
"data_list": [v.values.tolist() for k, v in data.groupby('id')]
}
return Response(data_list)
当我调用它时,它给我这样的响应:
{ "data_list": [
[
[
0.09588048242649731,
0.16578595340251923,
185.0
],
[
0.12784064323532973,
0.2449648529291153,
185.0
],
[
0.14382072363974596,
0.14911147952079773,
185.0
],
...
],
[
[
1.8956370379738738,
0.18043938279151917,
192.0
],
[
1.8976345480244257,
1.2269583940505981,
192.0
],
[
1.8986333030497016,
0.2929287254810333,
192.0
],
...
],
...
}
我正在将 Backbonejs 用于应用程序的客户端,并且我有一个调用前一个端点并保存响应数据的模型。
数据的检索速度相对较快(大约需要 10 秒,这与我手动调用 api 时等待的时间相同)。
在此期间,我在页面上创建了空图表并等待 api 响应。 当我检索数据时,我遍历它们并以这种方式将每个系列添加到图表中:
var data_list = this.model.get('data_list');
for( let i = 0; i < data_list.length; i++ ) {
this.chart.addSeries({
type: 'scatter',
name: `Element number ${data_list[i][0][2]}`,
data: data_list[i],
});
}
其中 this.chart
是我要填充所有 N 系列的 Highcharts 图表。
问题是这个最后的过程很慢(它需要越来越多的分钟,而且还冻结了页面)。
我注意到,如果我将 相同 系列添加到图表 N 次(也是具有最大长度的系列),则花费的时间要少得多。例如这样:
var data_list = this.model.get('data_list');
for( let i = 0; i < data_list.length; i++ ) {
this.chart.addSeries({
type: 'scatter',
name: `Element number ${data_list[0][0][2]}`,
data: data_list[0],
});
}
我可以做些什么来提高性能吗?
图表在每次迭代后重新绘制,您可以通过将 addSeries
方法调用中的 redraw
参数设置为 false
并在循环后调用 redraw
来防止这种情况.
for( let i = 0; i < data_list.length; i++ ) {
this.chart.addSeries({
name: ...,
data: ...,
}, false);
}
chart.redraw();
现场演示: http://jsfiddle.net/yqo8hrbn/
API参考:
https://api.highcharts.com/class-reference/Highcharts.Chart#addSeries
https://api.highcharts.com/class-reference/Highcharts.Chart#redraw