Stories

Detail Return Return

老闆要排名可視化?我反手甩出TinyChart 排名進度圖 - Stories Detail

本文由張顥嚴同學原創。

前言

OpenTiny HUICharts 是一套功能強大的前端可視化圖表庫,提供豐富的圖表組件、支持 Vue、React、Angular 等主流前端框架,並內置多套主題且可靈活定製,同時完全兼容 ECharts API,使開發高性能、響應式的數據可視化應用變得簡單便捷。

RankProcessChart 基於 HUICharts 開發,專門用於展示排名及流程類數據的可視化效果,能夠直觀呈現複雜數據關係。

在使用 RankProcessChart 之前,需要先完成基本的開發環境配置。

環境準備與安裝

1. 環境要求

在開始之前,首先確認安裝了 NodeJs,並確保 NodeJs 版本是 10.13 或以上

檢查 Node.js 版本

node -v

如果版本低於 10.13,請前往 Node.js 官網 下載安裝最新的 LTS 版本。

2. 查看最新版本

在安裝前,可以先查看 HUICharts 當前的最新版本:

npm show @opentiny/huicharts

3. 安裝 HUICharts

使用 npm 安裝最新版本的 HUICharts:

# 使用 npm
npm install @opentiny/huicharts@latest --save

安裝完成後,您就可以在項目中引入並使用 HUICharts 了。

快速開始

基本使用流程

下面是一個示範,展示如何在項目中創建並渲染一個圖表:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>RankProcessChart演示</title>
  <style>
    #RankProcessChart {
      width: 800px;
      height: 800px;
      background-color: #fff;
      margin: 0 auto;
    }
  </style>
</head>
<body>
  <div class="app">
    <div id="RankProcessChart"></div>
  </div>

  <script type="module">
    import HuiCharts, { RankProcessChart } from '@opentiny/huicharts';

    const chartContainer = document.getElementById('RankProcessChart');
    const chart = new HuiCharts();
    chart.init(chartContainer);

    const chartOption = {
      name: 'RankProcessChart',
      theme: 'hdesign-light',
      padding: ['middle', 16, 0, 16],
      titleName: '名稱',
      valueName: '金額',
      percentName: '貢獻度',
      tooltip: { 
          show: true,
          formatter: null
      },
      sort: {
          field: 'value',
          order: 'desc'
      },
      data: [
        { name: '小王', value: 100, percent: 100 },
        { name: '小明', value: 60, percent: 60 },
        { name: '小智', value: 40, percent: 40 },
        { name: '小剛', value: 70, percent: 70 },
        { name: '小李', value: 50, percent: 50 }
      ],
    };

    chart.setSimpleOption(RankProcessChart, chartOption);
    chart.render();
  </script>
</body>
</html>

下面是在瀏覽器中打開的效果:

1.png

在不同框架中使用

Vue 3 示例

<template>
  <div class="app">
    <div id="chart" style="width: 600px; height: 400px; margin: 40px auto;"></div>
  </div>
</template>

<script setup>
    import { onMounted } from 'vue'
    import HuiCharts, { RankProcessChart } from '@opentiny/huicharts';

    onMounted(() => {
      const chartContainer = document.getElementById('chart')
      const chart = new HuiCharts()
      chart.init(chartContainer)

      const chartOption = {
          name: 'RankProcessChart',
          theme: 'hdesign-light',
          padding: [16, 16, 0, 16], 
          titleName: '名稱',
          valueName: '金額',
          percentName: '貢獻度',
          tooltip: {
                show: true,
                formatter: null
          },
          sort: {
                field: 'value',
                order: 'desc'
          },
          data:[
                  { name: '小王', value: 100, percent: 100 },
                { name: '小明', value: 60, percent: 60 },
                { name: '小智', value: 40, percent: 40 },
                { name: '小剛', value: 70, percent: 70 },
                { name: '小李', value: 50, percent: 50 }
          ],
      };
        
      chart.setSimpleOption(RankProcessChart, chartOption)
      chart.render()

    })
</script>

<style>
    .app {
      text-align: center;
    }
</style>

React 示例

import React, { useEffect, useRef } from 'react';
import HuiCharts, { RankProcessChart } from '@opentiny/huicharts';

const App = () => {
  const chartRef = useRef(null);

  useEffect(() => {
    const chart = new HuiCharts();
    chart.init(chartRef.current);

    const chartOption = {
      theme: 'hdesign-light',
      name: 'RankProcessChart',
      padding: [16, 16, 0, 16],
      titleName: '名稱',
      valueName: '金額',
      percentName: '貢獻度',
      tooltip: { show: true },
      sort: { field: 'value', order: 'desc' },
      data: [
        { name: '小王', value: 100, percent: 100 },
        { name: '小明', value: 60, percent: 60 },
        { name: '小智', value: 40, percent: 40 },
        { name: '小剛', value: 70, percent: 70 },
        { name: '小李', value: 50, percent: 50 }
      ],
    };

    chart.setSimpleOption(RankProcessChart, chartOption);
    chart.render();

  }, []);

  return (
    <div className="app" style={{ textAlign: 'center' }}>
      <div
        ref={chartRef}
        style={{ width: '600px', height: '400px', margin: '40px auto' }}
      ></div>
    </div>
  );
};

