【问题标题】:Chart.js : How I change the x axes ticks labels alignment in any sizes?Chart.js:如何更改任何尺寸的 x 轴刻度标签对齐方式?
【发布时间】:2020-05-17 06:37:32
【问题描述】:

如何将我的 x 轴上的标签移动到另一个 x 轴标签之间。似乎没有任何效果,我无法在文档中找到任何内容。有解决方法吗?我正在使用折线图时间序列。 https://www.chartjs.org/samples/latest/scales/time/financial.html

目前,我使用代码生成下图:

var cfg = {
            elements:{
                point: {
                    radius: 4
                }
            },
            data: {
                datasets: [
                    {
                        label: 'vsy',
                        backgroundColor: color(window.chartColors.red).alpha(0.5).rgbString(),
                        borderColor: window.chartColors.red,
                        data: firstData,
                        type: 'line',
                        pointRadius: 2,
                        fill: false,
                        lineTension: 0,
                        borderWidth: 2
                    },
                    {
                        label: 'de vsy',
                        backgroundColor: color(window.chartColors.blue).alpha(0.5).rgbString(),
                        borderColor: window.chartColors.blue,
                        data: dataMaker(15),
                        type: 'line',
                        pointRadius: 2,
                        fill: false,
                        lineTension: 0,
                        borderWidth: 2
                    }
                ],

            },
            options: {

                animation: {
                    duration: 0
                },
                scales: {
                    xAxes: [{
                        type: 'time',
                        distribution: 'series',
                        offset: true,

                        time: {
                            unit: 'month',
                            displayFormats: {                                
                                month: 'MMM'
                            }
                        },

                        ticks: {

                            autoSkip: true,
                            autoSkipPadding: 75,

                            sampleSize: 100
                        },

                    }],
                    yAxes: [{
                        gridLines: {
                            drawBorder: false
                        }

                    }]
                },
                tooltips: {
                    intersect: false,
                    mode: 'index',

                }
            }
        };

这就是我现在拥有的:

我希望 x 轴上的标签位于中心而不是 y 轴网格线下方。

感谢uminder,他的评论解决了这个问题,但现在我有一个冲突的工具提示,它位于同一个网格上。当我将鼠标悬停在 4 月线的第一个点时,它会显示 3 月 30 日,它就在它的上方,反之亦然。

我通过将模式更改为nearest 来修复它,但为什么它会激活另一个点?

【问题讨论】:

    标签: javascript charts chart.js chartjs-2.6.0


    【解决方案1】:

    您正在寻找的选项是offsetGridLines

    如果true,网格线将移动到标签之间。

    xAxes: [{
      ... 
      gridLines: {
        offsetGridLines: true
      }
    

    在大多数情况下,这会产生预期的结果。不幸的是,它不适用于Chart.js issue #403 中记录的时间轴。感谢 Antti Hukkanen,有一个 workaround

    请看下面的可运行代码 sn-p 看看它是如何工作的。

    function generateData() {
      var unit = 'day';
      function randomNumber(min, max) {
        return Math.random() * (max - min) + min;
      }
    
      function randomPoint(date, lastClose) {
        var open = randomNumber(lastClose * 0.95, lastClose * 1.05).toFixed(2);
        var close = randomNumber(open * 0.95, open * 1.05).toFixed(2);
        return {
          t: date.valueOf(),
          y: close
        };
      }
        
      var date = moment().subtract(1, 'years');
      var now = moment();
      var data = [];
      for (; data.length < 600 && date.isBefore(now); date = date.clone().add(1, unit).startOf(unit)) {    
        data.push(randomPoint(date, data.length > 0 ? data[data.length - 1].y : 30));
      }
      return data;
    }
    
    var TimeCenterScale = Chart.scaleService.getScaleConstructor('time').extend({
      getPixelForTick: function(index) {
        var ticks = this.getTicks();
        if (index < 0 || index >= ticks.length) {
          return null;
        }
        // Get the pixel value for the current tick.
        var px = this.getPixelForOffset(ticks[index].value);
    
        // Get the next tick's pixel value.
        var nextPx = this.right;
        var nextTick = ticks[index + 1];
        if (nextTick) {
          nextPx = this.getPixelForOffset(nextTick.value);
        }
    
        // Align the labels in the middle of the current and next tick.
        return px + (nextPx - px) / 2;
      },
    });
    // Register the scale type
    var defaults = Chart.scaleService.getScaleDefaults('time');
    Chart.scaleService.registerScaleType('timecenter', TimeCenterScale, defaults);
    
    var cfg = {
      data: {
        datasets: [{
          label: 'CHRT - Chart.js Corporation',
          backgroundColor: 'red',
          borderColor: 'red',
          data: generateData(),
          type: 'line',
          pointRadius: 0,
          fill: false,
          lineTension: 0,
          borderWidth: 2
        }]
      },
      options: {
        animation: {
          duration: 0
        },
        scales: {
          xAxes: [{
            type: 'timecenter',
            time: {
              unit: 'month',
              stepSize: 1,
              displayFormats: {
                month: 'MMM'
              }
            },
            gridLines: {
              offsetGridLines: true
            }
          }],
          yAxes: [{
            gridLines: {
              drawBorder: false
            }
          }]
        },
        tooltips: {
          intersect: false,
          mode: 'index'
        }
      }
    };
    var chart = new Chart('chart1', cfg);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
    <canvas id="chart1" height="90"></canvas>

    【讨论】:

    • 嘿,谢谢大家。我已经更新了我的问题。我遇到了一个问题,我想知道它是否与我们所做的更改有关。
    • @Rey Young:我的回答描述了针对 Chart.js 库中现有错误的解决方法。这种解决方法实际上只解决了标签偏移量,并且新的工具提示问题很可能与它有关。很高兴,使用mode: 'nearest' 解决了这个工具提示问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多