我正在绘制以“点击次数”为 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); });
}
有没有办法解决我的问题并正确显示刻度?
最佳答案
您需要告诉 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()方法。
关于javascript - 在 D3 中格式化刻度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17737711/