在 D3js 中格式化 x 轴的标签

SNT*_*SNT 3 label bar-chart d3.js

我正在尝试使用 d3js 创建一些条形图。我使用相同的 js 作为模板并传递不同的数据来显示图表。如果它们少于 10 个数据点,则 x 轴标签看起来不错。但是,如果它们的数据点超过 10 个,则 x 轴标签会重叠和聚集。所以我试图找出一种方法,我可以跳过每 4 个滴答声。下面是代码。当大于 9 个数据点时,它根本不显示任何刻度。

` var ticks = d3.selectAll(".tick text");

               function tickLabels(dataLength, d) {
                   if (dataLength < 9) return "";
                   return  ticks.attr("class", function(d,i){
                       if(i%3 != 0) d3.select(this).remove();
                   })
                 }

              var xAxis = d3.axisBottom().scale(x)
                                .ticks()
                                .tickFormat(function(d,i) {  return tickLabels(all.length, d) })

             `
Run Code Online (Sandbox Code Playgroud)

Ger*_*ado 8

有两种方法可以做你想做的事。第一个是使用tickFormat.

所以,假设你有这个拥挤的轴:

var svg = d3.select("svg");
var data = d3.range(30).map(function(d) {
  return "tick" + d
});
var scale = d3.scalePoint()
  .domain(data)
  .range([20, 480]);
var axis = d3.axisBottom(scale);
var gX = svg.append("g")
  .attr("transform", "translate(0,50)")
  .call(axis);
Run Code Online (Sandbox Code Playgroud)
path, line {
  shape-rendering: crispEdges;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width="500" height="100"></svg>
Run Code Online (Sandbox Code Playgroud)

您可以使用tickFormat仅显示每 4 个刻度中的一个:

var svg = d3.select("svg");
var data = d3.range(30).map(function(d) {
  return "tick" + d
});
var scale = d3.scalePoint()
  .domain(data)
  .range([20, 480]);
var axis = d3.axisBottom(scale)
  .tickFormat(function(d, i) {
    return i % 3 === 0 ? d : null;
  });
var gX = svg.append("g")
  .attr("transform", "translate(0,50)")
  .call(axis);
Run Code Online (Sandbox Code Playgroud)
path, line {
  shape-rendering: crispEdges;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width="500" height="100"></svg>
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案仅删除文本,留下勾号。如果您还想删除勾号,您可以创建一个新选择并使用each

var svg = d3.select("svg");
var data = d3.range(30).map(function(d) {
  return "tick" + d
});
var scale = d3.scalePoint()
  .domain(data)
  .range([20, 480]);
var axis = d3.axisBottom(scale);
var gX = svg.append("g")
  .attr("transform", "translate(0,50)")
  .call(axis);
d3.selectAll(".tick").each(function(d, i) {
  if (i % 3 != 0) {
    d3.select(this).remove()
  }
})
Run Code Online (Sandbox Code Playgroud)
path,
line {
  shape-rendering: crispEdges;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width="500" height="100"></svg>
Run Code Online (Sandbox Code Playgroud)