【问题标题】:nvd3 - multiBarChart: how to log scale y axisnvd3 - multiBarChart:如何记录刻度 y 轴
【发布时间】:2017-03-20 12:39:51
【问题描述】:

根据multiBarChart doc,应该可以在 multiBarChart 上设置 yScale,因为 yScale 应该是继承方法。

我想将其缩放为对数刻度。我使用lineChart.yScale(d3.scale.log()) 进行了这项工作,但对于multiBarChart,调用multiBarChart.yScale(d3.scale.log()),结果为yScale is not a function

还有其他方法可以记录缩放 multiBarChart 的 y 轴吗?

谢谢

【问题讨论】:

    标签: d3.js nvd3.js


    【解决方案1】:

    我解决了这个方法,它由shouldLogScale var 控制:

    nv.addGraph(() => {
      this.chart = nv.models.multiBarChart()
        ...
        .y(d => {
          const y = parseFloat(d.y);
          return this.shouldLogScale ? Math.log10(y <= 0 ? 1 : y) : y;
        });
    
      if(this.shouldLogScale) {
        this.logScale();
      } else {
        this.chart.yAxis.tickFormat(d3.format(`,.${this.precision}f`));
      }
    
      ...
    });
    

    初始化图表时:我修改y 值,强制y (chart.forceY) 开始和结束值(将它们映射到它们的log10 range),类似地我设置chart.yAxis.tickValues。最后,我将刻度 (chart.yAxis.tickValues) 映射到它们的原始值。只要确保遵守domain的日志功能即可。

    logScale方法:

    private logScale() {
      this.chart.forceY([1, 180]
        .map(v => Math.log10(v)));
      this.chart.yAxis.tickValues([1, 3, 5, 10, 20, 50, 100, 180]
        .map(v => Math.log10(v)));
      this.chart.yAxis.tickFormat(d => Math.pow(10, d).toFixed(this.precision));
    }
    

    也许我可以使用 y 域和范围值的映射来避免在 logScale 方法中使用 log 和 pow 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      相关资源
      最近更新 更多