折线图:对齐多个数据集的x轴(时间戳)
Line chart: align x axis (timestamps) for multiple data sets
我的头撞上了这堵砖墙。我有一个随时间跟踪三个数据点的数据集。这些数据点可以相互独立地改变。我试图在折线图中展示这些变化的历史,但我还没有找到如何为三者制作一个公共的x轴。
数据返回如下:
{
"Default": {
"Values": [
999,
799,
999
],
"Timestamps": [
"2015-03-01T03:31:16+00:00",
"2015-03-01T07:21:43+00:00",
"2015-03-01T14:02:22+00:00"
]
},
"Current": {
"Values": [
399,
849
],
"Timestamps": [
"2015-03-01T01:15:22+00:00",
"2015-03-01T21:30:43+00:00"
]
},
"CurrentPremium": {
"Values": [
500,
345,
200,
500
],
"Timestamps": [
"2015-02-01T14:24:00+00:00",
"2015-03-01T00:13:28+00:00",
"2015-03-01T09:56:43+00:00",
"2015-03-01T12:00:04+00:00"
]
}
}
返回的值指示此值何时从以前的值更改。
我正在使用chartjs中的折线图来可视化数据。为此,我需要提供一个与行的数据点匹配的通用标签列表,所以我需要以某种方式对齐这三个数据集,但我不知道如何实现这一点。
我会使用像lodash这样的库(使实用程序更快)将数据预处理到所有时间戳的平面列表中,然后对于每个数据集,如果该数据集没有来自所有时间戳合并平面列表的时间戳,则会为每个数据集生成一个记录为null的匹配值列表。
我还在我的chart js分支中添加了一个选项,它在这里很有用,可以将稀疏数据填充到仍然连接的行中,这样就不会留下难以看到的浮点。
var datasets = {
"Default": {
"Values": [
999,
799,
999
],
"Timestamps": [
"2015-03-01T03:31:16+00:00",
"2015-03-01T07:21:43+00:00",
"2015-03-01T14:02:22+00:00"
]
},
"Current": {
"Values": [
399,
849
],
"Timestamps": [
"2015-03-01T01:15:22+00:00",
"2015-03-01T21:30:43+00:00"
]
},
"CurrentPremium": {
"Values": [
500,
345,
200,
500
],
"Timestamps": [
"2015-02-01T14:24:00+00:00",
"2015-03-01T00:13:28+00:00",
"2015-03-01T09:56:43+00:00",
"2015-03-01T12:00:04+00:00"
]
}
};
//merge and sort all timestamps in to one array (used lodash here just to make things easy
var timestamps = _.chain(datasets).pluck("Timestamps").reduce(function(previous, current, index) {
return previous.concat(current)
}).unique().sortBy(function(timestamp) {
return new Date(timestamp)
}).value();
//set up base chart data with colours
var chartDatasets = [{
fillColor: "rgba(220,120,120,0.2)",
strokeColor: "rgba(220,120,120,1)",
pointColor: "rgba(120,120,120,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
}, {
fillColor: "rgba(20,120,120,0.2)",
strokeColor: "rgba(20,120,120,1)",
pointColor: "rgba(20,120,120,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
}, {
fillColor: "rgba(120,120,120,0.2)",
strokeColor: "rgba(120,120,120,1)",
pointColor: "rgba(120,120,120,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
}]
//go through each dataset from server,
//for each dataset go through it's time stamps,
//go through the merged timestamps and if the timestamp is prresent in the dataset record the value other wise record null so we
//end up with a flat list of data that matches the flat time stamps
var datasetsIndex = 0;
_.forEach(datasets, function(dataset, key) {
var data = [];
_.forEach(timestamps, function(timestamp) {
var dataToPush = null;
_.forEach(dataset.Timestamps, function(datasetTimestamp, datasetTimestampIndex) {
if (datasetTimestamp === timestamp) {
dataToPush = dataset.Values[datasetTimestampIndex];
}
});
data.push(dataToPush);
});
chartDatasets[datasetsIndex].label = key;
chartDatasets[datasetsIndex].data = data;
datasetsIndex++;
});
var chartData = {
labels: timestamps,
datasets: chartDatasets
};
var chart = new Chart(document.getElementById("chart").getContext("2d")).Line(chartData, {
populateSparseData: true
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.3.1/lodash.js"></script>
<script src="http://quincewebdesign.com/cdn/Chart.js"></script>
<canvas id="chart" width="400" height="400"></canvas>
相关文章:
- React中的数据集表示
- 使用相同的数据集绘制各种符号
- 多维数据集网格未在指定的分区中绘制
- chart.js 2.0为数据集添加了新属性
- 如何每10.6秒从时间戳增加+1
- 时间序列数据的线性回归
- 使用AngularJS从时间戳中获取工作日
- Kendo网格中数据集的最高值
- 具有大型数据集的组件仅在 IE11/Edge 上运行缓慢
- 折线图:对齐多个数据集的x轴(时间戳)
- 将多个csv文件中的时间戳数据添加到highchart中
- 生成时间戳日期|Javascript范围内的空数据
- 如何将人类可读的数据转换为时间戳(使用JS)
- 基于时间戳组织JSON数据.帮助会很好
- 从数据表中的日期字段中删除时间戳
- 如何使用Angular过滤器按时间戳对数据进行分组
- 在具有大型数据集的HighStock时间序列中设置附加点属性
- 为fooTable获取正确的数据值(ticks或unix时间戳)
- 格式化日期时间mysql数据类型的时间戳
- 如何在javascript中对数据时间戳进行排序