Задать вопрос
@agroshel

Как построить график, используя библиотеку Chart.js?

Хочу построить график индекса RGBITR, используя библиотеку Chart.js.
Делаю запросы на Мосбиржу, в консоли вижу значения для построения графика. Подставляю их в labels и data, но график не строится.
Подскажите, как правильно сделать?

Сам я насочинял так:
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.4.0/chart.js"></script>
<canvas id="myChart"></canvas>

<script>

var labelsOld, labelsNew, dataOld, dataNew, xhr, xhr1;    

// Создаём Get запрос TRADEDATE
xhr = new XMLHttpRequest();
xhr.open('GET', 'https://iss.moex.com//iss/history/engines/stock/markets/index/securities/RGBITR.json?sort_order=desc&iss.meta=off&iss.only=history&history.columns=TRADEDATE');
xhr.responseType = 'json'; // указать ожидаемый тип ответа
xhr.send(); // посылаем запрос
// Слушать события на xhr, чтобы получить ответ.
xhr.onload = function() {
labelsOld = xhr.response; // labelsOld это объект
labelsNew = labelsOld.history.data, labelsNew.length = 5; // labels это массив
console.log(labelsNew); // вывести в консоль
}; 
// Создаём Get запрос CLOSE
xhr1 = new XMLHttpRequest();
xhr1.open('GET', 'https://iss.moex.com//iss/history/engines/stock/markets/index/securities/RGBITR.json?sort_order=desc&iss.meta=off&iss.only=history&history.columns=CLOSE');
xhr1.responseType = 'json'; // указать ожидаемый тип ответа
xhr1.send();
// Слушать события на xhr, чтобы получить ответ.
xhr1.onload = function() {
dataOld = xhr1.response;
dataNew = dataOld.history.data,  dataNew.length = 5; // labels это массив
console.log(dataNew); // вывести в консоль
}; 
// график
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'line',
data: { 
    labels: labelsNew, //  название данных по оси Х
    datasets: [{
        label: 'RGBITR', //  Характеристика данных.
        data: dataNew,// Данные по оси У ( массив чисел, который должен иметь такое же количество значений, как и количество столбиков
        backgroundColor:  'rgba(255, 99, 132, 0.2)', // Цвет фона 
        borderColor:  'rgba(255, 99, 132, 1)', // Цвет границ
   }]  
},
});
</script>
</html>
  • Вопрос задан
  • 284 просмотра
Подписаться 1 Простой 6 комментариев
Решения вопроса 1
0xD34F
@0xD34F
Предлагаю погуглить, что такое асинхронность.

Сейчас у вас так: запросили данные, построили график, получили данные.

А надо так: запросили данные, получили данные, построили график.

const baseURL = 'https://iss.moex.com//iss/history/engines/stock/markets/index/securities/RGBITR.json';

const params = new URLSearchParams([
  [ 'sort_order', 'desc' ],
  [ 'iss.meta', 'off' ],
  [ 'iss.only', 'history' ],
  [ 'history.columns', 'TRADEDATE,CLOSE' ],
]);

fetch(`${baseURL}?${params}`)
  .then(r => r.json())
  .then(r => {
    new Chart(document.querySelector('#chart'), {
      type: 'line',
      data: { 
        labels: r.history.data.map(n => n[0]),
        datasets: [ {
          label: 'hello, world!!',
          data: r.history.data.map(n => n[1]),
        } ],
      },
    });
  });

https://jsfiddle.net/1vp2a8x0/

Или, можно дополнить вашу схему ещё одним пунктом - обновление графика.
fetch(`${baseURL}?${params}`)
  .then(r => r.json())
  .then(({ history: { data } }) => {
    chart.data.labels = data.map(n => n[0]);
    chart.data.datasets[0].data = data.map(n => n[1]);
    chart.update();
  });

const chart = new Chart(document.querySelector('#chart'), {
  type: 'line',
  data: { 
    labels: [],
    datasets: [ {
      label: 'hello, world!!',
      data: [],
    } ],
  },
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы