typescript - Cannot set d3 axis to only integers -


i've looked @ couple of answers on here:

  1. how-to-limit-d3-svg-axis-to-integer-labels
  2. d3-tick-marks-on-integers-only

but they're not working me.

i have array of years, example:

years: array<number> = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017]; let minxaxis = math.min(...this.years); let maxxaxis = math.max(...this.years);  this.xscale = d3.scalelinear().range([this.margins.left, this.width - this.margins.right]).domain([minxaxis, maxxaxis]);  this.xaxis = svg.append("g")   .attr("class", "axis axis-x")   .attr("transform", `translate(0, ${this.height - this.margins.bottom})`)   .call(d3.axisbottom(this.xscale)); 

doing gives me following.

pic

then when used .tickformat(d3.format("d")) so:

this.xaxis = svg.append("g")   .attr("class", "axis axis-x")   .attr("transform", `translate(0, ${this.height - this.margins.bottom})`)   // set display ticks digits   .call(d3.axisbottom(this.xscale).tickformat(d3.format("d"))); 

i following

pic 2

as can see, got rid of decimal, still lists duplicates, e.g 2011, 2011, ...

how fix x axis shows: 2010, 2011, 2012, ...?

there no duplicate in axis: values seem same because got rid of decimals.

the problem here simple: using wrong scale task. should use time scale or, if want treat years qualitative (categorical) variables, should use ordinal scale (like d3.scalepoint) instead.

have in mind year not regular number: 2012 year, 2012.2412223? if use linear scale treating years this: pure numbers.

therefore, solution dropping linear scale , using time scale (or ordinal scale).

however, if (for whatever reason) want stick linear scale , treat years numbers (which not), use tickvalues make sure values in years array show in axis:

d3.axisbottom(this.xscale)     .tickvalues(years) 

here demo:

var years = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017];  var svg = d3.select("svg");  var scale = d3.scalelinear()    .domain(d3.extent(years))    .range([20, 480]);  var axis = d3.axisbottom(scale)    .tickvalues(years)    .tickformat(d3.format("d"));  var gx = svg.append("g")    .attr("transform", "translate(0,50)");  axis(gx);
<script src="https://d3js.org/d3.v4.min.js"></script>  <svg width="500" height="100"></svg>


Comments

Popular posts from this blog

android - InAppBilling registering BroadcastReceiver in AndroidManifest -

python Tkinter Capturing keyboard events save as one single string -

sql server - Why does Linq-to-SQL add unnecessary COUNT()? -