我正在绘制图形,其中“点击次数”为Y轴,“日期”为X轴。由于数据量很大,X轴混乱,无法显示所有日期。我试图使用ticks(d3.time.months,1)和tickFormat('%b%Y')来限制一些滴答声。当我运行代码时,我得到“getMonth()没有为我的数据定义。”
.tsv文件:
date count
2013-01-01 4
2013-03-02 5
示例代码:
var x = d3.scale.ordinal()
.rangeRoundBands([0, width], .1, 0);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom")
.ticks(d3.time.months, 1)
.tickFormat(d3.time.format('%b %Y'))
d3.tsv("data_Bar_Chart_Paino_Kristen.tsv", type, function(error, data) {
x.domain(data.map(function(d) { return d.date; }));
y.domain([0, d3.max(data, function(d) { return d.hits; })]);
var temp = height + 30; //+15
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(-8," + temp + ")")
.call(xAxis);
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.date); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.hits); })
.attr("height", function(d) {return height - y(d.hits); });
}
有没有办法解决我的问题并正确显示滴答声?
答案 0 :(得分:5)
你需要告诉D3你的轴是一个日期。试试这个:
//assumes the data is sorted chronologically
var xMin = data[0].dateFieldName;
var xMax = data[data.length-1].dateFieldName;
//set the scale for the x axis
var x = d3.time.scale().domain([xMin, xMax]).range([0, width]);
//straight from your code
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom")
.ticks(d3.time.months, 1)
.tickFormat(d3.time.format('%b %Y'))
这里的诀窍是使用d3.time.scale()方法。
答案 1 :(得分:-1)
如果您使用d3.time.scale()
还有其他问题,则在绘制矩形时无法使用x.rangeBand()
。