我正在使用数据数组(计数)绘制直方图,并使用数组来表示直方图。我想放大数据,以便直方图中的点数通常少于我拥有的数据点。
我需要将数据数组映射到直方图数组,这样当直方图正好是数据长度的一半时,每个点就是两个数据点的总和,当它是1.5倍时,每个直方图点就是总和一个数据点加上下一个数值的一半。等
E.g
Data |2|3|1|2|2|3|4|1|
Hist | 5 | 3 | 5 | 5 |
Data | 2| 3| 1| 2| 2| 3| 4| 1|
Hist | 3.5|2.5| 3 | 4 | 4.5 |
这似乎是一个常见的问题(特别是对于缩放图像),但我还没有找到一个库或函数来完成它。 JavaScript之类的东西是否存在?
答案 0 :(得分:1)
这似乎是一个非常简单的算法:
function get_hist(data, factor) {
var hist = new Array();
for(i=0; i<data.length; i+=factor) {
el = get_hist_elem(data, i, factor);
if(!isNaN(el))
hist.push(el);
}
alert(hist.join(", "));
return hist;
}
function get_hist_elem(data, start_pos, factor) {
var int_start = (Math.floor(start_pos) == start_pos ? start_pos : Math.floor(start_pos) + 1);
if(int_start > data.length)
return NaN;
var part_start = int_start - start_pos;
var end_pos = start_pos + factor;
var int_end = (Math.floor(end_pos) == end_pos ? end_pos : Math.floor(end_pos));
var part_end = end_pos - int_end;
var val = 0;
for(j=int_start; j<int_end; j++)
val += data[j];
if(part_start > 0)
val += data[int_start - 1] * part_start;
if(part_end > 0)
val += data[int_end] * part_end;
return val;
}
并称之为:
var data = [2, 3, 1, 2, 2, 3, 4, 1];
var factor = 1.5;
var hist = get_hist(data, factor);
我创建了一个jsfiddle供你玩:http://jsfiddle.net/3RVKr/