ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ๋ฅผ ํ๊ตฌํฉ์๋ค.
Chart.js ์ฐจํธ ๊ตฌํํ๊ธฐ, ์ฆ๊ฐ๋ฅ ๊ณ์ฐ ํจ์ ๊ตฌํํ๊ธฐ
JavaScript์ Chart.js๋ฅผ ํ์ฉํ์ฌ ์นํ์ด์ง์ ์ฐจํธ๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
๊ตฌํ ํ๋ฉด
์ ๋ ์ด๋ฒ ํ๋ก์ ํธ์์ ์ฌ์ฉ์๊ฐ ์ฐ๋๋ฅผ ์ ๋ ฅํ๋ฉด ์ฆ๊ฐ๋ฅ ์ ๊ณ์ฐํด ์ถ๋ ฅํ๊ณ ,
์ฐจํธ์ ํด๋น ์ฐ๋ ๊ทธ๋ํ์ ์์ด ๋ณํ๋ ํจ๊ณผ๋ฅผ ์ ์ฉํ๊ณ ์ถ์์ต๋๋ค.
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด powerprice.html์์ ์ฌ์ฉ์๊ฐ ์ํ๋ year๋ฅผ ์ ๋ ฅ ๋ฐ๊ณ ,
powerprice.js์์ ํจ์๋ฅผ ์ด์ฉํด ๊ฐ์ ๊ณ์ฐํ ํ updateChart(year)๋ฅผ ์์ฒญํ๊ณ ,
pChart.js์์ year๊ฐ์ ๋ฐ์ ์ฐจํธ์ ์์ ์ ๋ฐ์ดํธํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค.
๊ฐ์ด ๋์ฌ ๋ ๊ทธ๋ํ๊ฐ ์๋๋ก ๋ด๋ ค๊ฐ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋๋ฐ, css์์ min-height๋ฅผ 3rem ์ค์ ํ์ฌ ๊ณต๊ฐ์ ๋ฐฐ์ ํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
์์ฑ ์ฝ๋
์ฒ์ ์์ฑํ์ ๋, ๋ชจ๋ ์ฐจํธ.js์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํด์ ์ถ๋ ฅํ์ต๋๋ค.
๊ทธ๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒฐ๊ณผ ์ค๋ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ๋ฐ๋ณตํ์ฌ ์ ๋ ฅํ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค.
๊ทธ๋์ ๋ฐ์ดํฐ.js ํ์ผ์ ๋ฐ๋ก ๋ง๋ ํ export const๋ฅผ ์ฌ์ฉํด์ ๋ด๋ณด๋ด๊ธฐํ๊ณ ,
import๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ์ค๋ณต ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
powerprice.html
์ฐจํธ๊ฐ ๋ํ๋๋ ์ฝ๋
<body>
<div style="
width: 60vw;
height: 60vh;
display: flex;
justify-content: center;
align-items: center;
margin-top: 3rem;
">
<!--์ฐจํธ๊ฐ ๊ทธ๋ ค์ง ๋ถ๋ถ-->
<canvas id="priceChart"></canvas>
</div>
</body>
์ฌ์ฉ์๊ฐ ์ฐ๋๋ฅผ ์ ๋ ฅํ๊ณ ์ ๋ ฅ ๋ฒํผ์ ํด๋ฆญํ๋ ์ฝ๋
์ซ์๋ง ์ ๋ ฅ ๊ฐ๋ฅํ๋๋ก ์ง์ ํ๋ ๋ฐฉ๋ฒ
์ฒ์์๋ input type์ text๋ก ์ง์ ํ์ต๋๋ค.
๊ทธ๋ฌ๋๋ ์ฌ์ฉ์๊ฐ ํ๊ธ์ด๋ ์์ด ํ ์คํธ ๋ํ ์ ๋ ฅํ ์ ์์์ต๋๋ค.
์ ๊ท์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ผ๋, ์ ๋ input type์ number๋ก ๋ฐ๊พธ๋ ๋ฐฉ์์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ, ์ซ์ ์ธ์๋ ๋ฌธ์๊ฐ ์์ฑ๋์ง ์์ต๋๋ค.
<body>
<div id="powerprice-container">
<div id="input-container">
<input type="number" id="powerprice-yearInput" min="0" placeholder="1955๋
~2070๋
์ฌ์ด์ ์ฐ๋๋ง ์
๋ ฅํ์ค ์ ์์ต๋๋ค." />
<select class="year-dropdown" id="year-dropdown" onchange="updateYearInput()">
<script>
for (let i = 1955; i <= 2070; i++) {
document.write('<option value="' + i + '">' + i + '</option>');
}
</script>
</select>
<button onclick="getPowerPrice()">ํ์ธ</button>
</div>
<p id="powerprice-result"></p> <!-- ์ฌ๊ธฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํฉ๋๋ค. -->
</div>
</body>
powerPriceData.js
1955~2022๋ ์ ๋ฐ์ดํฐ๋ ์ค์ ๋ฐ์ดํฐ์ ๋๋ค.
2023~2070๋ ์ ๋ฐ์ดํฐ๋ Python์ scikit-learn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ
์ ํํ๊ท(Linear Regression) ๋ฐฉ์์ผ๋ก ์์ธกํ ํ ์์นํํ์์ต๋๋ค.
export const๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋์ต๋๋ค.
(์ค์ ๋ก๋ 1955~2070๋ ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋์ด ์์ต๋๋ค.)
export const powerPriceData = {
1955: 3,
1956: 3,
};
powerprice.js
import๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ต๋๋ค.
2022๋ ์ ๋ฐ์ดํฐ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ฐ๋์ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ์ฌ ์ ๊ธฐ ๋จ๊ฐ ์ฆ๊ฐ๋ฅ ์ ๊ณ์ฐํ๋ ํจ์์ ๋๋ค.
์ฌ์ฉ์๊ฐ ์ ๋ ฅ ๋ฒํผ, Enter ํค ์ด๋ค ๊ฒ์ ๋๋ฅด๋๋ผ๋ ๊ฐ์ด ๋์ค๋๋ก ์ค์ ํ์ต๋๋ค.
import { powerPriceData } from './powerPriceData.js';
window.updateYearInput = function () {
var yearInput = document.getElementById("powerprice-yearInput");
var yearDropdown = document.getElementById("year-dropdown");
// ์ ํํ ์ฐ๋๋ฅผ ์
๋ ฅ ์ฐฝ์ ์ค์
yearInput.value = yearDropdown.value;
}
window.onload = function () {
document.getElementById("powerprice-yearInput")
.addEventListener("keydown", window.handleKeyPress);
};
window.handleKeyPress = function (event) {
// ์ํฐ ํค๋ฅผ ๋๋ ์ ๋
if (event.key === "Enter") {
getPowerPrice();
}
}
window.toggleYearDropdown = function () {
var yearDropdown = document.getElementById("year-dropdown");
// ํ ๊ธ ๋ก์ง๋ง ์ํ
yearDropdown.style.display =
yearDropdown.style.display === "none" ? "block" : "none";
}
window.getPowerPrice = function () {
let year = document.getElementById("powerprice-yearInput").value;
// ๋น ์นธ ์ฒดํฌ
if (year.trim() === "") {
document.getElementById("powerprice-result").innerText = "์ฐ๋๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.";
return;
}
let price = powerPriceData[year];
if (price === undefined) {
document.getElementById("powerprice-result").innerText =
year + "๋
์ ๋ฐ์ดํฐ๋ ์์ง ์ค๋น๋์ง ์์์ต๋๋ค.";
} else {
let baseYear = 2022;
let basePrice = powerPriceData[baseYear];
let increaseRate = (((price - basePrice) / basePrice) * 100).toFixed(2);
if (year >= 1955 && year <= 2022) {
let priceComparison =
increaseRate > 0 ? "๋์ ๊ฐ๊ฒฉ์
๋๋ค." : "๋ฎ์ ๊ฐ๊ฒฉ์
๋๋ค.";
document.getElementById("powerprice-result").innerText =
year +
"๋
์ ์ ๊ธฐ ๋จ๊ฐ๋ " +
price +
" kWh/๋ช
์ผ๋ก, " +
baseYear +
"๋
๋๋น " +
Math.abs(increaseRate) +
"% " +
priceComparison;
} else {
document.getElementById("powerprice-result").innerText =
year +
"๋
์ ์์ ์ ๊ธฐ ๋จ๊ฐ๋ " +
price +
" kWh/๋ช
์ผ๋ก, " +
baseYear +
"๋
๋๋น " +
increaseRate +
"% ์์นํฉ๋๋ค.";
}
updateChart(year);
}
}
pChart.js
import๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ต๋๋ค.
window.updateChart๋ถํฐ๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ year๊ฐ์ ๊ฐ์ ธ์ค๋ ์ฝ๋์ ๋๋ค.
// pChart.js
import { powerPriceData } from './powerPriceData.js';
const priceChartData = {
labels: Object.keys(powerPriceData),
datasets: [
{
label: "์ ๋ ฅ ๋จ๊ฐ (kWh/์)",
data: Object.values(powerPriceData),
backgroundColor: Object.keys(powerPriceData).map(() => "rgba(0, 0, 0, 0.07)"), // ๊ธฐ๋ณธ ์์์ผ๋ก ๋ฐฐ์ด ์ฑ์ฐ๊ธฐ
borderColor: "rgba(206, 41, 91, 0.624)", // ๋ง๋ ํ
๋๋ฆฌ ์์ ์ค์
borderWidth: 1,
},
],
};
const config = {
type: "bar",
data: priceChartData, // 'powerPriceData'๋ฅผ 'priceChartData'๋ก ๋ณ๊ฒฝ
options: {
responsive: true,
scales: {
x: {
type: "linear",
position: "bottom",
},
y: {
beginAtZero: true,
},
},
plugins: {
legend: {
display: true,
position: "top",
},
title: {
display: true,
text: "์ ๋ ฅ ๊ฐ๊ฒฉ ๊ทธ๋ํ",
},
},
},
};
// Canvas ์์ ๊ฐ์ ธ์ค๊ธฐ
const ctx = document.getElementById("priceChart").getContext("2d");
// Chart ์์ฑ
const priceChart = new Chart(ctx, config);
window.updateChart = function (year) {
let color;
if (year < 2022) {
color = "red";
} else if (year < 2040) {
color = "blue";
} else {
color = "green";
}
let price = powerPriceData[year];
if (price === undefined) {
alert(year + "๋
๋์ ๋ฐ์ดํฐ๋ ์์ง ์ค๋น๋์ง ์์์ต๋๋ค.");
} else {
// ํ์ฌ ์ฐ๋๊ฐ labels ๋ฐฐ์ด์ ์๋ ์์น๋ฅผ ์ฐพ์ต๋๋ค.
let index = priceChart.data.labels.indexOf(year.toString());
if (index === -1) {
// ์ฐ๋๊ฐ ์์ง labels ๋ฐฐ์ด์ ์๋ค๋ฉด, ์ฐ๋์ ๋ฐ์ดํฐ, ์์์ ์ถ๊ฐํฉ๋๋ค.
priceChart.data.labels.push(year.toString());
priceChart.data.datasets[0].data.push(price);
priceChart.data.datasets[0].backgroundColor.push(color);
} else {
// ์ฐ๋๊ฐ ์ด๋ฏธ labels ๋ฐฐ์ด์ ์๋ค๋ฉด, ํด๋น ์์น์ ๋ฐ์ดํฐ์ ์์๋ง ๋ณ๊ฒฝํฉ๋๋ค.
priceChart.data.datasets[0].data[index] = price;
priceChart.data.datasets[0].backgroundColor[index] = color;
}
priceChart.update();
}
}
๊ตฌํ ํ๋ฉด์ ๋ ์์ธํ ํ์ธํ๊ณ ์ถ๋ค๋ฉด ์๋ ์ฌ์ดํธ ์ฐธ๊ณ ๋ฐ๋๋๋ค.
https://ityrannosaurus.github.io/power/