gpt4 book ai didi

javascript - 将数据与数据哈希分离

转载 作者:搜寻专家 更新时间:2023-11-01 04:37:09 24 4
gpt4 key购买 nike

我正在绘制 Dimple/D3 图表,将缺失天数的数据绘制为 0。

date                fruit   count
2013-12-08 12:12 apples 2
2013-12-08 12:12 oranges 5
2013-12-09 16:37 apples 1
<- oranges inserted on 12/09 as 0
2013-12-10 11:05 apples 6
2013-12-10 11:05 oranges 2
2013-12-10 20:21 oranges 1

我能够得到 nrabinowitz 的 excellent answer to work , 差不多。

我的数据的时间戳格式是YYYY-MM-DD HH-MM,hashing + D3.extent time interval in days 导致每天午夜0分,即使有数据当天晚些时候出现。

我找到的一个几乎解决方案是 use .setHours(0,0,0,0) to discard the hours/minutes ,这样所有数据看起来都是从午夜开始的:

...
var dateHash = data.reduce(function(agg, d) {
agg[d.date.setHours(0,0,0,0)] = true;
return agg;
}, {});
...

当每天只有 1 个条目时,这会按预期工作,但在有多个条目的日子里,值会加在一起。因此,在 12 月 10 日的上述数据中:苹果:6 个,橙子:3 个。

理想情况下(在我看来)我会将绘图数据与 datehash 分开,并在 hash 上丢弃小时/分钟。这会将午夜日期哈希与 D3 天间隔进行比较,在缺少数据的日子的午夜填写 0,然后绘制完整的小时/分钟的真实点。

我已经尝试了 data2 = data.slice() 然后是 setHours,但是图表仍然得到午夜点:

...
// doesn't work, original data gets converted
var data2 = data.slice();
var dateHash = data2.reduce(function(agg, d) {
agg[d.date.setHours(0,0,0,0)] = true;
return agg;
}, {});
...

对 nrabinowitz 的支持,这里是改编后的代码:

// get the min/max dates
var extent = d3.extent(data, function(d) { return d.date; }),
// hash the existing days for easy lookup
dateHash = data.reduce(function(agg, d) {
agg[d.date] = true;

// arrr this almost works except if multiple entries per day
// agg[d.date.setHours(0,0,0,0)] = true;

return agg;
}, {}),
headers = ["date", "fruit", "count"];

// make even intervals
d3.time.days(extent[0], extent[1])
// drop the existing ones
.filter(function(date) {
return !dateHash[date];
})
// fruit list grabbed from user input
.forEach(function(date) {
fruitlist.forEach(function(fruits) {
var emptyRow = { date: date };
headers.forEach(function(header) {
if(header === headers[0]) {
emptyRow[header] = fruits;}
else if(header === headers[1]) {
emptyRow[header] = 0;};
// and push them into the array
data.push(emptyRow);
});
// re-sort the data
data.sort(function(a, b) { return d3.ascending(a.date, b.date); });

(我不关心小时尺度中的 0 点,只关心样片。如果 time.interval 从几天更改为几小时,我怀疑哈希和 D3 会处理得很好。)

如何将 datehash 从数据中分离出来?这是我应该尝试做的吗?

最佳答案

我想不出一个顺利的方法来做到这一点,但我已经编写了一些适用于您的示例的自定义代码,并且有望适用于您的真实案例。

var svg = dimple.newSvg("#chartContainer", 600, 400),
data = [
{ date : '2013-12-08 12:12', fruit : 'apples', count : 2 },
{ date : '2013-12-08 12:12', fruit : 'oranges', count : 5 },
{ date : '2013-12-09 16:37', fruit : 'apples', count : 1 },
{ date : '2013-12-10 11:05', fruit : 'apples', count : 6 },
{ date : '2013-12-10 11:05', fruit : 'oranges', count : 2 },
{ date : '2013-12-10 20:21', fruit : 'oranges', count : 1 }
],
lastDate = {},
filledData = [],
dayLength = 86400000,
formatter = d3.time.format("%Y-%m-%d %H:%M");

// The logic below requires the data to be ordered by date
data.sort(function(a, b) {
return formatter.parse(a.date) - formatter.parse(b.date);
});

// Iterate the data to find and fill gaps
data.forEach(function (d) {

// Work from midday (this could easily be changed to midnight)
var noon = formatter.parse(d.date).setHours(12, 0, 0, 0);

// If the series value is not in the dictionary add it
if (lastDate[d.fruit] === undefined) {
lastDate[d.fruit] = formatter.parse(data[0].date).setHours(12, 0, 0, 0);
}

// Calculate the days since the last occurance of the series value and fill
// with a line for each missing day
for (var i = 1; i <= (noon - lastDate[d.fruit]) / dayLength - 1; i++) {
filledData.push({
date : formatter(new Date(lastDate[d.fruit] + (i * dayLength))),
fruit : d.fruit,
count : 0 });
}

// update the dictionary of last dates
lastDate[d.fruit] = noon;

// push to a new data array
filledData.push(d);

}, this);

// Configure a dimple line chart to display the data
var chart = new dimple.chart(svg, filledData),
x = chart.addTimeAxis("x", "date", "%Y-%m-%d %H:%M", "%Y-%m-%d"),
y = chart.addMeasureAxis("y", "count"),
s = chart.addSeries("fruit", dimple.plot.line);
s.lineMarkers = true;
chart.draw();

你可以在这里看到这个工作在一个 fiddle 中:

http://jsfiddle.net/LsvLJ/

关于javascript - 将数据与数据哈希分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20854624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com