Построить график, используя json данные js
Я хотел бы построить график, чтобы он строился исходя из json данных, чтобы было типо как тут https://prnt.sc/Su7pBSkI4gEf, я имею ввиду, чтобы по оси у курс гривны исходя из валют доллара и евро, а по оси х дата, как менялся этот курс, я не очень понял, как правильно реализовать это, я видел много примеров, но они либо не работают, либо не то, что мне нужно, может я не правильный json поставил и надо этот было поставить https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?json
Поправочка: Я нашел тот JSON файл, который нужен, для отображение того, что я хотел, но он какой-то странный, но поскольку он идет не как ссылка, а как файл, то я к сожалению его к коду прикрепить не могу, поскольку не будет работать, а даже если и вставил бы этот код, он очень большой, и будет не очень, поэтому я лучше прикреплю скриншот, чтобы по нему было понятно https://prnt.sc/5ydo7jQ8RrGC
async function fetchData() {
const url = 'https://bank.gov.ua/NBU_Exchange/exchange?json';
const response = await fetch(url);
const datapoints = await response.json();
console.log(datapoints);
return datapoints;
};
// setup
const data = {
labels: ['Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'],
datasets: [{
label: 'Dollars',
data: [34, 33, 32, 31, 30, 29, 28, 27, 26],
backgroundColor: [
'rgba(255, 26, 104, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)',
'rgba(0, 0, 0, 0.2)'
],
borderColor: [
'rgba(255, 26, 104, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)',
'rgba(0, 0, 0, 1)'
],
borderWidth: 1
},
{
label: "Euro",
data: [1, 2, 3, 4, 5, 6],
fill: false,
borderColor: "#742774",
borderWidth: 1
}
]
};
// config
const config = {
type: 'line',
data,
options: {
scales: {
y: {
beginAtZero: true
}
}
}
};
// render init block
const myChart = new Chart(
document.getElementById('myChart'),
config,
);
* {
margin: 0;
padding: 0;
font-family: sans-serif;
}
.chartMenu p {
padding: 10px;
font-size: 20px;
}
.chartCard {
width: 100vw;
height: calc(100vh - 1px);
background: #B3E5FC;
display: flex;
align-items: center;
justify-content: center;
}
.chartBox {
width: 700px;
padding: 20px;
border-radius: 20px;
border: solid 3px rgba(255, 26, 104, 1);
background: white;
}
<div class="chartCard">
<div class="chartBox">
<canvas id="myChart"></canvas>
<button onclick='fetchData()'>Fetch</button>
</div>
</div>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/chart.js"></script>
Ответы (2 шт):
Этот пример рисует график используя данные удалённого файла в формате json:
async function fetchData() {
const url = 'https://mysynthesizer.github.io/index.hetemeel/json.json';
const response = await fetch(url);
const datapoints = await response.json();
ctx.beginPath();
ctx.moveTo(0, datapoints[0].rate * 3);
for(i = 1; i < datapoints.length; i ++){
ctx.lineTo(i * 30, 200 - datapoints[i].rate * 3);
}
ctx.stroke();
}
fetchData();
let ctx = document.querySelector('canvas').getContext('2d');
<canvas width=270 height=200 style='border-style: solid'><canvas>
Содержимое удалённого файла json.json:
[
{
"date": 17, "rate": 27.12
},{
"date" :18, "rate": 28.55
},{
"date": 19, "rate": 30.72
},{
"date": 20, "rate": 33.43
},{
"date": 21, "rate": 31.12
},{
"date": 22, "rate": 29.22
},{
"date": 23, "rate": 25.12
},{
"date": 24 ,"rate": 23.88
},{
"date": 25, "rate": 24.76
},{
"date": 26, "rate": 24.22
}
]
Дополняю ответ после изменения вопроса. Да, наличие украиноязычных ключей немножко вызвало проблему, но из такого всегда можно выкрутиться. В данном случае ответ сервера нужно получить не в виде json(), а в виде текста. Потом заменить в этом тексте все украинские выражения на английские, в данном случае Дата и Офіційний курс гривні, грн соответственно, скажем, на date и rate. После этого остаётся преобразовать весь текст, который получился, в массив json() и дальше всё по плану.
async function fetchData() {
const url = 'https://[Ваш json(), который на скриншоте]';
const response = await fetch(url);
const text_ua = await response.text();
const text_en = text_ua.replaceAll('Дата', 'date').replaceAll('Офіційний курс гривні, грн', 'rate');
const datapoints = JSON.parse(text_en);
const step = 300 / (datapoints.length - 1);
ctx.beginPath();
ctx.moveTo(0, datapoints[0].rate * 3);
for(i = 1; i < datapoints.length; i ++){
ctx.lineTo(Math.floor(i * step), 200 - datapoints[i].rate * 3);
}
ctx.stroke();
}
fetchData();
let ctx = document.querySelector('canvas').getContext('2d');
<canvas width=300 height=200 style='border-style: solid'><canvas>
В общем, я состыковал Ваш вопрос и мой первый ответ. Используйте JS-код ниже, а HTML и CSS-коды оставьте такими, как были в вопросе.
async function fetchData() {
const url = 'https://mysynthesizer.github.io/index.hetemeel/json3.json';
const response = await fetch(url);
const datapoints = await response.json();
console.log(datapoints);
const dates = [];
const dollars = [];
const euro = [];
for(i = 0; i < datapoints.length; i ++){
dates[i] = datapoints[i].date;
dollars[i] = datapoints[i].usd;
euro[i] = datapoints[i].eur;
}
const data = {
labels: dates,
datasets: [
{
label: 'Dollars',
data: dollars,
backgroundColor: [
'rgba(255, 26, 104, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)',
'rgba(0, 0, 0, 0.2)'
],
borderColor: [
'rgba(255, 26, 104, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)',
'rgba(0, 0, 0, 1)'
],
borderWidth: 1
},
{
label: "Euro",
data: euro,
fill: false,
borderColor: "#742774",
borderWidth: 1
}
]
};
// config
const config = {
type: 'line',
data,
options: {
scales: {
y: {
beginAtZero: true
}
}
}
};
// render init block
const myChart = new Chart(
document.getElementById('myChart'),
config,
);
};
fetchData();
Содержимое файла json3.json:
[
{
"date": 17, "usd": 27.12, "eur": 25.42
},{
"date" :18, "usd": 28.55, "eur": 23.18
},{
"date": 19, "usd": 30.72, "eur": 22.17
},{
"date": 20, "usd": 33.43, "eur": 22.09
},{
"date": 21, "usd": 31.12, "eur": 18.82
},{
"date": 22, "usd": 29.22, "eur": 25.77
},{
"date": 23, "usd": 25.12, "eur": 27.22
},{
"date": 24 ,"usd": 23.88, "eur": 33.45
},{
"date": 25, "usd": 24.76, "eur": 34.24
},{
"date": 26, "usd": 24.22, "eur": 31.01
}
]
Правда, кнопка Fetch теперь не очень нужна, так как график рисуется по ходу загрузки страницы.