Различное количество меток и данных в Chart.js

Я пытаюсь создать диаграмму, на которой может не быть такого же количества данных и меток.

Например, у меня есть метка для каждого месяца, но, возможно, для марта или августа у меня нет значения.

Я пробовал со следующим кодом:

var options = {
  type: 'bar',
  data: {
    labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'],
    datasets: [{
      label: 'Test',
      backgroundColor: 'red',
      data: [{
        'x': 'Apr',
        'y': 40
      }, {
        'x': 'July',
        'y': 70
      }, {
        'x': 'Dec',
        'y': 120
      }]
    }]
  },
  options: {
    responsive: true,
    legend: {
      position: 'top',
    },
    title: {
      display: true,
      text: 'My Test'
    },
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero: true
        }
      }]
    }
  }
}

var ctx = document.getElementById('canvas').getContext('2d');
new Chart(ctx, options);

Но он отображает значение в неправильном положении, как на изображении.

Различное количество меток и данных в Chart.js

Как я могу это исправить?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
2 951
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если у вас нет значения для какого-либо месяца, укажите 0 в качестве данных для того же самого.

var options = {
            type: 'bar',
            data: {
                labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'],
                datasets:[
                    {
                        label: 'Test',
                        backgroundColor: 'red',
                        data: [0,0,0,40,0,0,70,0,0,0,0,120]
                    }
                ]
            },
            options: {
                responsive: true,
                legend: {
                    position: 'top',
                },
                title: {
                    display: true,
                    text: 'My Test'
                },
                scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero: true
                    }
                }]
            }
            }
        }
var ctx = document.getElementById('canvas').getContext('2d');
new Chart(ctx, options);

Chart.js поддерживает все форматы, которые принимает Moment.js («МММ ГГГГ»). Просто добавление года должно помочь.

Ответ принят как подходящий

But it displays the value in the wrong position as it is in the image

Это потому, что indexes предоставленных вами данных соответствует первым трем значениям ваших меток.

Решение №1:

Чтобы решить эту проблему, вам нужно выровнять длину меток с длиной вашего набора данных, предоставив значения-заполнители для недостающих точек в ваших данных.

Не используйте нули в качестве заполнителя для несуществующих значений в вашем наборе данных, если вы не хотите, чтобы Chartjs отображал данные диаграммы таким образом. [См. Короткие серые области, обозначающие нулевые значения.]

See the short grayed-out areas indicating the zero values.

Поэтому лучший способ справиться с этим - вместо этого предоставить значения null. См. Рабочий пример ниже.

const labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'];
const data = [{'x':'Apr', 'y':40},{'x':'July', 'y':70},{'x':'Dec', 'y':120}];

const filledMonths = data.map((month) => month.x);
const dataset = labels.map(month => {
  const indexOfFilledData = filledMonths.indexOf(month);
	if ( indexOfFilledData!== -1) return data[indexOfFilledData].y;
  return null;
});
console.info(dataset);

Решение №2: В Chartjs> 2.x вы можете использовать time scale

Если у вас много данных и вы не хотите использовать значения-заполнители для отсутствующих данных, тогда вы устанавливаете тип шкалы xAxes как time в параметрах диаграммы.

Вот Ответ, использующий эту реализацию.


Другие вопросы по теме