d3时间序列,从数据中读取日期,按日期计数条目
d3 timeseries, reading date from data, counting entries by date
我试图在d3中构建一条时间序列线,使用日期作为x轴,使用每个日期的条目数作为y轴。我很难将数据对象的日期部分通过日期格式化程序,然后是小数位数,然后移动到我的行中。
在Codepen中查看http://codepen.io/equivalentideas/pen/HaoIs/
提前感谢您的帮助!
var data = [{"title":"1","date":"20140509"},{"title":"2)","date":"20140401"},{"title":"3","date":"20140415"},{"title":"4","date":"20140416"},{"title":"5","date":"20140416"},{"title":"6","date":"20140422"},{"title":"7","date":"20140422"},{"title":"8","date":"20140423"},{"title":"9","date":"20140423"},{"title":"10","date":"20140423"},{"title":"11","date":"20140502"},{"title":"12","date":"20140502"}
var width = "100%",
height = "8em";
var parseDate = d3.time.format("%Y%m%d").parse;
// X Scale
var x = d3.time.scale()
.range([0, width]);
// Y Scale
var y = d3.scale.linear()
.range([height, 0]);
// define the line
var line = d3.svg.line()
.x(function(d) {
return x(d.date);
})
.y(function(d) {
return y(+d);
})
data.forEach(function(d) {
d.date = parseDate(d.date);
});
x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain(d3.extent(data, function(d) { return d; }));
// build the svg canvas
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
// build the line
svg.append("path")
.datum(data)
.attr("class", "line")
.attr("d", line);
目前我得到一个js控制台错误
Error: Invalid value for <path> attribute d="MNaN,NaNLNaN,NaNLNaN,NaNLNaN,NaNLNaN,NaNLNaN,NaNLNaN,NaNLNaN,NaNLNaN,NaNLNaN,NaNLNaN,NaNLNaN,NaN"
您尚未使用parseDate
。你错过了这个:
data.forEach(function(d) {
d.date = parseDate(d.date);
});
看看这个例子。
一些明显可见的问题:
1( 您没有将svg附加到body
或div
的任何部分。你应该有一条这样的线:
d3.select("body").append("svg").attr("width", width).attr("height", height);
2( 我怀疑d3
能否理解你对width
的定义height
。宽度和高度是图表大小的定义
3( 我认为不需要dateParse
,因为d3
会在内部为您做这件事。
最后,查看Niranjan提供的示例。
这里还有一些其他问题。首先,宽度/高度不是数字,因此yScale和xScale范围无效(这就是为什么在行路径中得到"NaN"的原因(。
这很糟糕:
var width = "100%",
height = "8em";
因为这些将没有有效的数值范围,如以下比例定义所要求的:
// X Scale
var x = d3.time.scale().range([0, width]);
// Y Scale
var y = d3.scale.linear().range([height, 0]);
在数值svg路径坐标中,"8em"到0意味着什么?所以,让它们变成数字:
var width = 500,
height = 100;
修复后,仍然会出现错误,因为y值的映射不起作用。您需要不同日期的计数直方图。您应该以这种方式生成数据,并将其输入到行生成器中。
var generateData = function(data){
var newData = [];
var dateMap = {};
data.forEach(function(element){
var newElement;
if(dateMap[element.date]){
newElement = dateMap[element.date];
} else {
newElement = { date: parseDate(element.date), count: 0 };
dateMap[element.date] = newElement;
newData.push(newElement);
}
newElement.count += 1;
});
newData.sort(function(a,b){
return a.date.getTime() - b.date.getTime();
});
return newData;
};
一旦你解决了这两件事,它就会起作用。这里有一个jsFiddle:http://jsfiddle.net/reblace/j3LzY/
相关文章:
- 从桌面读取python文件时高亮显示代码
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- 比较从函数和生成的日期对象
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 读取本地时区的日期的Javascript
- 完整日历 - 读取键盘箭头键并派生与单击日期单元格相同的行为
- 如何使用PHP将当前日期保存在cookie中,并在javascript中读取它
- 仅从 JSON 对象读取日期或仅读取白天时间
- TypeError:无法读取属性'日期'在Meteor应用程序中使用tsega:bootstrap3日期
- 如何从日期范围选择器中读取值
- 日期选择器无法读取属性'valueOf'
- 在javascript中读取具有不同时区的日期字符串
- 读取appache清单值以获取最新更新日期
- 以更简单的格式从引导日期/时间选择器读取日期值
- 如何控制从电子表格中读取的日期格式,并在电子邮件中显示为表格
- d3时间序列,从数据中读取日期,按日期计数条目
- 用JavaScript读取HTML5日期
- 我如何得到完整的日历读取日期/时间
- 转换和读取JSON日期类型的Javascript