export default App;

本地開發環境搭建

如果您想參與 HUICharts 的開發,或在本地查看完整示例,可以按照以下步驟搭建本地開發環境:

1. 克隆項目

git clone git@github.com:opentiny/tiny-charts.git
cd tiny-charts

2. 安裝依賴

npm install

3. 啓動開發服務器

npm run dev

4. 訪問項目

啓動成功後,在瀏覽器中訪問:

http://localhost:8080/

您將看到包含所有圖表示例的文檔站點,可以在線查看和調試各種圖表效果。

RankProcessChart 排名進度圖詳解

圖表簡介

RankProcessChart(排名進度圖) 是一個專門用於展示排名和進度數據的可視化組件。它以直觀的橫向進度條形式展示每個項目的排名、數值和貢獻度。

圖表特點

  • 數據展示RankProcessChart 支持在每行數據中展示標題文本,數值文本,百分比文本以及進度條圖形,且在圖表頂部允許提供列頭來概括該列信息,信息均可由用户自定義
  • 數據排序RankProcessChart 支持對數據進行排序並展示排名和進度數據,同時用户可自定義排序的依據和排序方法
  • 自定義tooltipRankProcessChart 支持對每行數據展示額外的信息,在鼠標懸浮到進度條時會出現tooltip,且tooltip的內容和格式均可由用户自定義
  • 縱向滾動條RankProcessChart 支持在數據條數過多時,在縱向出現滾動條,用户可通過鼠標滑動查看數據
  • 自定義配色RankProcessChart 支持用户自定義進度條配色,且包括單列進度條配色和全局進度條默認配色
  • 過長標題顯示tipsRankProcessChart 支持在每行的標題文本過長截斷並出現 ... 省略,當鼠標懸浮到標題文本時出現tips,展示完整的標題文本

配置項詳解

下面詳細介紹 RankProcessChart 的所有配置選項及其作用。

完整配置項

const chartOption = {
    // 圖表名稱
    name: 'RankProcessChart',
    
    // 主題樣式
    theme: 'hdesign-light',
    
    // 內邊距 [上, 右, 下, 左]
    padding: [16, 16, 0, 16],
    
    // 列標題
    titleName: '名稱',
    valueName: '數值',
    percentName: '百分比',
    
    // 全局進度條配色
    color: ['#FF6B6B', '#4ECDC4', '#45B7D1'],
    
    // 排序配置
    sort: {
        field: 'value',    // 排序依據,可選'value' 或 'percent'
        order: 'desc'      // 排序方式,可選'asc'、'desc'、'none'
    },
    
    // 提示框配置
    tooltip: {
        show: true,        // tooltip是否展示
        formatter: null    // 自定義格式函數
    },
    
    // 數據
    data: [
        {
            name: '項目名稱',         // 必需
            value: 100,              // 必需
            percent: 85,             // 必需
            color: '#FF0000',        // 可選
            content: '詳細描述'        // 可選
        }
    ]
};

1. data - 圖表數據(必需)

類型Array<Object>

data是圖表的核心數據,每個數據項代表一條記錄。

數據項字段説明

字段名 類型 必需 默認值 説明
name string '未命名' 顯示名稱,如項目名、人員名等
value number 0 顯示數值,可用於排序
percent number 0 百分比進度,範圍 0-100,可用於排序
color string null 用户自定義該行進度條顏色
content string '' 鼠標懸浮時顯示的用户自定義信息

示例

data: [
    { 
        name: '項目A', 
        value: 96, 
        percent: 96 
    },
    { 
        name: '項目B', 
        value: 85, 
        percent: 85, 
        content: '項目B詳細信息',
    },
    { 
        name: '項目C', 
        value: 72, 
        percent: 72, 
        content: '項目C詳細信息' 
        color: '#FF6B6B'
    },
]

演示如下:

2.1.gif

2. theme - 主題樣式

類型string

theme用來設置圖表的主題風格,影響整體色彩和樣式。

默認值'hdesign-light'

可選值

  • light :ICT3.0圖表淺色主題
  • dark :ICT3.0圖表深色主題
  • hdesign-light :H Design1.1圖表淺色主題
  • hdesign-dark :H Design1.1圖表深色主題
  • cloud-light :華為雲圖表淺色主題
  • cloud-dark :華為雲圖表深色主題
  • dpui-light :質量&流程IT圖表淺色主題
  • dpui-dark :質量&流程IT圖表深色主題

示例

theme: 'hdesign-light'

演示如下:

3.gif

3. titleName - 名稱列標題

類型string

titleName定義了頂部的第一列文本,用來規範data的name屬性

默認值'標題'

示例

titleName: '部門名稱'

4. valueName - 數值列標題

類型string

valueName定義了頂部的第二列文本,用來規範data的value屬性

