d3仅在整数上打勾

时间:2012-11-27 03:22:42

标签: d3.js axis

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

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

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

enter image description here

5 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

使用此提示将其用于动态图表(页面上的1个或多个图表)

  

这就是诀窍。我改变了   Math.min(maxHeight + 1,yAxis.ticks())所以如果图形高度较小   比滴答数更多,它减少了滴答数。 - 杰夫   Storey 11月28日'12时间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)) 

答案 3 :(得分:1)

正确的解决方案是使用.ticks()方法检索价格变动,对其进行过滤以保留整数,然后将其传递给.tickValues()

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

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

@BoomShakalaka solution使用.tickSubdivide()方法,该方法不再存在。

@cssndrx and @kris solutions会强制您指定刻度数,因此在一般情况下将不起作用。

答案 4 :(得分:0)

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

.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);
    }

});

来自https://jsfiddle.net/PBrockmann/k7qnw3oj/

的jsfiddle

如果有更简单的解决方案,请告诉我。 此致