首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在D3中自动调整顺序勾标

如何在D3中自动调整顺序勾标
EN

Stack Overflow用户
提问于 2016-09-28 18:26:53
回答 2查看 1.6K关注 0票数 0

正如您在示例中所看到的,序轴(比例尺)上的滴答标签随着域的增长而变得拥挤和难以辨认。我如何使它们自动调整,就像它们在直线轴上一样?

(我想我可以用线性标度来代替,但是this question和Mike自己的回答表明序数标度更适合这类数据。毕竟,域是离散的,我正在制作一个修改过的条形图,其中一个方便的填充设置非常有用。)

代码语言:javascript
复制
var x0 = d3.scaleBand()
  .domain(d3.range(1,6))
  .range([0,200]);

var x = d3.scaleBand()
  .domain(d3.range(1,51))
  .range([0,200]);

var xLinear = d3.scaleLinear()
  .domain([1,50])
  .range([0,200]);

d3.select('svg').append('g')
  .attr('transform', 'translate(10,10)')
  .call(d3.axisBottom(x0));

d3.select('svg').append('g')
  .attr('transform', 'translate(10,50)')
  .call(d3.axisBottom(x));

d3.select('svg').append('g')
  .attr('transform', 'translate(10,100)')
  .call(d3.axisBottom(xLinear));
代码语言:javascript
复制
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width='300' height='150'></svg>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-28 22:59:25

这个解决方案利用了非常智能的内置函数d3.ticks(),它处理边缘情况,因此我们不必这样做。

代码语言:javascript
复制
var dataSmall = d3.range(1,8),
    dataLarge = d3.range(1, 51);

var xS = d3.scaleBand()
  .domain(dataSmall)
  .rangeRound([0,200]);

var xL = d3.scaleBand()
  .domain(dataLarge)
  .rangeRound([0,200]);

function makeAxis(scale) {
  var n=5, 
      data = scale.domain(),
      dataLength = data.length;
  
  return d3.axisBottom(scale).tickValues( 
    dataLength > n ? d3.ticks(data[0], data[dataLength-1], n) : data);
}

d3.select('svg').append('g')
  .attr('transform', 'translate(10,10)')
  .call(makeAxis(xS));

d3.select('svg').append('g')
  .attr('transform', 'translate(10,50)')
  .call(makeAxis(xL));
代码语言:javascript
复制
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width='300' height='150'></svg>

票数 1
EN

Stack Overflow用户

发布于 2016-09-28 20:23:55

您需要手动过滤蜱,如:http://bl.ocks.org/mbostock/3212294 (这是D3 v3,请参阅下面的v4版本)

代码语言:javascript
复制
var x0 = d3.scaleBand()
  .domain(d3.range(1,6))
  .range([0,200]);

var x = d3.scaleBand()
  .domain(d3.range(1,51))
  .range([0,200]);

var tickValues = x
   .domain()
   .filter(function(d, i) { return !((i + 1) % Math.floor(x.domain().length / 10)); });
           
var xLinear = d3.scaleLinear()
  .domain([1,50])
  .range([0,200]);

d3.select('svg').append('g')
  .attr('transform', 'translate(10,10)')
  .call(d3.axisBottom(x0));

d3.select('svg').append('g')
  .attr('transform', 'translate(10,50)')
  .call(d3.axisBottom(x).tickValues(tickValues));

d3.select('svg').append('g')
  .attr('transform', 'translate(10,100)')
  .call(d3.axisBottom(xLinear));
代码语言:javascript
复制
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width='300' height='150'></svg>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39755037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档