Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
當(dāng)今數(shù)據(jù)驅(qū)動(dòng)的世界中,數(shù)據(jù)可視化簡化了復(fù)雜信息,賦予個(gè)人做出明智決策的能力。其中一種特別有價(jià)值的圖表類型是資源圖表,它有助于高效的資源分配。本教程將是您創(chuàng)建動(dòng)態(tài)資源圖表的必備指南,使用JavaScript。
資源圖表是一種甘特圖類型,用于可視化有關(guān)資源利用的數(shù)據(jù),例如設(shè)備、員工等。它提供了全面的概述,使得及時(shí)做出明智決策變得更加容易。舉個(gè)例子,在本教程中,我將以球場(chǎng)為單位代表2022年卡塔爾世界杯的賽程,讓您可以追蹤每場(chǎng)比賽的時(shí)間和地點(diǎn)。
準(zhǔn)備好您的編碼工具,通過本指南結(jié)束時(shí),您將能夠創(chuàng)建自己基于JavaScript的資源圖表,并擁有一個(gè)有價(jià)值的工具,用于追蹤您下一個(gè)喜愛的錦標(biāo)賽、服務(wù)器狀態(tài)、員工項(xiàng)目分配,或者其他類似的事物。
您是否對(duì)我們即將創(chuàng)建的內(nèi)容感到興奮?繼續(xù)閱讀,您將學(xué)會(huì)如何創(chuàng)建一個(gè)JavaScript資源圖表,就像下面展示的一樣。
感到好奇嗎?讓我們一起開始這激動(dòng)人心的旅程吧!
資源圖表乍一看可能會(huì)顯得復(fù)雜,因?yàn)樗褂盟綏l來表示時(shí)間段。然而,我向您保證,一旦您掌握了它,就會(huì)發(fā)現(xiàn)它其實(shí)非常簡單。您可以通過以下四個(gè)基本步驟來構(gòu)建這個(gè)圖表:
現(xiàn)在,讓我們?cè)敿?xì)了解每個(gè)步驟。
首先,創(chuàng)建一個(gè)基本的HTML頁面,用于承載您的JavaScript資源圖表。在HTML文檔的主體中,添加一個(gè)HTML塊元素,比如<div>,它將作為您即將創(chuàng)建的圖表的容器。給它一個(gè)ID,在您后面創(chuàng)建圖表時(shí),將在JavaScript代碼中引用它。為了確保圖表使用正確的位置,可以在<style>塊中定義一些CSS規(guī)則。
下面是一個(gè)以這種方式創(chuàng)建的簡單網(wǎng)頁的示例。我將<div>元素命名為“container”,并調(diào)整其高度和寬度,使圖表占據(jù)整個(gè)屏幕。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JavaScript Resource Gantt Chart</title>
<style type="text/css">
html,
body,
#container {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="container"></div>
</body>
</html>
在數(shù)據(jù)可視化方面,JavaScript圖表庫是非常寶貴的工具。關(guān)鍵是找到一個(gè)不僅滿足您的需求,而且支持您尋找的特定圖表類型的庫。
在本教程中,我將使用AnyChart,這是一個(gè)長期存在的JavaScript圖表庫,支持資源圖表,并提供全面的文檔,而且它是免費(fèi)的(除非您將其集成到商業(yè)應(yīng)用程序中)。如果您選擇使用其他庫,整個(gè)過程基本上是一樣的。
您可以通過兩種主要選項(xiàng)來包含所選庫的必要JavaScript文件:下載它們并在本地使用,或者通過CDN(內(nèi)容傳送網(wǎng)絡(luò))直接鏈接到它們。在本教程中,我將選擇CDN的方式。下面是在HTML頁面的<head>部分鏈接所需腳本的示例。
圖表的代碼將位于HTML頁面的<body>部分的<script>標(biāo)簽中?;蛘?,如果更適合您的項(xiàng)目結(jié)構(gòu),也可以將其放在<head>部分。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JavaScript Resource Gantt Chart</title>
<style type="text/css">
html,
body,
#container {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
</style>
<script src="https://cdn.anychart.com/releases/8.11.1/js/anychart-core.min.js"></script>
<script src="https://cdn.anychart.com/releases/8.11.1/js/anychart-gantt.min.js"></script>
<script src="https://cdn.anychart.com/releases/8.11.1/js/anychart-data-adapter.min.js"></script>
</head>
<body>
<div id="container"></div>
<script>
// The place for the following chart’s code.
</script>
</body>
</html>
現(xiàn)在,讓我們加載數(shù)據(jù)。在本教程中,將可視化2022年FIFA世界杯的賽程。數(shù)據(jù)以JSON格式在提供的GitHub gist上可用。
數(shù)據(jù)由一系列對(duì)象組成,每個(gè)對(duì)象代表一個(gè)球場(chǎng)。您將在每個(gè)球場(chǎng)對(duì)象中找到其名稱和城市等詳細(xì)信息。此外,還有一個(gè)名為“periods”的屬性,其中包含在該球場(chǎng)舉辦的比賽列表。每場(chǎng)比賽由兩支參賽國家的名稱和比賽結(jié)果表示。
為了正確地將這種類型的數(shù)據(jù)輸入到資源圖表中,可以使用anychart.data.loadJsonFile()方法。下面是加載數(shù)據(jù)的代碼片段:
anychart.data.loadJsonFile("https://gist.githubusercontent.com/awanshrestha/07b9144e8f2539cd192ef9a38f3ff8f5/raw/b4cfb7c27b48a0e92670a87b8f4b1607ca230a11/Fifa%2520World%2520Cup%25202022%2520Qatar%2520Stadium%2520Schedule.json");
數(shù)據(jù)加載完畢后,您現(xiàn)在可以繼續(xù),看看如何通過幾行JavaScript代碼轉(zhuǎn)化為一個(gè)完全功能的資源圖表。
首先,添加anychart.onDocumentReady()函數(shù),它封裝了確保您的代碼僅在頁面完全加載時(shí)執(zhí)行的所有必要代碼。
<script>
anychart.onDocumentReady(function () {
// The resource chart data and code will be in this section.
});
</script>
接下來,加載數(shù)據(jù)并創(chuàng)建一個(gè)數(shù)據(jù)樹。
anychart.onDocumentReady(function () {
// load the data
anychart.data.loadJsonFile(
"https://gist.githubusercontent.com/awanshrestha/07b9144e8f2539cd192ef9a38f3ff8f5/raw/b4cfb7c27b48a0e92670a87b8f4b1607ca230a11/Fifa%2520World%2520Cup%25202022%2520Qatar%2520Stadium%2520Schedule.json",
function (data) {
// create a data tree
var treeData = anychart.data.tree(data, 'as-table’);
}
);
});
然后,使用ganttResource()方法創(chuàng)建資源甘特圖,并使用data()方法設(shè)置您的數(shù)據(jù)樹。
// create a resource gantt chart
var chart = anychart.ganttResource();
// set the data for the chart
chart.data(treeData);
將圖表放置在第1步中引入的<div>容器中,最后使用draw()方法繪制圖表。
// set the container
chart.container("container");
// draw the chart
chart.draw();
哇!您已成功使用JavaScript創(chuàng)建了一個(gè)簡單而完全功能的資源圖表??纯此趯?shí)際中是如何呈現(xiàn)的;這個(gè)圖表的交互版本可以在這里找到。為了您的方便,還提供了基本資源圖表的完整代碼。
有了這個(gè)資源圖表,您可以輕松地可視化哪些比賽在哪些球場(chǎng)舉行,您可以在右側(cè)的比賽部分滾動(dòng)查看所有比賽。但還有更多內(nèi)容可以探索,所以讓我們繼續(xù)定制這個(gè)交互式數(shù)據(jù)可視化。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JavaScript Resource Gantt Chart</title>
<style type="text/css">
html,
body,
#container {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
</style>
<script src="https://cdn.anychart.com/releases/8.11.1/js/anychart-core.min.js"></script>
<script data-fr-src="https://cdn.anychart.com/releases/8.11.1/js/anychart-gantt.min.js"></script>
<script src="https://cdn.anychart.com/releases/8.11.1/js/anychart-data-adapter.min.js"></script>
</head>
<body>
<div id="container"></div>
<script>
anychart.onDocumentReady(function () {
// load the data
anychart.data.loadJsonFile(
"https://gist.githubusercontent.com/awanshrestha/07b9144e8f2539cd192ef9a38f3ff8f5/raw/b4cfb7c27b48a0e92670a87b8f4b1607ca230a11/Fifa%2520World%2520Cup%25202022%2520Qatar%2520Stadium%2520Schedule.json",
function (data) {
// create a data tree
var treeData = anychart.data.tree(data, "as-table");
// create a resource gantt chart
var chart = anychart.ganttResource();
// set the data for the chart
chart.data(treeData);
// set the container
chart.container("container");
// draw the chart
chart.draw();
}
);
});
</script>
</body>
</html>
現(xiàn)在基本的基于JavaScript的資源圖表已經(jīng)就緒,讓我們探索一些增強(qiáng)其視覺效果和功能的方法。
為了提高資源圖表的視覺吸引力,讓我們深入一些可能的行和列的調(diào)整。
首先,您可以為行的選定和懸停狀態(tài)設(shè)置自定義顏色,并調(diào)整分隔位置以獲得更好的內(nèi)容可見性。此外,考慮指定默認(rèn)行高,以便整潔地呈現(xiàn)和輕松閱讀行項(xiàng)目。
// customize the rows
chart
.rowSelectedFill("#D4DFE8")
.rowHoverFill("#EAEFF3")
.splitterPosition(230);
// set the row height
chart.defaultRowHeight(50);
現(xiàn)在,讓我們繼續(xù)配置列。在第一列中,您可以選擇將一個(gè)簡單的數(shù)字標(biāo)簽“#”作為標(biāo)題,并自定義其寬度。
對(duì)于第二列,您可以將球場(chǎng)名稱設(shè)置為粗體,以突出顯示,并將城市名稱放在球場(chǎng)名稱的正下方。根據(jù)需要調(diào)整列寬,以舒適地容納內(nèi)容。
// customize the column settings:
// get the data grid
var dataGrid = chart.dataGrid();
// set the fixed columns mode
dataGrid.fixedColumns(true);
// first column
dataGrid
.column(0)
.title("#")
.width(30
.labels({ hAlign: "center" });
// second column
dataGrid
.column(1)
.title("Stadium")
.width(200)
.labels()
.useHtml(true)
.format(function () {
return (
"<strong>" + this.name.toString() + "</strong> <br>" + this.item.get("city")
);
});
現(xiàn)在,讓我們通過在時(shí)間軸條上直接顯示比賽結(jié)果來增強(qiáng)資源圖表。這樣可以快速查看比賽結(jié)果,而無需參考其他地方。
為了實(shí)現(xiàn)這一點(diǎn),啟用時(shí)間軸周期上的標(biāo)簽,并使用useHtml()方法應(yīng)用自定義樣式。
// configure the period labels:
// get the period labels
var periodLabels = chart.getTimeline().periods().labels();
// set the period labels
periodLabels
.enabled(true)
.useHtml(true)
.format(
"<span style='color:#fff; font-size: 12px;'>{%result}</span>"
);
在資源條本身的額外信息的基礎(chǔ)上,圖表現(xiàn)在一目了然地提供了更豐富的信息。
為了獲得美觀的用戶體驗(yàn),考慮為圖表的視覺方面增添一些調(diào)味。
首先,將圖表的背景顏色設(shè)置為淺灰色。
chart.background("#edeae8 0.8");
接下來,從時(shí)間軸中作為元素訪問條形,并對(duì)它們的填充和描邊顏色進(jìn)行調(diào)整。
var elements = chart.getTimeline().elements();
elements.normal().fill("#9a1032 0.8");
elements.normal().stroke("#212c68");
再進(jìn)一步,可以使用函數(shù)根據(jù)條件動(dòng)態(tài)填充條形的顏色。例如,比賽結(jié)果可以是這樣的一個(gè)條件。因此,該函數(shù)檢查比賽結(jié)果,如果是平局,則將條形涂成綠色;否則,涂成紅色。這提供了一種有趣的方式,可以通過條形的顏色立即辨別比賽的結(jié)果。
// 自定義條形的顏色:
// 獲取元素
var elements = chart.getTimeline().elements();
// 檢查當(dāng)前項(xiàng)目是否為平局,如果是,則以不同的顏色填充
elements.normal().fill(function() {
var result = this.period.result;
var scores = result.split("-").map(Number);
if (scores[0] === scores[1]) {
return "#11A055 0.8";
} else {
return "#9a1032 0.8";
}
});
elements.normal().stroke("#212c68");
現(xiàn)在,是時(shí)候微調(diào)工具提示,以提供更好的用戶體驗(yàn)。
為了保持工具提示簡潔明了,配置它在懸停在特定條形上時(shí)顯示球隊(duì)名稱和比賽結(jié)果。
// 配置工具提示
var tooltip = chart.getTimeline().tooltip();
tooltip
.useHtml(true)
.format(function(e) {
var tooltipText;
if (typeof e.period === "undefined") {
tooltipText = e.item.la.city;
} else {
var period = e.period;
tooltipText = period.result;
}
return tooltipText;
});
這些微小的調(diào)整顯著提高了呈現(xiàn)數(shù)據(jù)的視覺清晰度?,F(xiàn)在,下面是資源圖表的最終版本。您可以在此處探索這個(gè)最終圖表的交互版本。隨意探索并與之交互。為了方便起見,下面提供了最終資源圖表的完整代碼。
挑戰(zhàn)30天在頭條寫日記#
顏色插件
Chart.js 品牌顏色的默認(rèn)調(diào)色板可作為內(nèi)置的省時(shí)零配置插件使用。
Tree-shaking
通過僅注冊(cè)必要的組件,JavaScript 包的大小可以減少數(shù)十千字節(jié)。
規(guī)模堆疊
布局框可以按組堆疊和加權(quán)。
字幕插件
輔助標(biāo)題插件,具有與主標(biāo)題相同的所有選項(xiàng)。
線段樣式
線段可以根據(jù)任何用戶定義的標(biāo)準(zhǔn)設(shè)置樣式。
3.0新功能高級(jí)動(dòng)畫
每個(gè)元素中每個(gè)屬性的轉(zhuǎn)換都可以單獨(dú)且獨(dú)立地配置。
新功能表現(xiàn)!
引入了許多性能增強(qiáng)功能。此示例具有 1M (2x500k) 點(diǎn),啟用了新的抽取插件。
2.0新功能混合圖表類型
混合搭配條形圖和折線圖,以在數(shù)據(jù)集之間提供清晰的視覺區(qū)分。
2.0新功能新的圖表軸類型
輕松繪制日期時(shí)間、對(duì)數(shù)甚至完全自定義比例的復(fù)雜、稀疏數(shù)據(jù)集。
2.0新功能動(dòng)畫一切!
更改數(shù)據(jù)、更新顏色和添加數(shù)據(jù)集時(shí),開箱即用的令人驚嘆的過渡。
在此示例中,我們?yōu)閱蝹€(gè)數(shù)據(jù)集創(chuàng)建條形圖并將其呈現(xiàn)在 HTML 頁面上。將此代碼片段添加到您的頁面:
<div>
<canvas id="myChart"></canvas>
</div>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
const ctx = document.getElementById('myChart');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
你應(yīng)該得到一個(gè)像這樣的圖表:
讓我們分解一下這段代碼。
首先,我們的頁面中需要有一個(gè)畫布。建議為圖表提供自己的容器以提高響應(yīng)能力。
<div>
<canvas id="myChart"></canvas>
</div>
現(xiàn)在我們有了畫布,我們可以包含來自 CDN 的 Chart.js。
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
最后,我們可以創(chuàng)建一個(gè)圖表。我們添加一個(gè)腳本,該腳本獲取myChart畫布元素并new Chart使用所需的配置進(jìn)行實(shí)例化:bar圖表類型、標(biāo)簽、數(shù)據(jù)點(diǎn)和選項(xiàng)。
<script>
const ctx = document.getElementById('myChart');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
圖表類型和元素、數(shù)據(jù)集、自定義、插件、組件和 tree-shaking。不要猶豫,點(diǎn)擊文本中的鏈接。
我們將從頭開始使用幾個(gè)圖表構(gòu)建 Chart.js 數(shù)據(jù)可視化:
使用 Chart.js 構(gòu)建新應(yīng)用程序
在新文件夾中,創(chuàng)建package.json包含以下內(nèi)容的文件:
{
"name": "chartjs-example",
"version": "1.0.0",
"license": "MIT",
"scripts": {
"dev": "parcel src/index.html",
"build": "parcel build src/index.html"
},
"devDependencies": {
"parcel": "^2.6.2"
},
"dependencies": {
"@cubejs-client/core": "^0.31.0",
"chart.js": "^4.0.0"
}
}
現(xiàn)代前端應(yīng)用程序經(jīng)常使用 JavaScript 模塊捆綁器,因此我們選擇Parcel 作為一個(gè)很好的零配置構(gòu)建工具。我們還安裝了 Chart.js v4 和Cube 的 JavaScript 客戶端,這是一個(gè)用于數(shù)據(jù)應(yīng)用程序的開源 API,我們將使用它來獲取真實(shí)世界的數(shù)據(jù)(稍后會(huì)詳細(xì)介紹)。
運(yùn)行npm install、yarn install、 或pnpm install安裝依賴項(xiàng),然后創(chuàng)建src文件夾。在該文件夾中,我們需要一個(gè)非常簡單的index.html文件:
<!doctype html>
<html lang="en">
<head>
<title>Chart.js example</title>
</head>
<body>
<!-- <div style="width: 500px;"><canvas id="dimensions"></canvas></div><br/> -->
<div style="width: 800px;"><canvas id="acquisitions"></canvas></div>
<!-- <script type="module" src="dimensions.js"></script> -->
<script type="module" src="acquisitions.js"></script>
</body>
</html>
正如您所看到的,Chart.js 需要最少的標(biāo)記:canvas帶有 的標(biāo)記id,我們稍后將通過它引用圖表。默認(rèn)情況下,Chart.js 圖表是響應(yīng)式的,并占據(jù)整個(gè)封閉容器。所以,我們?cè)O(shè)置寬度div來控制圖表的寬度。
最后,讓我們創(chuàng)建src/acquisitions.js包含以下內(nèi)容的文件:
import Chart from 'chart.js/auto'
(async function() {
const data = [
{ year: 2010, count: 10 },
{ year: 2011, count: 20 },
{ year: 2012, count: 15 },
{ year: 2013, count: 25 },
{ year: 2014, count: 22 },
{ year: 2015, count: 30 },
{ year: 2016, count: 28 },
];
new Chart(
document.getElementById('acquisitions'),
{
type: 'bar',
data: {
labels: data.map(row => row.year),
datasets: [
{
label: 'Acquisitions by year',
data: data.map(row => row.count)
}
]
}
}
);
})();
讓我們看一下這段代碼:
是時(shí)候使用npm run dev、yarn dev、 或運(yùn)行示例并在 Web 瀏覽器中pnpm dev導(dǎo)航到localhost:1234 了:
只需幾行代碼,我們就得到了一個(gè)具有很多功能的圖表:圖例、網(wǎng)格線、刻度線和懸停時(shí)顯示的工具提示。刷新網(wǎng)頁幾次即可看到圖表也是動(dòng)畫的。嘗試單擊“按年份獲取”標(biāo)簽,您會(huì)發(fā)現(xiàn)您還可以切換數(shù)據(jù)集可見性(當(dāng)您有多個(gè)數(shù)據(jù)集時(shí)特別有用)。
簡單的定制
讓我們看看如何自定義 Chart.js 圖表。首先,讓我們關(guān)閉動(dòng)畫,以便立即顯示圖表。其次,讓我們隱藏圖例和工具提示,因?yàn)槲覀冎挥幸粋€(gè)數(shù)據(jù)集和相當(dāng)瑣碎的數(shù)據(jù)。
將調(diào)用new Chart(...);替換src/acquisitions.js為以下代碼片段:
new Chart(
document.getElementById('acquisitions'),
{
type: 'bar',
options: {
animation: false,
plugins: {
legend: {
display: false
},
tooltip: {
enabled: false
}
}
},
data: {
labels: data.map(row => row.year),
datasets: [
{
label: 'Acquisitions by year',
data: data.map(row => row.count)
}
]
}
}
);
正如您所看到的,我們已將該options屬性添加到第二個(gè)參數(shù)中,這樣您就可以為 Chart.js 指定各種自定義選項(xiàng)。通過提供的布爾標(biāo)志禁用動(dòng)畫animation。大多數(shù)圖表范圍的選項(xiàng)(例如,響應(yīng)能力或設(shè)備像素比)都是這樣配置的。
圖例和工具提示隱藏在plugins. 請(qǐng)注意,Chart.js 的一些功能被提取到插件中:獨(dú)立的、獨(dú)立的代碼片段。其中一些插件作為Chart.js 發(fā)行版 的一部分提供,其他插件是獨(dú)立維護(hù)的,并且可以位于很棒的 插件、框架集成和其他圖表類型列表中。
您應(yīng)該能夠在瀏覽器中看到更新后的簡約圖表。
真實(shí)世界數(shù)據(jù)
對(duì)于硬編碼、有限大小、不切實(shí)際的數(shù)據(jù),很難展示 Chart.js 的全部潛力。讓我們快速連接到數(shù)據(jù) API,以使我們的示例應(yīng)用程序更接近生產(chǎn)用例。
讓我們創(chuàng)建src/api.js包含以下內(nèi)容的文件:
import { CubejsApi } from '@cubejs-client/core';
const apiUrl = 'https://heavy-lansford.gcp-us-central1.cubecloudapp.dev/cubejs-api/v1';
const cubeToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjEwMDAwMDAwMDAsImV4cCI6NTAwMDAwMDAwMH0.OHZOpOBVKr-sCwn8sbZ5UFsqI3uCs6e4omT7P6WVMFw';
const cubeApi = new CubejsApi(cubeToken, { apiUrl });
export async function getAquisitionsByYear() {
const acquisitionsByYearQuery = {
dimensions: [
'Artworks.yearAcquired',
],
measures: [
'Artworks.count'
],
filters: [ {
member: 'Artworks.yearAcquired',
operator: 'set'
} ],
order: {
'Artworks.yearAcquired': 'asc'
}
};
const resultSet = await cubeApi.load(acquisitionsByYearQuery);
return resultSet.tablePivot().map(row => ({
year: parseInt(row['Artworks.yearAcquired']),
count: parseInt(row['Artworks.count'])
}));
}
export async function getDimensions() {
const dimensionsQuery = {
dimensions: [
'Artworks.widthCm',
'Artworks.heightCm'
],
measures: [
'Artworks.count'
],
filters: [
{
member: 'Artworks.classification',
operator: 'equals',
values: [ 'Painting' ]
},
{
member: 'Artworks.widthCm',
operator: 'set'
},
{
member: 'Artworks.widthCm',
operator: 'lt',
values: [ '500' ]
},
{
member: 'Artworks.heightCm',
operator: 'set'
},
{
member: 'Artworks.heightCm',
operator: 'lt',
values: [ '500' ]
}
]
};
const resultSet = await cubeApi.load(dimensionsQuery);
return resultSet.tablePivot().map(row => ({
width: parseInt(row['Artworks.widthCm']),
height: parseInt(row['Artworks.heightCm']),
count: parseInt(row['Artworks.count'])
}));
}
讓我們看看那里發(fā)生了什么:
現(xiàn)在,讓我們將真實(shí)世界的數(shù)據(jù)傳遞到我們的圖表中。請(qǐng)進(jìn)行一些更改src/acquisitions.js:添加導(dǎo)入并替換data變量的定義。
import { getAquisitionsByYear } from './api'
// ...
const data = await getAquisitionsByYear();
完畢!現(xiàn)在,我們的真實(shí)數(shù)據(jù)圖表如下所示??磥?964年、1968年和2008年發(fā)生了一些有趣的事情!
我們已經(jīng)完成了條形圖。讓我們嘗試另一種 Chart.js 圖表類型。
進(jìn)一步定制
Chart.js 支持許多常見的圖表類型。
例如,氣泡圖允許同時(shí)顯示三個(gè)維度的數(shù)據(jù):x和y軸上的位置代表兩個(gè)維度,第三個(gè)維度由單個(gè)氣泡的大小表示。
要?jiǎng)?chuàng)建圖表,請(qǐng)停止已運(yùn)行的應(yīng)用程序,然后轉(zhuǎn)到src/index.html并取消注釋以下兩行:
<div style="width: 500px;"><canvas id="dimensions"></canvas></div><br/>
<script type="module" src="dimensions.js"></script>
然后,創(chuàng)建src/dimensions.js包含以下內(nèi)容的文件:
import Chart from 'chart.js/auto'
import { getDimensions } from './api'
(async function() {
const data = await getDimensions();
new Chart(
document.getElementById('dimensions'),
{
type: 'bubble',
data: {
labels: data.map(x => x.year),
datasets: [
{
label: 'Dimensions',
data: data.map(row => ({
x: row.width,
y: row.height,
r: row.count
}))
}
]
}
}
);
})();
也許,一切都非常簡單:我們從 API 獲取數(shù)據(jù)并渲染一個(gè)具有該類型的新圖表,將三個(gè)維度的數(shù)據(jù)作為、和(半徑)屬性bubble傳遞。xyr
現(xiàn)在,使用 、 或 重置緩存并再次啟動(dòng)rm -rf .parcel-cache應(yīng)用程序。我們現(xiàn)在可以查看新圖表:npm run devyarn devpnpm dev
嗯,看起來不太漂亮。
首先,圖表不是正方形的。藝術(shù)品的寬度和高度同樣重要,因此我們希望圖表的寬度也等于其高度。默認(rèn)情況下,Chart.js 圖表的縱橫比為 1(對(duì)于所有徑向圖表,例如圓環(huán)圖)或 2(對(duì)于所有其他圖表)。讓我們修改圖表的縱橫比:
// ...
new Chart(
document.getElementById('dimensions'),
{
type: 'bubble',
options: {
aspectRatio: 1,
},
// ...
現(xiàn)在看起來好多了:
然而,這仍然不理想。水平軸的范圍從 0 到 500,垂直軸的范圍從 0 到 450。默認(rèn)情況下,Chart.js 會(huì)自動(dòng)將軸的范圍(最小值和最大值)調(diào)整為數(shù)據(jù)集中提供的值,因此圖表“適合“你的數(shù)據(jù)。顯然,MoMa 收藏中沒有高度在 450 至 500 厘米范圍內(nèi)的藝術(shù)品。讓我們修改圖表的軸配置來解決這個(gè)問題:
// ...
new Chart(
document.getElementById('dimensions'),
{
type: 'bubble',
options: {
aspectRatio: 1,
scales: {
x: {
max: 500
},
y: {
max: 500
}
}
},
// ...
偉大的!看一下更新后的圖表:
然而,還有一個(gè)問題:這些數(shù)字是多少?單位是厘米不是很明顯。讓我們對(duì)兩個(gè)軸應(yīng)用自定義刻度格式以使事情變得清晰。我們將提供一個(gè)回調(diào)函數(shù),調(diào)用該函數(shù)來格式化每個(gè)刻度值。這是更新后的軸配置:
// ...
new Chart(
document.getElementById('dimensions'),
{
type: 'bubble',
options: {
aspectRatio: 1,
scales: {
x: {
max: 500,
ticks: {
callback: value => `${value / 100} m`
}
},
y: {
max: 500,
ticks: {
callback: value => `${value / 100} m`
}
}
}
},
// ...
完美,現(xiàn)在我們?cè)趦蓚€(gè)軸上都有合適的單位:
多個(gè)數(shù)據(jù)集
Chart.js 獨(dú)立繪制每個(gè)數(shù)據(jù)集,并允許對(duì)它們應(yīng)用自定義樣式。
看一下圖表:有一條可見的氣泡“線”,其等號(hào)x和y坐標(biāo)代表方形藝術(shù)品。將這些氣泡放入自己的數(shù)據(jù)集中并以不同的方式繪制它們會(huì)很酷。此外,我們可以將“較高”的藝術(shù)品與“較寬”的藝術(shù)品分開,并以不同的方式繪制它們。
我們可以這樣做。將其替換datasets為以下代碼:
// ...
datasets: [
{
label: 'width = height',
data: data
.filter(row => row.width === row.height)
.map(row => ({
x: row.width,
y: row.height,
r: row.count
}))
},
{
label: 'width > height',
data: data
.filter(row => row.width > row.height)
.map(row => ({
x: row.width,
y: row.height,
r: row.count
}))
},
{
label: 'width < height',
data: data
.filter(row => row.width < row.height)
.map(row => ({
x: row.width,
y: row.height,
r: row.count
}))
}
]
// ..
如您所見,我們定義了三個(gè)具有不同標(biāo)簽的數(shù)據(jù)集。每個(gè)數(shù)據(jù)集都有自己的使用 提取的數(shù)據(jù)片段filter?,F(xiàn)在,它們?cè)谝曈X上是不同的,而且正如您所知,您可以獨(dú)立切換它們的可見性。
這里我們依賴默認(rèn)的調(diào)色板。但是,請(qǐng)記住,每種圖表類型都支持許多數(shù)據(jù)集選項(xiàng),您可以隨意自定義。
插件
另一種非常強(qiáng)大的自定義 Chart.js 圖表的方法是使用插件。您可以在插件目錄 中找到一些或創(chuàng)建您自己的臨時(shí)插件。在 Chart.js 生態(tài)系統(tǒng)中,這是慣用的,并且期望通過插件來微調(diào)圖表。例如,您可以自定義畫布背景或使用簡單的臨時(shí)插件為其添加邊框。讓我們嘗試一下后者。
插件具有廣泛的 API,但簡而言之,插件被定義為name具有擴(kuò)展點(diǎn)中定義的一個(gè)或多個(gè)回調(diào)函數(shù)的對(duì)象。new Chart(...);在調(diào)用之前插入以下代碼片段來代替src/dimensions.js:
// ...
const chartAreaBorder = {
id: 'chartAreaBorder',
beforeDraw(chart, args, options) {
const { ctx, chartArea: { left, top, width, height } } = chart;
ctx.save();
ctx.strokeStyle = options.borderColor;
ctx.lineWidth = options.borderWidth;
ctx.setLineDash(options.borderDash || []);
ctx.lineDashOffset = options.borderDashOffset;
ctx.strokeRect(left, top, width, height);
ctx.restore();
}
};
new Chart(
document.getElementById('dimensions'),
{
type: 'bubble',
plugins: [ chartAreaBorder ],
options: {
plugins: {
chartAreaBorder: {
borderColor: 'red',
borderWidth: 2,
borderDash: [ 5, 5 ],
borderDashOffset: 2,
}
},
aspectRatio: 1,
// ...
正如您所看到的,在這個(gè)chartAreaBorder插件中,我們獲取畫布上下文,保存其當(dāng)前狀態(tài),應(yīng)用樣式,在圖表區(qū)域周圍繪制矩形,然后恢復(fù)畫布狀態(tài)。我們還傳遞了該插件,plugins因此它僅適用于這個(gè)特定的圖表。我們還將插件選項(xiàng)傳遞給options.plugins.chartAreaBorder; 我們當(dāng)然可以在插件源代碼中對(duì)它們進(jìn)行硬編碼,但這種方式可重用性更高。
我們的氣泡圖現(xiàn)在看起來更漂亮了:
搖樹
在生產(chǎn)中,我們努力交付盡可能少的代碼,以便最終用戶可以更快地加載我們的數(shù)據(jù)應(yīng)用程序并獲得更好的體驗(yàn)。為此,我們需要應(yīng)用tree-shaking ,這是一個(gè)奇特的術(shù)語,用于從 JavaScript 包中刪除未使用的代碼。
Chart.js 的組件設(shè)計(jì)完全支持 tree-shaking。您可以一次注冊(cè)所有 Chart.js 組件(這在您進(jìn)行原型設(shè)計(jì)時(shí)很方便)并將它們與您的應(yīng)用程序捆綁在一起。或者,您可以僅注冊(cè)必要的組件并獲得最小的捆綁包,其大小要小得多。
讓我們檢查一下我們的示例應(yīng)用程序。捆綁包尺寸是多少?您可以停止應(yīng)用程序并運(yùn)行npm run build, 或yarn build, 或pnpm build。片刻之后,您將得到如下信息:
% yarn build
yarn run v1.22.17
$ parcel build src/index.html
? Built in 88ms
dist/index.html 381 B 164ms
dist/index.74a47636.js 265.48 KB 1.25s
dist/index.ba0c2e17.js 881 B 63ms
? Done in 0.51s.
我們可以看到 Chart.js 和其他依賴項(xiàng)被捆綁在一個(gè) 265 KB 文件中。
src/acquisitions.js為了減小包的大小,我們需要對(duì)和進(jìn)行一些更改src/dimensions.js。首先,我們需要從兩個(gè)文件中刪除以下導(dǎo)入語句:import Chart from 'chart.js/auto'.
相反,我們只加載必要的組件并使用 Chart.js“注冊(cè)”它們Chart.register(...)。這是我們需要的src/acquisitions.js:
import {
Chart,
Colors,
BarController,
CategoryScale,
LinearScale,
BarElement,
Legend
} from 'chart.js'
Chart.register(
Colors,
BarController,
BarElement,
CategoryScale,
LinearScale,
Legend
);
這是以下代碼片段src/dimensions.js:
import {
Chart,
Colors,
BubbleController,
CategoryScale,
LinearScale,
PointElement,
Legend
} from 'chart.js'
Chart.register(
Colors,
BubbleController,
PointElement,
CategoryScale,
LinearScale,
Legend
);
您可以看到,除了Chart類之外,我們還加載圖表類型、比例和其他圖表元素(例如,條形圖或點(diǎn))的控制器。您可以在文檔中查找所有可用的組件。
或者,您可以按照控制臺(tái)中的 Chart.js 建議進(jìn)行操作。例如,如果您忘記導(dǎo)入BarController條形圖,您將在瀏覽器控制臺(tái)中看到以下消息:
Unhandled Promise Rejection: Error: "bar" is not a registered controller.
chart.js/auto請(qǐng)記住在準(zhǔn)備生產(chǎn)應(yīng)用程序時(shí)仔細(xì)檢查進(jìn)口。只需要一次這樣的導(dǎo)入就可以有效地禁用樹搖動(dòng)。
現(xiàn)在,讓我們?cè)俅螜z查我們的應(yīng)用程序。運(yùn)行yarn build你會(huì)得到這樣的結(jié)果:
% yarn build
yarn run v1.22.17
$ parcel build src/index.html
? Built in 88ms
dist/index.html 381 B 176ms
dist/index.5888047.js 208.66 KB 1.23s
dist/index.dcb2e865.js 932 B 58ms
? Done in 0.51s.
過僅導(dǎo)入和注冊(cè)選定的組件,我們刪除了超過 56 KB 的不必要代碼。鑒于其他依賴項(xiàng)在捆綁包中占用約 50 KB,tree-shaking 有助于從我們的示例應(yīng)用程序的捆綁包中刪除約 25% 的 Chart.js 代碼。
項(xiàng)目地址:https://github.com/chartjs/Chart.js
酷炫的大屏報(bào)表怎么做?#制作酷炫的大屏報(bào)表通常需要使用數(shù)據(jù)可視化工具或庫,這些工具可以幫助你將數(shù)據(jù)轉(zhuǎn)換為交互式的圖表和圖形。以下是一些步驟和建議,幫助你創(chuàng)建引人注目的大屏報(bào)表:
1. **確定目標(biāo)和需求**:
- 明確你想要展示的數(shù)據(jù)類型和目的。
- 確定你的受眾和他們的需求。
2. **選擇合適的工具**:
- 根據(jù)你的技能水平和需求選擇合適的數(shù)據(jù)可視化工具。常見的工具有Tableau、Power BI、Qlik Sense、Data Studio等。
- 如果你有編程背景,可以選擇使用D3.js、ECharts、Highcharts等JavaScript庫。
3. **設(shè)計(jì)布局**:
- 設(shè)計(jì)一個(gè)清晰、邏輯性強(qiáng)的布局,確保信息的層次分明。
- 使用網(wǎng)格系統(tǒng)來對(duì)齊元素,保持頁面整潔。
4. **選擇合適的圖表類型**:
- 根據(jù)你想要展示的數(shù)據(jù)類型選擇合適的圖表。例如,條形圖適合比較類別,折線圖適合展示趨勢(shì),餅圖適合展示比例等。
- 使用混合圖表類型來展示復(fù)雜數(shù)據(jù)。
5. **使用顏色和樣式**:
- 使用對(duì)比色和調(diào)和色來突出重點(diǎn)數(shù)據(jù)。
- 保持顏色的一致性,避免使用過多的顏色。
6. **添加交互性**:
- 使報(bào)表具有交互性,例如通過點(diǎn)擊或懸停來顯示詳細(xì)信息。
- 使用動(dòng)態(tài)元素和動(dòng)畫來吸引用戶的注意力。
7. **優(yōu)化性能**:
- 確保報(bào)表加載速度快,響應(yīng)迅速。
- 對(duì)于大量數(shù)據(jù),使用數(shù)據(jù)聚合和抽樣來減少渲染時(shí)間。
8. **測(cè)試和反饋**:
- 在不同的設(shè)備和瀏覽器上測(cè)試報(bào)表,確保兼容性。
- 獲取用戶反饋,并根據(jù)反饋進(jìn)行調(diào)整。
9. **部署和維護(hù)**:
- 將報(bào)表部署到服務(wù)器或云平臺(tái)上,確保用戶可以訪問。
- 定期更新數(shù)據(jù)和維護(hù)報(bào)表,確保信息的準(zhǔn)確性和時(shí)效性。
記住,一個(gè)好的大屏報(bào)表不僅僅是視覺上的震撼,更重要的是能夠清晰、準(zhǔn)確地傳達(dá)信息。因此,在追求酷炫效果的同時(shí),不要忽視了數(shù)據(jù)的準(zhǔn)確性和易讀性。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。