D3月度柱状图x轴仅在每年1月位置显示年份标签的实现方法
解决方案
核心修改说明
- 修正日期解析格式:你的源数据日期为
月/日/年格式(如1/1/2017),原代码使用的%Y-%m-%d解析规则不匹配,会导致日期解析异常,需先修正 - 自定义x轴刻度格式化逻辑:判断日期对应的月份,仅1月返回年份标签,其余月份返回空字符串实现隐藏
修改后完整代码
// 修正日期解析格式,匹配源数据的月/日/年结构 var parseDate = d3.time.format("%-m/%-d/%Y").parse; //coerce data to dates data.forEach(function (d) { d.letter = parseDate(d.letter); console.log(d.letter) }); //set margins var margin = {top: 40, right: 20, bottom: 30, left: 40}, width = 1000 - margin.left - margin.right, height = 200 - margin.top - margin.bottom; var formatPercent = d3.format(".0%"); var x = d3.scale.ordinal() .rangeRoundBands([0, width], .1); var y = d3.scale.linear() .range([height, 0]); var xAxis = d3.svg.axis() .scale(x) .orient("bottom") // 自定义刻度格式化:仅1月显示年份 .tickFormat(function(date) { // JS中月份从0开始计数,0对应1月 if (date.getMonth() === 0) { return d3.time.format("%Y")(date); } return ""; }); var yAxis = d3.svg.axis() .scale(y) .orient("left") var svg = div.append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); r2d3.onRender(function(data, s, w, h, options) { x.domain(data.map(function(d) { return d.letter; })); y.domain([0, d3.max(data, function(d) { return d.frequency; })]); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis) // 仅保留年份标签时无需旋转,可注释掉原来的旋转配置 // .selectAll("text") // .attr("transform", "rotate(270)") // .attr('dx', '-1.9em'); svg.append("g") .attr("class", "y axis") .call(yAxis) .append("text") .attr("transform", "rotate(-90)") .attr("y", 6) .attr("dy", ".71em") .style("text-anchor", "end") .text("Frequency"); svg.selectAll(".bar") .data(data) .enter().append("rect") .attr("class", "bar") .attr("x", function(d) { return x(d.letter); }) .attr("width", x.rangeBand()) .attr("y", function(d) { return y(d.frequency); }) .attr("height", function(d) { return height - y(d.frequency); }) .on('mouseover', tip.show) .on('mouseout', tip.hide) }); function type(d) { d.frequency = +d.frequency; console.log(d); return d; }
可选调整
如果需要保留标签旋转样式,取消x轴标签的旋转代码注释即可,也可根据展示需求调整标签的偏移量。
内容的提问来源于stack exchange,提问作者DiamondJoe12
相关产品推荐
相关产品推荐

