d3仅在整数上打勾

Jef*_*rey 22 axis d3.js

我有一个d3条形图,其值范围为0-3.我希望y轴只显示整数值,我可以这样做

var yAxis = d3.svg.axis().scale(y).orient("right").tickFormat(d3.format("d"));
Run Code Online (Sandbox Code Playgroud)

但是,非整数标记处仍有刻度标记.设置刻度格式只会隐藏这些标签.我可以明确设置刻度数或刻度值,但我想做的是只能指定刻度线只出现在整数值.那可能吗?

在此输入图像描述

Boo*_*aka 14

您可以添加.ticks(4)和.tickSubdivide(0),如下所示:

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("right")
    .ticks(4)
.tickFormat(d3.format("d"))
    .tickSubdivide(0);
Run Code Online (Sandbox Code Playgroud)

  • `.tickSubdivide(0)` 应该可以解决问题。您的数据中有非整数值吗?您可能想尝试将 d3.format("d") 或 d3.format("f") 与 .tickSubdivide 一起制作。还要确保清除浏览器缓存。您是正确的 .tickPadding 在这里无关紧要。 (2认同)
  • 这就是诀窍.我改为Math.min(maxHeight + 1,yAxis.ticks()),因此如果图形高度小于刻度数,则会减少刻度数. (2认同)

dir*_*lik 10

妥善解决是检索蜱使用.ticks()方法,过滤他们只保留整数,并将它们传递到.tickValues()

const yAxisTicks = yScale.ticks()
    .filter(tick => Number.isInteger(tick));
const yAxis = d3.axisLeft(yScale)
    .tickValues(yAxisTicks)
    .tickFormat(d3.format('d'));
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这里解释了为什么其他解决方案不好

@BoomShakalaka解决方案使用的.tickSubdivide()方法不再存在。

@cssndrx和@kris解决方案会强制您指定刻度数,因此在一般情况下将不起作用。

  • `.filter(tick => Number.isInteger(tick));` 可以简化为 `.filter(Number.isInteger)` (4认同)

css*_*drx 5

您可以以编程方式设置刻度数data.length - 1(这解决了您对少量刻度的问题)

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("right")
    .tickFormat(d3.format("d"))
    .ticks(data.length - 1)
Run Code Online (Sandbox Code Playgroud)

  • data.length - 1 与 x 轴有关,为什么要在 y 轴上设置刻度时使用它?最好是…… 像 max-value 一样定义 y 轴上的刻度 (2认同)