默認值'數值'

示例

valueName: '營業額'

5. percentName - 百分比列標題

類型string

percentName定義了頂部的第三列文本,用來規範data的percent屬性

默認值'百分比'

示例

percentName: '增長率'

演示如下:

4.1.GIF

6. padding - 內邊距

類型Array<number | string>

padding用來控制圖表距離容器的內邊距,順序為 [top, right, bottom, left]

默認值[16, 16, 0, 16]

支持的值類型

  1. 數字:直接像素值,如 16
  2. 百分比字符串:相對容器尺寸,如 '10%'
  3. 位置詞

    • 垂直方向(僅適用於top):'top''middle''bottom'
    • 水平方向(僅適用於left):'left''center''right'

示例

// 數字方式
padding: [16, 16, 0, 16]

// 百分比方式
padding: ['5%', '5%', '5%', '5%']

// 位置詞方式
padding: ['top', 0, 0, 'left']

// 混合方式
padding: ['top', '10%', 0, 20]

演示如下:

5.1.GIF

7. color - 顏色配置

類型Array<string | null>

color用來自定義圖表的配色方案,配置之後會頂替當前主題的默認配色,如果進度條沒有顏色配置,則顏色從color中輪換取色

默認值[]

顏色優先級

數據項的顏色選擇遵循以下優先級:

  1. 數據項 color:單個數據項的 color 字段
  2. 全局 color 數組:配置中的 color 數組
  3. 主題默認色:主題提供的默認配色

示例

color: [
    '#FF6B6B',
    '#4ECDC4',
    '#45B7D1',
    '#96CEB4',
    '#FFEAA7'
]

演示如下:

6.1.GIF

8. sort - 排序配置

類型Object

sort用來控制數據的排序方式

默認值{ field: 'value', order: 'desc' }

配置選項

字段 類型 可選值 默認值 説明
field string 'value''percent' 'value' field決定排序所依據的屬性,value則根據value排序,percent則根據percent排序
order string 'asc''desc''none' 'desc' order決定如何排序,asc表示升序排序,desc表示降序排序,none表示不排序

示例

// 示例1:按數值降序(默認)
sort: {
    field: 'value',
    order: 'desc'
}

// 示例2:按百分比升序
sort: {
    field: 'percent',
    order: 'asc'
}

// 示例3:不排序
sort: {
    field: 'value',
    order: 'none'
}

演示如下:

7.gif

9. tooltip - 提示框配置

類型Object

tooltip用來配置鼠標懸浮時顯示的提示框。

默認值{ show: true, formatter: null }

配置選項

字段 類型 默認值 説明
show boolean true 是否顯示提示框
formatter `Function \ null` null 自定義格式化函數

formatter 函數

如果需要自定義 tooltip 內容,可以提供 formatter 函數:

參數:接收一個對象,包含當前數據項的所有信息

{
    name: string,      // 名稱
    value: number,     // 數值
    percent: number,   // 百分比
    color: string,     // 顏色
    content: string    // 詳細信息
}

返回值:HTML 字符串

示例

// 默認的tooltip配置
tooltip: {
    show: true,
    formatter: null
}

// 關閉 tooltip
tooltip: {
    show: false
}

// 自定義 tooltip 內容
tooltip: {
    show: true,
    formatter: function(params) {
        const { name, value, percent, color, content } = params;
        
        return `
            <div style="padding: 12px;">
                <div style="font-weight: bold; color: ${color}; margin-bottom: 8px;">
                    ${name}
                </div>
                <div>數值: <strong>${value}</strong></div>
                <div>完成度: <strong>${percent}%</strong></div>
                ${content ? `<div style="margin-top: 8px; color: #666;">${content}</div>` : ''}
            </div>
        `;
    }
}

演示如下:

8.gif

總結

RankProcessChart 提供了對排名與進度數據的高度定製能力。建議在設計時遵循配置優先級、在外層預處理數值與格式、併兼顧無障礙對比與移動端交互。合理配置與文檔化這些選項,可顯著提升 RankProcessChart 在不同場景下的可用性、可維護性與用户體驗。

關於OpenTiny

歡迎加入 OpenTiny 開源社區。添加微信小助手:opentiny-official 一起參與交流前端技術~

OpenTiny 官網:https://opentiny.design
OpenTiny 代碼倉庫:https://github.com/opentiny
TinyVue 源碼:https://github.com/opentiny/tiny-vue
TinyEngine 源碼: https://github.com/opentiny/tiny-engine
歡迎進入代碼倉庫 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI、TinyEditor~
如果你也想要共建,可以進入代碼倉庫,找到 good first issue 標籤,一起參與開源貢獻~

user avatar chengdumeiyouni Avatar cyzf Avatar smalike Avatar chongdianqishi Avatar u_16307147 Avatar imba97 Avatar zhulongxu Avatar weidewei Avatar DingyLand Avatar romanticcrystal Avatar it1042290135 Avatar Poetwithapistol Avatar
Favorites 55 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.