32

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

var yAxis = d3.svg.axis().scale(y).orient("right").tickFormat(d3.format("d"));

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

在此处输入图像描述

4

5 回答 5

34

正确的解决方案是使用.ticks()方法检索刻度,过滤它们以仅保留整数并将它们传递给.tickValues()

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

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

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

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

于 2019-06-29T22:22:32.690 回答
15

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

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("right")
    .ticks(4)
.tickFormat(d3.format("d"))
    .tickSubdivide(0);
于 2012-11-27T05:19:02.740 回答
5

您可以以编程方式将滴答数设置为data.length - 1(这也解决了您在少量滴答时遇到的问题)

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("right")
    .tickFormat(d3.format("d"))
    .ticks(data.length - 1)
于 2013-08-05T16:26:03.657 回答
2

从所有列出的解决方案中,我无法摆脱刻度线。

.xAxis().ticks(4)
.tickFormat(d3.format("d"));

删除标签,但不删除蜱虫。

所以我建议对 ticks() 应用一个阈值。如果小于 4,则将其设置为限制本身 (0,1,2,3)。完成:

.on("preRedraw", function(chart) {
    var maxTick = chart.group().top(1)[0].value;
    if (maxTick < 4) {
      chart.xAxis().ticks(maxTick);
    } else {
      chart.xAxis().ticks(4);
    }

});

jsfiddle 可从https://jsfiddle.net/PBrockmann/k7qnw3oj/获得

让我知道是否有更简单的解决方案。问候

于 2018-03-02T21:44:02.417 回答
1

使用此 TIP 在动态图表上进行这项工作(页面上的 1 个或多个图表)

那成功了。我改为 Math.min(maxHeight+1,yAxis.ticks()) 所以如果图形高度小于刻度数,它会减少刻度数。– Jeff Storey 2012 年 11 月 28 日在 2:47

  // It is either 10 or Maximum Chart height + 1 

        var graphValues = selection.data()[0].map(function(obj) {
            return obj['count'];
        }).compact();  

        Array.prototype.maxValArray = function() {
          return Math.max.apply(null, this);
        };

        var maxValue = graphValues.maxValArray();

        yAxis.ticks(Math.min(maxValue + 1, 10)) 
于 2015-05-22T07:36:46.000 回答