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 成在线人免费视频一区二区三区,国内精品一级毛片免费看,97在线国产视频

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Chart.js:適用于現代 Web 的簡單而靈活的 JavaScript 圖表庫

          挑戰30天在頭條寫日記#

          功能:

          顏色插件

          Chart.js 品牌顏色的默認調色板可作為內置的省時零配置插件使用。

          Tree-shaking

          通過僅注冊必要的組件,JavaScript 包的大小可以減少數十千字節。

          規模堆疊

          布局框可以按組堆疊和加權。

          字幕插件

          輔助標題插件,具有與主標題相同的所有選項。

          線段樣式

          線段可以根據任何用戶定義的標準設置樣式。

          3.0新功能高級動畫

          每個元素中每個屬性的轉換都可以單獨且獨立地配置。

          新功能表現!

          引入了許多性能增強功能。此示例具有 1M (2x500k) 點,啟用了新的抽取插件。

          2.0新功能混合圖表類型

          混合搭配條形圖和折線圖,以在數據集之間提供清晰的視覺區分。

          2.0新功能新的圖表軸類型

          輕松繪制日期時間、對數甚至完全自定義比例的復雜、稀疏數據集。

          2.0新功能動畫一切!

          更改數據、更新顏色和添加數據集時,開箱即用的令人驚嘆的過渡。

          使用Demo-創建圖表

          在此示例中,我們為單個數據集創建條形圖并將其呈現在 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>
          


          你應該得到一個像這樣的圖表:

          讓我們分解一下這段代碼。

          首先,我們的頁面中需要有一個畫布。建議為圖表提供自己的容器以提高響應能力。

          <div>
            <canvas id="myChart"></canvas>
          </div>

          現在我們有了畫布,我們可以包含來自 CDN 的 Chart.js。

          <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

          最后,我們可以創建一個圖表。我們添加一個腳本,該腳本獲取myChart畫布元素并new Chart使用所需的配置進行實例化:bar圖表類型、標簽、數據點和選項。

          <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>

          Chart.js 的所有主要概念:

          圖表類型和元素、數據集、自定義、插件、組件和 tree-shaking。不要猶豫,點擊文本中的鏈接。

          我們將從頭開始使用幾個圖表構建 Chart.js 數據可視化:

          使用 Chart.js 構建新應用程序

          在新文件夾中,創建package.json包含以下內容的文件:

          {
            "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"
            }
          }
          

          現代前端應用程序經常使用 JavaScript 模塊捆綁器,因此我們選擇Parcel 作為一個很好的零配置構建工具。我們還安裝了 Chart.js v4 和Cube 的 JavaScript 客戶端,這是一個用于數據應用程序的開源 API,我們將使用它來獲取真實世界的數據(稍后會詳細介紹)。

          運行npm installyarn install、 或pnpm install安裝依賴項,然后創建src文件夾。在該文件夾中,我們需要一個非常簡單的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 需要最少的標記:canvas帶有 的標記id,我們稍后將通過它引用圖表。默認情況下,Chart.js 圖表是響應式的,并占據整個封閉容器。所以,我們設置寬度div來控制圖表的寬度。

          最后,讓我們創建src/acquisitions.js包含以下內容的文件:

          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)
                    }
                  ]
                }
              }
            );
          })();
          

          讓我們看一下這段代碼:

          • 我們Chart從特殊路徑導入 Chart.js 主類chart.js/auto。它加載所有可用的 Chart.js 組件(這非常方便),但不允許進行樹搖動。我們稍后會解決這個問題。
          • 我們實例化一個新Chart實例并提供兩個參數:將呈現圖表的畫布元素和選項對象。
          • 我們只需要提供一個圖表類型 ( bar) 并提供data它由labels(通常是數據點的數字或文本描述)和一個數組datasets(Chart.js 支持大多數圖表類型的多個數據集)組成。每個數據集都用 a 指定,label并包含一個數據點數組。
          • 目前,我們只有一些虛擬數據條目。因此,我們提取yearcount屬性來生成labels唯一數據集中的 和 數據點數組。

          是時候使用npm run devyarn dev、 或運行示例并在 Web 瀏覽器中pnpm dev導航到localhost:1234 了:

          只需幾行代碼,我們就得到了一個具有很多功能的圖表:圖例、網格線、刻度線和懸停時顯示的工具提示。刷新網頁幾次即可看到圖表也是動畫的。嘗試單擊“按年份獲取”標簽,您會發現您還可以切換數據集可見性(當您有多個數據集時特別有用)。

          簡單的定制

          讓我們看看如何自定義 Chart.js 圖表。首先,讓我們關閉動畫,以便立即顯示圖表。其次,讓我們隱藏圖例和工具提示,因為我們只有一個數據集和相當瑣碎的數據。

          將調用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屬性添加到第二個參數中,這樣您就可以為 Chart.js 指定各種自定義選項。通過提供的布爾標志禁用動畫animation。大多數圖表范圍的選項(例如,響應能力或設備像素比)都是這樣配置的。

          圖例和工具提示隱藏在plugins. 請注意,Chart.js 的一些功能被提取到插件中:獨立的、獨立的代碼片段。其中一些插件作為Chart.js 發行版 的一部分提供,其他插件是獨立維護的,并且可以位于很棒的 插件、框架集成和其他圖表類型列表中。

          您應該能夠在瀏覽器中看到更新后的簡約圖表。

          真實世界數據

          對于硬編碼、有限大小、不切實際的數據,很難展示 Chart.js 的全部潛力。讓我們快速連接到數據 API,以使我們的示例應用程序更接近生產用例。

          讓我們創建src/api.js包含以下內容的文件:

          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'])
            }));
          }

          讓我們看看那里發生了什么:

          • 我們為Cubeimport (數據應用程序的開源 API)提供 JavaScript 客戶端庫,使用 API URL ( ) 和身份驗證令牌 ( ) 配置它,最后實例化客戶端 ( )。 apiUrlcubeTokencubeApi
          • Cube API 托管在Cube Cloud 中,并連接到一個數據庫,該數據庫包含 約 140,000 條記錄的公共數據集 ,代表美國紐約現代藝術博物館 收藏的所有藝術品。當然,這是一個比我們現在擁有的更真實的數據集。
          • 我們定義了幾個異步函數來從 API 獲取數據:getAquisitionsByYeargetDimensions。第一個返回按購買年份計算的藝術品數量,另一個返回每個寬度-高度對的藝術品數量(我們將在另一個圖表中需要它)。
          • 我們來看一下getAquisitionsByYear。首先,我們在變量中創建一個基于 JSON 的聲明性查詢acquisitionsByYearQuery。正如您所看到的,我們指定了每件yearAcquired我們想要獲得count的藝術品;yearAcquired必須設置(即不是未定義);結果集將按yearAcquired升序排序。
          • 其次,我們resultSet通過調用獲取并將其映射到具有所需屬性cubeApi.load的對象數組。yearcount

          現在,讓我們將真實世界的數據傳遞到我們的圖表中。請進行一些更改src/acquisitions.js:添加導入并替換data變量的定義。

          import { getAquisitionsByYear } from './api'
          
          // ...
          
          const data = await getAquisitionsByYear();

          完畢!現在,我們的真實數據圖表如下所示。看來1964年、1968年和2008年發生了一些有趣的事情!

          我們已經完成了條形圖。讓我們嘗試另一種 Chart.js 圖表類型。

          進一步定制

          Chart.js 支持許多常見的圖表類型。

          例如,氣泡圖允許同時顯示三個維度的數據:xy軸上的位置代表兩個維度,第三個維度由單個氣泡的大小表示。

          要創建圖表,請停止已運行的應用程序,然后轉到src/index.html并取消注釋以下兩行:

          <div style="width: 500px;"><canvas id="dimensions"></canvas></div><br/>
          
          <script type="module" src="dimensions.js"></script>
          

          然后,創建src/dimensions.js包含以下內容的文件:

          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 獲取數據并渲染一個具有該類型的新圖表,將三個維度的數據作為、和(半徑)屬性bubble傳遞。xyr

          現在,使用 、 或 重置緩存并再次啟動rm -rf .parcel-cache應用程序。我們現在可以查看新圖表:npm run devyarn devpnpm dev

          嗯,看起來不太漂亮。

          首先,圖表不是正方形的。藝術品的寬度和高度同樣重要,因此我們希望圖表的寬度也等于其高度。默認情況下,Chart.js 圖表的縱橫比為 1(對于所有徑向圖表,例如圓環圖)或 2(對于所有其他圖表)。讓我們修改圖表的縱橫比:

          // ...
          
          	new Chart(
              document.getElementById('dimensions'),
              {
                type: 'bubble',
                options: {
                  aspectRatio: 1,
                },
          
          // ...
          

          現在看起來好多了:

          然而,這仍然不理想。水平軸的范圍從 0 到 500,垂直軸的范圍從 0 到 450。默認情況下,Chart.js 會自動將軸的范圍(最小值和最大值)調整為數據集中提供的值,因此圖表“適合“你的數據。顯然,MoMa 收藏中沒有高度在 450 至 500 厘米范圍內的藝術品。讓我們修改圖表的軸配置來解決這個問題:

          // ...
          
            new Chart(
              document.getElementById('dimensions'),
              {
                type: 'bubble',
                options: {
                  aspectRatio: 1,
                  scales: {
                    x: {
                      max: 500
                    },
                    y: {
                      max: 500
                    }
                  }
                },
          
          // ...
          

          偉大的!看一下更新后的圖表:

          然而,還有一個問題:這些數字是多少?單位是厘米不是很明顯。讓我們對兩個軸應用自定義刻度格式以使事情變得清晰。我們將提供一個回調函數,調用該函數來格式化每個刻度值。這是更新后的軸配置:

          // ...
          
            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`
                      }
                    }
                  }
                },
          
          // ...
          

          完美,現在我們在兩個軸上都有合適的單位:

          多個數據集

          Chart.js 獨立繪制每個數據集,并允許對它們應用自定義樣式。

          看一下圖表:有一條可見的氣泡“線”,其等號xy坐標代表方形藝術品。將這些氣泡放入自己的數據集中并以不同的方式繪制它們會很酷。此外,我們可以將“較高”的藝術品與“較寬”的藝術品分開,并以不同的方式繪制它們。

          我們可以這樣做。將其替換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
                        }))
                    }
                  ]
          
          // ..
          

          如您所見,我們定義了三個具有不同標簽的數據集。每個數據集都有自己的使用 提取的數據片段filter。現在,它們在視覺上是不同的,而且正如您所知,您可以獨立切換它們的可見性。

          這里我們依賴默認的調色板。但是,請記住,每種圖表類型都支持許多數據集選項,您可以隨意自定義。

          插件

          另一種非常強大的自定義 Chart.js 圖表的方法是使用插件。您可以在插件目錄 中找到一些或創建您自己的臨時插件。在 Chart.js 生態系統中,這是慣用的,并且期望通過插件來微調圖表。例如,您可以自定義畫布背景或使用簡單的臨時插件為其添加邊框。讓我們嘗試一下后者。

          插件具有廣泛的 API,但簡而言之,插件被定義為name具有擴展點中定義的一個或多個回調函數的對象。new Chart(...);在調用之前插入以下代碼片段來代替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,
          
          // ...
          

          正如您所看到的,在這個chartAreaBorder插件中,我們獲取畫布上下文,保存其當前狀態,應用樣式,在圖表區域周圍繪制矩形,然后恢復畫布狀態。我們還傳遞了該插件,plugins因此它僅適用于這個特定的圖表。我們還將插件選項傳遞給options.plugins.chartAreaBorder; 我們當然可以在插件源代碼中對它們進行硬編碼,但這種方式可重用性更高。

          我們的氣泡圖現在看起來更漂亮了:

          搖樹

          在生產中,我們努力交付盡可能少的代碼,以便最終用戶可以更快地加載我們的數據應用程序并獲得更好的體驗。為此,我們需要應用tree-shaking ,這是一個奇特的術語,用于從 JavaScript 包中刪除未使用的代碼。

          Chart.js 的組件設計完全支持 tree-shaking。您可以一次注冊所有 Chart.js 組件(這在您進行原型設計時很方便)并將它們與您的應用程序捆綁在一起。或者,您可以僅注冊必要的組件并獲得最小的捆綁包,其大小要小得多。

          讓我們檢查一下我們的示例應用程序。捆綁包尺寸是多少?您可以停止應用程序并運行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 和其他依賴項被捆綁在一個 265 KB 文件中。

          src/acquisitions.js為了減小包的大小,我們需要對和進行一些更改src/dimensions.js。首先,我們需要從兩個文件中刪除以下導入語句:import Chart from 'chart.js/auto'.

          相反,我們只加載必要的組件并使用 Chart.js“注冊”它們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類之外,我們還加載圖表類型、比例和其他圖表元素(例如,條形圖或點)的控制器。您可以在文檔中查找所有可用的組件。

          或者,您可以按照控制臺中的 Chart.js 建議進行操作。例如,如果您忘記導入BarController條形圖,您將在瀏覽器控制臺中看到以下消息:

          Unhandled Promise Rejection: Error: "bar" is not a registered controller.

          chart.js/auto請記住在準備生產應用程序時仔細檢查進口。只需要一次這樣的導入就可以有效地禁用樹搖動。

          現在,讓我們再次檢查我們的應用程序。運行yarn build你會得到這樣的結果:

          % 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.
          

          過僅導入和注冊選定的組件,我們刪除了超過 56 KB 的不必要代碼。鑒于其他依賴項在捆綁包中占用約 50 KB,tree-shaking 有助于從我們的示例應用程序的捆綁包中刪除約 25% 的 Chart.js 代碼。

          項目地址:https://github.com/chartjs/Chart.js

          過DataGear的參數化數據集、圖表事件處理和看板API功能,可以很方便地制作聯動異步加載圖表的數據可視化看板。

          首先,新建一個參數化SQL數據集,如下所示:

          SELECT
            COL_NAME,   --地區名
            COL_VALUE,  --地區指標數值
          FROM
            T_ANALYSIS
          WHERE
          <#if 上級地區名??>
            COL_PARENT='${上級地區名}'
          <#else>
            COL_PARENT='中國'
          </#if>

          參數:

          名稱        類型     必填
          上級地區名  字符串   否

          T_ANALYSIS表數據示例:

          COL_NAME     COL_VALUE   COL_PARENT
          山東	     160         中國
          北京         200         中國
          ...
          朝陽區       195         北京
          海淀區       200         北京
          ...
          青島市       10          山東
          濟南市       160         山東

          然后,使用上述數據集,新建兩個圖表,第一個是展示全國指標的地圖圖表:

          圖表類型:基本地圖
          數據集列標記:
          COL_NAME:地區名稱 (name)
          COL_VALUE:指標數值 (value)

          第二個是展示指定地區指標的柱狀圖:

          圖表類型:基本柱狀圖
          數據集列標記:
          COL_NAME:名稱 (name) 
          COL_VALUE:數值 (value)

          然后,新建可視化看板,填寫如下看板模板內容:

          <!DOCTYPE html>
          <html>
          <head>
          <meta charset="UTF-8">
          <title></title>
          <style type="text/css">
          .dg-chart{
            display: inline-block;
            width: 600px;
            height: 500px;
          }
          #loadChartWrapper{
            position:absolute;
            top:0;
            left:650px;
            width:400px;
            height:300px;
            box-shadow: 0px 0px 6px #474747;
            -webkit-box-shadow: 0px 0px 6px #474747;
            display:none;
          }
          #loadChart{
            position:absolute;
            top:2em;
            left:0;
            right:0;
            bottom:0;
          }
          </style>
          <script type="text/javascript">
          function chartClickHandler(chartEvent)
          {
            //獲取點擊的地區名
            var name = chartEvent.data.name;
            $("#chartTitle").html(name);
            
            //圖表已加載,直接刷新數據
            if(dashboard.renderedChart("loadChart"))
            {
              var chart = dashboard.chartOf("loadChart");
              chart.dataSetParamValueFirst(0, name);
              chart.refreshData();
              $("#loadChartWrapper").show();
            }
            //圖表未加載
            else
            {
              dashboard.loadChart($("#loadChart"), "[第二個圖表ID]",function(chart)
              {
                chart.dataSetParamValueFirst(0, name);
                $("#loadChartWrapper").show();
              });
            }
          }
          $(function()
          {
            $("#removeChartBtn").click(function()
            {
              dashboard.removeChart("loadChart");
              $("#loadChartWrapper").hide();
            });
          });
          </script>
          </head>
          <body class="dg-dashboard">
          <div style="position: absolute;left:1;top:1;font-size:12px;">
          	DataGear <br>
          	http://www.datagear.tech
          </div>
          <div style="font-size:2em;text-align:center;margin-bottom:5px;">DataGear 看板示例</div>
          <p> </p>
          <div style="position:relative;">
            <div class="dg-chart" dg-chart-on-click="chartClickHandler"
              dg-chart-disable-setting="true"
              dg-chart-widget="[第一個圖表ID]">
              <!--全國指標--></div>
            
            <div id="loadChartWrapper">
              <div id="chartTitle" style="position:absolute;top:2px;left:4px;font-weight:bold;"></div>
              <button id="removeChartBtn" style="position:absolute;top:2px;right:2px;">X</button>
              <div id="loadChart" dg-chart-disable-setting="true"
                dg-chart-options="{title:{show:false},legend:{show:false},grid:{top:30}}">
              <!--待加載的圖表元素--></div>
            </div>
          </div>
          </body>
          </html>

          點擊[保存并展示]按鈕,打開看板展示頁面,完成!!!

          注意,上述模板中的“[第一個圖表ID]”、“[第二個圖表ID]”要替換為實際的ID。

          效果圖如下所示:


          官網地址:http://www.datagear.tech

          源碼地址:

          Gitee:https://gitee.com/datagear/datagear

          Github:https://github.com/datageartech/datagear

          大屏模板地址:https://gitee.com/datagear/DataGearDashboardTemplate

          文作者:HelloGitHub-kalifun

          圖表庫千萬個今天 HelloGitHub 給大家推薦個很有“特色”的圖表庫:一個手繪風格的 JS 圖表庫 —— Chart.xkcd,快收起你緊繃、嚴肅的面容讓我們一起看看用手繪風格展示數據的效果。

          一、介紹

          項目地址:https://github.com/timqian/chart.xkcd

          Chart.xkcd 是一個圖表庫,可繪制“非精細”、“卡通”或“手繪”樣式的圖表。



          效果是不是很可愛?那下面就跟著 HelloGitHub 發起的《講解開源項目》[1]的教程一起學習、上手使用起來吧!

          二、快速入手

          使用 Chart.xkcd 很容易,只需頁面中包含庫的引用和一個用于顯示圖表的 <svg> 節點即可。

          2.1 代碼示例

          先用一段簡短的代碼,讓大家了解下基本的參數和代碼的樣子,后面會有可運行的代碼示例片段供大家學習和使用 。

          <!DOCTYPE html>
          <html lang="en">
          <head>
           <meta charset="UTF-8">
           <title>Title</title>
          </head>
          <body>
          <!--將 SVG 元素直接嵌入 HTML 頁面中-->
          <svg class="line-chart"></svg>
          <!--引入 JS 庫-->
          <script src="https://cdn.jsdelivr.net/npm/chart.xkcd@1.1/dist/chart.xkcd.min.js"></script>
          <script>
           //關鍵代碼塊
           const svg = document.querySelector('.line-chart')
           new chartXkcd.Line(svg, {
           title: '',
           xLabel: '',
           yLabel: '',
           data: {...},
           options: {},
           });
          </script>
          </body>
          </html>
          

          2.2 參數說明

          • title:圖表的標題
          • xLabel:圖表的 x 標簽
          • yLabel:圖表的 y 標簽
          • data:需要可視化的數據
          • options:自定義設置

          三、圖表類型

          Chart.xkcd 支持多樣的圖表類型,下面將逐一講解和實現:折線圖、XY 圖、條形圖、圓餅/甜甜圈圖、雷達圖,實現的示例代碼完整可運行、注釋完整、包含參數說明。

          tips:下文中的示例代碼均可直接運行,保存為 html 文件便可在本機查看效果。

          3.1 折線圖

          折線圖以折線形式顯示一系列數據點,它可以用于顯示趨勢數據或不同數據集的比較。

          示例代碼

          <!DOCTYPE html>
          <html lang="en">
          <head>
           <meta charset="UTF-8">
           <title>Title</title>
          </head>
          <body>
          <!--將 SVG 元素直接嵌入 HTML 頁面中-->
          <svg class="line-chart"></svg>
          <!--引入 JS 庫-->
          <script src="https://cdn.jsdelivr.net/npm/chart.xkcd@1.1/dist/chart.xkcd.min.js"></script>
          <script>
           // querySelector() 方法返回文檔中匹配指定 CSS 選擇器的一個元素。獲取文檔中 class=".line-chart" 的元素。
           const svg = document.querySelector('.line-chart');
           // chartXkcd.Line 創建一個折線圖
           const lineChart = new chartXkcd.Line(svg, {
           //圖表的標題
           title: 'Monthly income of an indie developer',
           // 圖表的 x 標簽
           xLabel: 'Month',
           // 圖表的 y 標簽
           yLabel: '$ Dollors',
           // 需要可視化的數據
           data: {
           // x 軸數據
           labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'],
           // y 軸數據
           datasets: [{
           // 第一組數據
           label: 'Plan',
           data: [30, 70, 200, 300, 500, 800, 1500, 2900, 5000, 8000],
           }, {
           // 第二組數據
           label: 'Reality',
           data: [0, 1, 30, 70, 80, 100, 50, 80, 40, 150],
           }],
           },
           // 可選配置以自定義圖表的外觀
           options: {
           // 自定義要在 y 軸上看到的刻度號(默認為 3)
           yTickCount: 3,
           // 指定要放置圖例的位置
           legendPosition: chartXkcd.config.positionType.upLeft
           }
           });
          </script>
          </body>
          </html>
          

          參數說明

          • yTickCount:自定義要在y軸上看到的刻度號(默認為 3)
          • legendPosition:指定要放置圖例的位置(默認為 chartXkcd.config.positionType.upLeft)。
          • 左上位置:chartXkcd.config.positionType.upLeft
          • 頂右上位置:chartXkcd.config.positionType.upRight
          • 左下位置:chartXkcd.config.positionType.downLeft
          • 右下位置:chartXkcd.config.positionType.downRight
          • dataColors:不同顏色的數據集數組
          • fontFamily:定制圖表中使用的字體系列
          • unxkcdify:禁用 xkcd 效果(默認為 false)

          效果展示



          3.2 XY 圖

          XY 圖表用于通過指定點的 XY 坐標來繪制點,您也可以通過連接這些點來繪制 XY 折線圖。

          示例代碼

          <script>
           // querySelector() 方法返回文檔中匹配指定 CSS 選擇器的一個元素。獲取文檔中 class=".xy-chart" 的元素。
           const svg = document.querySelector('.xy-chart');
           //chartXkcd.XY 創建一個XY圖
           new chartXkcd.XY(svg, {
           //圖表的標題
           title: 'Pokemon farms',
           // 圖表的 x 標簽
           xLabel: 'Coodinate',
           // 圖表的 y 標簽
           yLabel: 'Count',
           // 需要可視化的數據
           data: {
           datasets: [{
           // 第一組數據
           label: 'Pikachu',
           data: [{ x: 3, y: 10 }, { x: 4, y: 122 }, { x: 10, y: 100 }, { x: 1, y: 2 }, { x: 2, y: 4 }],
           }, {
           // 第二組數據
           label: 'Squirtle',
           data: [{ x: 3, y: 122 }, { x: 4, y: 212 }, { x: -3, y: 100 }, { x: 1, y: 1 }, { x: 1.5, y: 12 }],
           }],
           },
           options: {
           // 自定義要在 x 軸上看到的刻度號(默認為 3)
           xTickCount: 5,
           // 自定義要在 y 軸上看到的刻度號(默認為 3)
           yTickCount: 5,
           // 指定要放置圖例的位置
           legendPosition: chartXkcd.config.positionType.upRight,
           // 用線連接點(默認 false)
           showLine: false,
           // 指定時間格式
           timeFormat: undefined,
           // 更改點的大小(默認為 1)
           dotSize: 1,
           },
           });
          </script>
          

          參數說明

          • xTickCount:自定義要在x軸上看到的刻度號(默認為 3)
          • yTickCount:自定義要在y軸上看到的刻度號(默認為 3)
          • legendPosition:指定要放置圖例的位置
          • showLine: 點連接成線。
          • timeFormat:指定時間格式
          • dotSize:更改點的大小(默認為 1)
          • dataColors:不同顏色的數據集數組
          • fontFamily:定制圖表中使用的字體系列
          • unxkcdify:禁用 xkcd 效果(默認為 false)

          效果展示



          如果你想將這些點連接起來,讓數據對比更加明顯的話。請修改 showLine:true 再刷新頁面你就可以看到連線的效果了。

          3.3 條形圖

          條形圖提供了一種顯示以豎條表示的數據值的方式。

          示例代碼

          <script>
           // querySelector() 方法返回文檔中匹配指定 CSS 選擇器的一個元素。獲取文檔中 class=".bar-chart" 的元素。
           const svg = document.querySelector('.bar-chart');
           // chartXkcd.Bar 創建一個條形圖
           const barChart = new chartXkcd.Bar(svg, {
           // 圖表的標題
           title: 'github stars VS patron number',
           // xLabel: '', // optional
           // yLabel: '', // optional
           // 圖表數據
           data: {
           labels: ['github stars', 'patrons'],
           datasets: [{
           data: [100, 2],
           }],
           },
           options: {
           // 自定義要在 y 軸上看到的刻度號(默認為 3)
           yTickCount: 2,
           },
           });
          </script>
          

          參數說明

          • yTickCount:自定義要在y軸上看到的刻度號(默認為 3)
          • dataColors:不同顏色的數據集數組
          • fontFamily:定制圖表中使用的字體系列
          • unxkcdify:禁用xkcd效果(默認為 false)

          效果展示



          3.4 圓餅/甜甜圈圖

          餅圖廣泛得應用在各個領域,用于表示不同分類的占比情況,通過弧度大小來對比各種分類。餅圖通過將一個圓餅按照分類的占比劃分成多個區塊,整個圓餅代表數據的總量,每個區塊(圓弧)表示該分類占總體的比例大小,所有區塊(圓弧)的加和等于 100%。

          示例代碼

          <script>
           // querySelector() 方法返回文檔中匹配指定 CSS 選擇器的一個元素。獲取文檔中 class=".pie-chart" 的元素。
           const svg = document.querySelector('.pie-chart');
           // chartXkcd.Pie 創建一個圓餅圖
           const pieChart = new chartXkcd.Pie(svg, {
           // 圖表的標題
           title: 'What Tim made of',
           // 需要可視化的數據
           data: {
           labels: ['a', 'b', 'e', 'f', 'g'],
           datasets: [{
           data: [500, 200, 80, 90, 100],
           }],
           },
           options: {
           // 指定空的餅圖半徑
           innerRadius: 0.5,
           // 指定要放置圖例的位置
           legendPosition: chartXkcd.config.positionType.upRight,
           },
           });
          </script>
          

          參數說明

          • innerRadius:指定空的餅圖半徑(默認值:0.5)
          • 需要餅圖嗎?將 innerRadius 設置為 0
          • legendPosition:指定要放置圖例的位置
          • dataColors:不同顏色的數據集數組
          • fontFamily:定制圖表中使用的字體系列
          • unxkcdify:禁用 xkcd 效果(默認為 false)

          效果展示



          3.5 雷達圖

          雷達圖(Radar Chart)又被叫做蜘蛛網圖,適用于顯示三個或更多的維度的變量。雷達圖是以在同一點開始的軸上顯示的三個或更多個變量的二維圖表的形式來顯示多元數據的方法,其中軸的相對位置和角度通常是無意義的。

          示例代碼

          <script>
           // querySelector() 方法返回文檔中匹配指定 CSS 選擇器的一個元素。獲取文檔中 class=".radar-chart" 的元素。
           const svg = document.querySelector('.radar-chart');
           // chartXkcd.Radar 創建一個雷達圖
           const radarChart = new chartXkcd.Radar(svg, {
           // 圖表的標題
           title: 'Letters in random words',
           // 需要可視化的數據
           data: {
           labels: ['c', 'h', 'a', 'r', 't'],
           datasets: [{
           label: 'ccharrrt',
           data: [2, 1, 1, 3, 1],
           }, {
           label: 'chhaart',
           data: [1, 2, 2, 1, 1],
           }],
           },
           options: {
           // 在圖表中顯示圖例
           showLegend: true,
           // 點的大小
           dotSize: 0.8,
           // 在每行附近顯示標簽
           showLabels: true,
           // 指定要放置圖例的位置
           legendPosition: chartXkcd.config.positionType.upRight,
           // unxkcdify: true,
           },
           });
          </script>
          

          參數說明

          • showLabels:在每行附近顯示標簽(默認為 false)
          • ticksCount:自定義要在主行上看到的刻度號(默認為 3)
          • dotSize:更改點的大小(默認為 1)
          • showLegend:在圖表附近顯示圖例(默認為 false)
          • legendPosition:指定要放置圖例的位置
          • dataColors:不同顏色的數據集數組
          • fontFamily:定制圖表中使用的字體系列
          • unxkcdify:禁用 xkcd 效果(默認為 false)

          效果展示



          四、最后

          以上就是講解的全部內容,相信教程至此 Chart.xkcd 庫的基本用法你已經基本掌握,后面就可以用來今天學到的東西,提高自己項目的顏值了。

          有了 Chart.xkcd 讓數據可愛地展示出來并不難,快動手自己實現一個吧~

          參考資料

          [1]《講解開源項目》: https://github.com/HelloGitHub-Team/Article

          [2]CHART.XKCD 官方文檔: https://timqian.com/chart.xkcd/

          [3]CHART.XKCD 項目地址: https://github.com/timqian/chart.xkcd


          『講解開源項目系列』——讓對開源項目感興趣的人不再畏懼、讓開源項目的發起者不再孤單。跟著我們的文章,你會發現編程的樂趣、使用和發現參與開源項目如此簡單。歡迎留言聯系我們、加入我們,讓更多人愛上開源、貢獻開源~


          主站蜘蛛池模板: 天海翼一区二区三区高清视频| 国产伦精品一区二区免费| 天码av无码一区二区三区四区 | 亚洲制服中文字幕第一区| 久久精品无码一区二区三区不卡 | 呦系列视频一区二区三区| 国产精品免费大片一区二区| AV天堂午夜精品一区二区三区 | 国产亚洲情侣一区二区无| 无码国产精品久久一区免费 | 国产精品一区二区久久国产| 人成精品视频三区二区一区| 精品国产福利在线观看一区| 亚洲AV网一区二区三区| 亚洲一本一道一区二区三区| 国产91久久精品一区二区| 91视频国产一区| 亚洲一区二区三区播放在线| 免费视频精品一区二区三区| 国模精品一区二区三区| 中文字幕亚洲一区二区va在线| 精品福利一区二区三区| 国产成人精品无码一区二区三区| 亚洲av成人一区二区三区在线观看| 夜夜精品无码一区二区三区| av在线亚洲欧洲日产一区二区| 一区二区精品在线观看| 国产一区二区三区夜色| 久久se精品一区精品二区| 久久婷婷色一区二区三区| 亚洲视频一区在线| 2021国产精品视频一区| 天堂成人一区二区三区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 色婷婷AV一区二区三区浪潮| 日本一区二区在线| 久久精品无码一区二区WWW| 亚洲丶国产丶欧美一区二区三区| 欧洲精品一区二区三区| 国产在线无码视频一区| 狠狠色婷婷久久一区二区三区 |