поток временных рядов, удаление am / pm по оси x и 24-часовой формат - PullRequest
8 голосов
/ 12 апреля 2019

Я пытаюсь построить временной ряд со второй точностью, формат ЧЧ: мм: сс (24 часа / сутки), как указано в момент js docs .

Проблема в том, что формат, который я объявляю, не соблюдается, я пробовал несколько комбинаций из chartsjs docs и ни одна из них не работала.

Vue.component('line-chart', {
  extends: VueChartJs.Line,
  mixins: [VueChartJs.mixins.reactiveProp],
  props: ['chartData', 'timeFormat'],
  data() {
    return {
      options: {
        animation: false,
        scales: {
          xAxes: [{
            type: 'time',
            distribution: 'series',
            time: {
            	format: this.timeFormat
            }
          }],
        },
      }
    }
  },
  mounted () {
    this.renderChart(this.chartData, this.options);
  }
})

var vm = new Vue({
  el: '.app',
  data() {
    return {
      chart: {},
      timeFormat: 'HH:mm:ss',
      timeout: null,
      len_data: 20
    }
  },
  created () {
    this.change_data();
  },
  methods: {
    change_data: function() {
      this.chart = this.fillData();
      this.timeout = setTimeout(this.change_data, 1000);
    },
    fillData () {
      return {
          labels: this.get_labels(),
          datasets: [{
            fill: false, // line
            pointRadius: 2, // line
            borderWidth: 2, // line
            borderColor: "rgba(25, 25, 125, 1)",
            data: this.get_nums(0),
            label: "Points"
          }]
        }
    },
    get_labels()  {
    	return Array.from({length: this.len_data}, (v, k) => this.newDateString(this.len_data-k)); 
    },
    get_nums(data_idx) {
      if(typeof this.chart.datasets !== 'undefined') {
      	this.chart.datasets[data_idx].data.shift(); // removing the first item
        this.chart.datasets[data_idx].data.push(this.getRandomInt()); // adding a new one
       	return this.chart.datasets[data_idx].data;
      }
      return Array.from({length: this.len_data}, (v, k) => this.getRandomInt());
    },
    getRandomInt () {
      return Math.floor(Math.random() * (50 - 5 + 1)) + 5
    },
    newDateString(seconds) {
      return moment().subtract(seconds, 's').format(this.timeFormat);
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.6/vue.min.js"></script>
<script src="https://unpkg.com/vue-chartjs@2.6.5/dist/vue-chartjs.full.min.js"></script>

<div class="app">
  <line-chart :chart-data="chart" :time-format="timeFormat" width="400" height="200"></line-chart>
  <br>{{chart.datasets[0].data}}
</div>

Я думаю, что я почти на месте, держу пари, я просто упускаю небольшую деталь.
JSFIDDLE: https://jsfiddle.net/ue1x8079/

1 Ответ

2 голосов
/ 12 апреля 2019

Документы Chart.js , которые вы связали, чтобы указать эту структуру для форматирования меток временных осей:

time: {
    displayFormats: {
        quarter: 'MMM YYYY'
    }
}

поэтому подключите ваш формат, который станет:

time: {
    displayFormats: {
        second: this.timeFormat
    }
}

Вы были правы, только маленькая деталь! ( обновленный Fiddle ).

...