如何删除 D3 轴刻度中的逗号并删除最后一个刻度?

Posted

技术标签:

【中文标题】如何删除 D3 轴刻度中的逗号并删除最后一个刻度?【英文标题】:How to remove the comma in D3 axis ticks and remove the last tick? 【发布时间】:2017-02-15 22:39:44 【问题描述】:

我正在使用 D3 创建条形图。

如何使用 tickFormat() 从每个刻度线中删除 1982 年的 ','?

我的数据范围从 1982 年到 2016 年,但由于 d3.scale 的域是专有的,我必须包括 2017 年才能将轴绘制到图表的末尾。如何删除最后一个刻度?

var yearArray = d3.range(1982,2016)
var xScale = d3.scale.linear().domain([1982,2017]).range([0,width-100])
var xAxis = d3.svg.axis().orient('bottom').scale(xScale).ticks(34)

谢谢!

【问题讨论】:

【参考方案1】:

我相信这个类似的问题和答案可能会有所帮助:D3 remove comma delimiters for thousands

对于您的代码:

var xAxis = d3.svg.axis().orient('bottom').scale(xScale).ticks(34).tickFormat(d3.format("d"));

【讨论】:

请注意,这个答案确实有效,但它具有删除小数精度的意外副作用。【参考方案2】:

由于 d3.scale 的域是专有的,我必须包括 2017 才能将轴绘制到图表的末尾。

嗯,这是不正确的。如果您将域设置为:

[1982, 2016]

域中的第一个值是 1982,最后一个是 2016,就这么简单。

您在这里面临的问题是轴生成器。在 D3 中,刻度是动态生成的,有时很难得到你想要的刻度。

例如,检查这个sn-p,其中域是[1992, 2016]

var svg = d3.select("svg");

var xScale = d3.scale.linear().domain([1992,2016]).range([10,490])
var xAxis = d3.svg.axis().orient('bottom').scale(xScale);
var gX = svg.append("g").attr("transform","translate(0,50)").call(xAxis);
path, line 
  fill: none;
  stroke: black;
  shape-rendering: crispEdges;


text
  font-size:8px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg  ></svg>

如您所见,2016 年已经到来,没问题。但现在相同的代码,从 1982 年而不是 1992 年开始:

var svg = d3.select("svg");

var xScale = d3.scale.linear().domain([1982,2016]).range([10,490])
var xAxis = d3.svg.axis().orient('bottom').scale(xScale);
var gX = svg.append("g").attr("transform","translate(0,50)").call(xAxis);
path, line 
  fill: none;
  stroke: black;
  shape-rendering: crispEdges;


text
  font-size:8px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg  ></svg>

2016 已经不存在了(甚至 1982 都不存在了)。

解决方案:有一些不同的方法可以强制轴显示一些刻度,例如在刻度中使用nice()。但即使nice() 也不能保证每次都能正常工作。

保证域中的第一个和最后一个值将显示在轴中的一种方法是使用tickValues 并传递与比例域连接的值数组,如下所示:

tickValues(xScale.ticks(20).concat(xScale.domain()))

这种方法的问题在于,根据ticks() 中的刻度数,结束刻度的间距不均匀。

检查sn-p:

var svg = d3.select("svg");

var xScale = d3.scale.linear().domain([1982,2016]).range([10,490])
var xAxis = d3.svg.axis().orient('bottom').scale(xScale).tickValues(xScale.ticks(20).concat(xScale.domain()));
var gX = svg.append("g").attr("transform","translate(0,50)").call(xAxis);
path, line 
  fill: none;
  stroke: black;
  shape-rendering: crispEdges;


text
  font-size:8px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg  ></svg>

关于逗号,other answer 已经涵盖了您。

【讨论】:

以上是关于如何删除 D3 轴刻度中的逗号并删除最后一个刻度?的主要内容,如果未能解决你的问题,请参考以下文章

Highcharts 图表删除类别(x 轴)上间隔中的现有刻度

如何从 plotly 中删除图中的轴刻度线?

从 D3.js 轴中删除结束标记

如何解决d3.js中x轴上的重叠刻度文本

在 D3.js 中创建带有序数刻度的文本标记 x 轴

如何使用 Plotly 删除堆叠和分组条形图中的 x 轴刻度标签