LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

最全ECharts 實(shí)戰(zhàn)大全(速記版+資源)

freeflydom
2025年2月8日 10:54 本文熱度 21

近期我負(fù)責(zé)的公司人力資源系統(tǒng)中,薪酬統(tǒng)計(jì)模塊的開(kāi)發(fā)進(jìn)度正穩(wěn)步推進(jìn)。在此過(guò)程中,我發(fā)現(xiàn)需要展示多種圖表(如 ECharts)來(lái)直觀反映數(shù)據(jù)。然而,ECharts 的配置過(guò)程相對(duì)復(fù)雜,頻繁查閱官方文檔不僅耗時(shí),而且效率不高。為了提升開(kāi)發(fā)效率,我萌生了這樣一個(gè)想法:將 ECharts 中的一些通用屬性進(jìn)行提煉和整理,同時(shí)匯總常用的配置項(xiàng)以及在實(shí)際應(yīng)用中需要注意的要點(diǎn)。這樣一來(lái),不僅能夠簡(jiǎn)化配置過(guò)程,還能為團(tuán)隊(duì)提供一個(gè)便捷的參考指南。

EChart 資源

Vue-EChart

不想封裝 Echart, 可以選用這種方案。

Vue-ECharts 是一個(gè) Vue 組件,旨在簡(jiǎn)化在 Vue 應(yīng)用中集成 ECharts 的過(guò)程。它封裝了 ECharts 的初始化和使用邏輯,用戶只需要在 Vue 模板中添加組件并傳遞相應(yīng)的 props,即可輕松創(chuàng)建圖表。

支持Vue2 & Vue3 & Nuxt3

DOC: https://github.com/ecomfe/vue-echarts#readme

優(yōu)點(diǎn):

  1. Vue-ECharts 組件會(huì)自動(dòng)處理 ECharts 實(shí)例的生命周期,能夠根據(jù) Vue 組件的狀態(tài)變化自動(dòng)更新圖表。這使得代碼更加簡(jiǎn)潔,易于維護(hù)。
  2. 通過(guò) Vue 的數(shù)據(jù)綁定機(jī)制,可以直接將數(shù)據(jù)綁定到組件的 props 上,Vue-ECharts 會(huì)自動(dòng)將數(shù)據(jù)變化應(yīng)用到圖表上。
  3. 作為 Vue 組件,可以很容易地與其他 Vue 組件組合,并且可以利用 Vue 的指令和事件系統(tǒng)。

EChart 配置生成 option

目前只有三種圖表狀態(tài),可生成圖片和JSON.

https://github.com/BruceHenry/chart-creator

EChart 速查手冊(cè) [官網(wǎng)]

https://echarts.apache.org/zh/cheat-sheet.html

EChart 主題配置 [官網(wǎng)]

https://echarts.apache.org/zh/theme-builder.html

EChart 社區(qū)示例 [社區(qū),提供了大量的示例基本可以滿足任何需求]

  1. MCChart

  1. isqqw

  1. MakeAPie

  1. PPChart

閱讀導(dǎo)圖

常用屬性配置

title 標(biāo)題配置

  1. text - 標(biāo)題文本,例如 "柱狀圖"
  2. subtext- 副標(biāo)題文本***
  3. *left 標(biāo)題的水平位置,可以是像'left' 'center' 'right' 或者像'20%' 這樣的百分比
  4. top*** **- 標(biāo)題的垂直位置,可以是像** **'top',**** __'middle'__,__** __'bottom'__** __或者像**__** __'20%'__ __這樣的百分比***
  5. textStyle*** **- 控制標(biāo)題文本樣式的對(duì)象,可以包括** ****color****,fontStylefontWeightfontFamily,*fontSize****** ****
  6. subtextStyle*** **- 控制副標(biāo)題文本樣式的對(duì)象,屬性同** ****textStyle*
  7. textAlign*** **- 標(biāo)題文本對(duì)齊,例如** **'left',**** __'right'__,**__** __'center'***
  8. padding*** **- 標(biāo)題內(nèi)邊距,可以是數(shù)字或數(shù)組** ****[上, 右, 下, 左]*
  9. itemGap - 主副標(biāo)題之間的間距
option = {
    title: {
        // 主標(biāo)題文本設(shè)置
        text: '主標(biāo)題文本',
        // 副標(biāo)題文本設(shè)置
        subtext: '副標(biāo)題文本',
        // 標(biāo)題水平位置設(shè)置,'center' 表示居中
        left: 'center',
        // 標(biāo)題垂直位置設(shè)置,'top' 表示頂部
        top: 'top',
        // 主標(biāo)題樣式設(shè)置,包括文字顏色、字體風(fēng)格、字體粗細(xì)、字體族、字體大小
        textStyle: {
            color: 'black',      // 文字顏色
            fontStyle: 'normal', // 字體風(fēng)格,'normal'表示普通樣式
            fontWeight: 'bold',  // 字體粗細(xì),'bold'表示加粗
            fontFamily: 'Arial', // 字體族,這里設(shè)置為Arial
            fontSize: 18,        // 字體大小,單位像素
        },
        // 副標(biāo)題樣式設(shè)置,屬性同主標(biāo)題textStyle
        subtextStyle: {
            color: '#aaa',       // 文字顏色
            fontStyle: 'normal', // 字體風(fēng)格
            fontWeight: 'normal',// 字體粗細(xì)
            fontFamily: 'Arial', // 字體族
            fontSize: 12,        // 字體大小
        },
        // 標(biāo)題文本對(duì)齊方式,'center' 表示居中對(duì)齊
        textAlign: 'center',
        // 標(biāo)題內(nèi)邊距,第一個(gè)值表示上邊距,第二個(gè)值表示右邊距
        padding: [5, 10],
        // 主副標(biāo)題之間的間距
        itemGap: 10
    },
    // 此處省略其他的圖表配置選項(xiàng)…
};

tooltip 提示框

  1. formatter - 提示框浮層的內(nèi)容格式器,支持字符串模板和回調(diào)函數(shù)兩種形式
  2. axisPointer - 坐標(biāo)軸指示器配置,指定其類型如 'line''shadow' 
  3. show - 是否顯示提示框組件,包括提示框浮層和 axisPointer,默認(rèn)為*** ***true
  4. backgroundColor - 提示框浮層的背景顏色
  5. borderColor - 提示框浮層的邊框顏色
  6. borderWidth - 提示框浮層的邊框?qū)?/font>
  7. padding - 提示框浮層內(nèi)邊距,可以是數(shù)字或數(shù)組 __[上, 右, 下, 左]**
// 工具提示配置
    tooltip: {
        // 觸發(fā)類型,'item' 表示數(shù)據(jù)項(xiàng)圖形觸發(fā),用于散點(diǎn)圖等無(wú)類目軸的圖表,'axis' 表示坐標(biāo)軸觸發(fā),用于柱狀圖等有類目軸的圖表
        trigger: 'axis',
        // 自定義提示框內(nèi)容
        formatter: function (params) {
            // `params` 是一個(gè)數(shù)組,包含了當(dāng)前鼠標(biāo)所在點(diǎn)的所有數(shù)據(jù)信息
            let res = params[0].name + '<br>';
            params.forEach(function (item) {
                // 添加信息,這里只是個(gè)簡(jiǎn)單示例,具體格式可以自由配置
                res += item.seriesName + ': ' + item.value + '<br>';
            });
            return res;
        },
        // 坐標(biāo)軸指示器配置
        axisPointer: {
            type: 'shadow' // 'line' 表示直線指示器,'shadow' 表示陰影指示器
        },
        // 控制浮層顯示
        show: true,
        // 浮層背景顏色
        backgroundColor: 'rgba(50,50,50,0.7)',
        // 浮層邊框顏色
        borderColor: '#333',
        // 浮層邊框?qū)挾?/span>
        borderWidth: 0,
        // 浮層內(nèi)邊距
        padding: 10 // 或者使用數(shù)組形式,例如 [5, 10, 5, 10]
    },

  1. formatter - 提示框浮層的內(nèi)容格式器,支持字符串模板和回調(diào)函數(shù)兩種形式
  2. axisPointer - 坐標(biāo)軸指示器配置,指定其類型如 'line''shadow' 
  3. show - 是否顯示提示框組件,包括提示框浮層和 axisPointer,默認(rèn)為*** ***true
  4. backgroundColor - 提示框浮層的背景顏色
  5. borderColor - 提示框浮層的邊框顏色
  6. borderWidth - 提示框浮層的邊框?qū)?/font>
  7. padding - 提示框浮層內(nèi)邊距,可以是數(shù)字或數(shù)組 __[上, 右, 下, 左]**
// 工具提示配置
    tooltip: {
        // 觸發(fā)類型,'item' 表示數(shù)據(jù)項(xiàng)圖形觸發(fā),用于散點(diǎn)圖等無(wú)類目軸的圖表,'axis' 表示坐標(biāo)軸觸發(fā),用于柱狀圖等有類目軸的圖表
        trigger: 'axis',
        // 自定義提示框內(nèi)容
        formatter: function (params) {
            // `params` 是一個(gè)數(shù)組,包含了當(dāng)前鼠標(biāo)所在點(diǎn)的所有數(shù)據(jù)信息
            let res = params[0].name + '<br>';
            params.forEach(function (item) {
                // 添加信息,這里只是個(gè)簡(jiǎn)單示例,具體格式可以自由配置
                res += item.seriesName + ': ' + item.value + '<br>';
            });
            return res;
        },
        // 坐標(biāo)軸指示器配置
        axisPointer: {
            type: 'shadow' // 'line' 表示直線指示器,'shadow' 表示陰影指示器
        },
        // 控制浮層顯示
        show: true,
        // 浮層背景顏色
        backgroundColor: 'rgba(50,50,50,0.7)',
        // 浮層邊框顏色
        borderColor: '#333',
        // 浮層邊框?qū)挾?/span>
        borderWidth: 0,
        // 浮層內(nèi)邊距
        padding: 10 // 或者使用數(shù)組形式,例如 [5, 10, 5, 10]
    },

legend(圖例組件)

圖表的圖例,表示不同系列的標(biāo)識(shí)。

legend: {
    top: '5%',
    left: 'center',
    data: ['直接訪問(wèn)', '聯(lián)盟廣告', '搜索引擎']
}

series(系列列表)

每個(gè) series 代表一組數(shù)據(jù)項(xiàng)的集合,對(duì)于餅圖配置的主要部分。

series 屬性及其可能的值包括:

  • type: 'pie' // 必須設(shè)置為 'pie' 表示這是一個(gè)餅圖。
  • radius: 半徑,可以是百分比或固定像素值,也可以是數(shù)組形式表示內(nèi)外半徑。
  • center: Pie圖的中心位置。
  • data: 數(shù)據(jù)項(xiàng)數(shù)組,每個(gè)數(shù)據(jù)項(xiàng)包括 value(數(shù)值)和 name(名稱)。
  • stillShowZeroSum: 如果所有數(shù)據(jù)值都是0,是否顯示圖形。
  • label: 用于設(shè)置數(shù)據(jù)標(biāo)簽,如是否顯示、位置、格式等。

series: [
    {
        name: '訪問(wèn)來(lái)源',
        type: 'pie',
        radius: '50%', // 半徑大小,支持百分比
        center: ['50%', '50%'], // 餅圖的中心位置
        data: [
            {value: 335, name: '直接訪問(wèn)'},
            {value: 234, name: '聯(lián)盟廣告'},
            {value: 1548, name: '搜索引擎'}
        ],
        emphasis: {
            itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
            }
        },
        stillShowZeroSum: true,
        label: {
            normal: {
                show: true,
                position: 'outside' // 標(biāo)簽的位置
            },
            emphasis: {
                show: true,
                textStyle: {
                    fontSize: '30',
                    fontWeight: 'bold'
                }
            }
        }
    }
]

toolbox (工具欄配置)

color (配色方案)

定義顏色數(shù)組,用于系列中每個(gè)扇形的默認(rèn)顏色:

  • 示例:<font style="color:rgb(46, 50, 56);">['#5470C6', '#91CC75', '#FAC858', '#EE6666']</font>

animation (動(dòng)畫配置)

完整配置示例代碼

option = {
    title: {
        // 餅圖的標(biāo)題
        text: 'Pie Chart Example'
    },
    tooltip: {
        // 鼠標(biāo)懸浮時(shí)的提示框設(shè)置
        trigger: 'item' // item: 數(shù)據(jù)項(xiàng)圖形觸發(fā)
    },
    legend: {
        // 圖例組件,展示不同系列的標(biāo)識(shí)顏色和名稱
        top: '5%',    // 距離容器上方的距離
        left: 'center', // 水平居中
        // 對(duì)應(yīng)系列名稱的數(shù)據(jù)
        data: ['Direct Visit', 'Union Ad', 'Search Engine']
    },
    toolbox: {
    show: true, // 顯示工具欄
    feature: {
      saveAsImage: {}, // 保存為圖片功能
      restore: {} // 還原功能
    }
  },
    series: [
        {
            // 系列名稱,用于tooltip的顯示
            name: 'Access From',
            type: 'pie', // 類型必須為餅圖
            // 餅圖的半徑大小
            radius: '55%',
            // 餅圖的中心(圓心)位置
            center: ['50%', '60%'],
            // 數(shù)據(jù)數(shù)組,包含每個(gè)扇區(qū)的大小和名稱
            data: [
                { value: 335, name: 'Direct Visit' },
                { value: 234, name: 'Union Ad' },
                { value: 1548, name: 'Search Engine' }
            ],
            // 強(qiáng)調(diào)樣式,當(dāng)鼠標(biāo)懸浮時(shí)顯示陰影等效果
            emphasis: {
                itemStyle: {
                    shadowBlur: 10, // 陰影的模糊大小
                    shadowOffsetX: 0, // 陰影水平方向上的偏移距離
                    shadowColor: 'rgba(0, 0, 0, 0.5)' // 陰影顏色
                }
            },
            // 標(biāo)簽的顯示方式設(shè)定
            label: {
                normal: {
                    // 常規(guī)狀態(tài)下的標(biāo)簽顯示設(shè)置
                    show: true, // 是否展示標(biāo)簽
                    position: 'outside', // 標(biāo)簽的位置
                    // 標(biāo)簽的格式化器
                    formatter: '{b}: {c} (v6fgzc1vch%)'
                },
                emphasis: {
                    // 高亮狀態(tài)下的文本樣式定義
                    show: true,
                    textStyle: {
                        fontSize: '30', // 字體大小
                        fontWeight: 'bold' // 字體粗細(xì)
                    }
                }
            }
        }
    ]
};

EChart 在 Vue3 中實(shí)戰(zhàn)

// 圖表實(shí)例的引用
  const chart = ref(null);
  // 初始化圖表
  const initChart = () => {
    if (chart.value) {
      const myChart = echarts.init(chart.value); // 初始化 ECharts 實(shí)例
      myChart.setOption(props.option); // 設(shè)置配置項(xiàng)
    }
  };
  // 監(jiān)聽(tīng) props 的變化,動(dòng)態(tài)更新圖表
  watch(
    () => props.option,
    (newOption) => {
      if (chart.value) {
        const myChart = echarts.getInstanceByDom(chart.value); // 獲取已初始化的圖表實(shí)例
        myChart.setOption(newOption); // 更新配置項(xiàng)
      }
    }
  );

響應(yīng)式處理

圖表在窗口大小變化時(shí)能夠自動(dòng)調(diào)整。可以使用 resize() 方法手動(dòng)調(diào)整圖表大小,通常是在 updated 生命周期鉤子中調(diào)用。

// 響應(yīng)式調(diào)整圖表大小, 監(jiān)聽(tīng)窗口大小變化,確保圖表自適應(yīng)容器的大小。
const resizeChart = () => {
  if (chart.value) {
    const myChart = echarts.getInstanceByDom(chart.value);
    myChart.resize(); // 調(diào)整圖表尺寸
  }
};
// 生命周期鉤子
onMounted(() => {
  initChart(); // 組件掛載后初始化圖表
  window.addEventListener('resize', resizeChart); // 監(jiān)聽(tīng)窗口大小變化
});

動(dòng)態(tài)數(shù)據(jù)更新

使用 Vue 的響應(yīng)式數(shù)據(jù)(如 ref 或 reactive)配合 watch,在數(shù)據(jù)變化時(shí)調(diào)用 chart.setOption() 重新渲染圖表。

const chartOption = ref({
      title: { text: '實(shí)時(shí)數(shù)據(jù)' },
      tooltip: { trigger: 'axis' },
      xAxis: { data: ['1', '2', '3', '4', '5'] },
      yAxis: {},
      series: [{
        name: '銷量',
        type: 'line',
        data: [120, 132, 101, 134, 90]
      }]
    });
watch(
  () => props.option,
  (newOption) => {
    if (chartInstance.value) {
      chartInstance.value.setOption(newOption); // 動(dòng)態(tài)更新圖表配置
    }
  },
  { deep: true } // 深度監(jiān)聽(tīng)
);
chartOption.value.series[0].data.push(Math.random() * 100);
chartOption.value.xAxis.data.push(String(chartOption.value.xAxis.data.length + 1));

圖表容器大小自適應(yīng)

父容器尺寸發(fā)生變化時(shí),圖表可能不會(huì)自動(dòng)調(diào)整大小。 我們可以通過(guò) 監(jiān)聽(tīng) resize 事件或使用 Vue 的響應(yīng)式布局方案,調(diào)用 chart.resize() 更新圖表尺寸。

const observer = new ResizeObserver(() => {
  chartInstance.value?.resize(); // 動(dòng)態(tài)調(diào)整大小
});
observer.observe(containerElement); // 監(jiān)聽(tīng)容器

國(guó)際化與多語(yǔ)言支持

圖表中包含的文案(如標(biāo)題、提示)需要支持多語(yǔ)言。 我們可以使用 Vue I18n 或其他國(guó)際化工具動(dòng)態(tài)替換文本。

npm install vue-i18n
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const option = reactive({
  title: { text: t('chart.title') },
});

ECharts 圖表導(dǎo)出

toolbox: {
  feature: {
    saveAsImage: { show: true },
  },
};

性能優(yōu)化

銷毀 ECharts 實(shí)例

在組件銷毀時(shí),確保銷毀 ECharts 實(shí)例,防止內(nèi)存泄漏。

 onBeforeUnmount(() => {
      if (chart.value) {
        const myChart = echarts.getInstanceByDom(chart.value);
        myChart.dispose(); // 銷毀 ECharts 實(shí)例
      }
      window.removeEventListener('resize', resizeChart); // 移除事件監(jiān)聽(tīng)
    });

大數(shù)據(jù)渲染性能優(yōu)化

數(shù)據(jù)量大時(shí),ECharts 的渲染可能會(huì)導(dǎo)致性能瓶頸。 我們可以通過(guò)以下三種方式來(lái)達(dá)到優(yōu)化作用

  • 使用 **dataZoom**: 允許用戶縮放數(shù)據(jù)區(qū)域,減少可視數(shù)據(jù)點(diǎn)。
  • 啟用分片渲染:

series: [
  {
    type: 'line',
    large: true, // 啟用大數(shù)據(jù)優(yōu)化
    largeThreshold: 4000, // 數(shù)據(jù)量門檻
  },
];
  • 降級(jí)動(dòng)畫: 動(dòng)態(tài)數(shù)據(jù)場(chǎng)景中禁用或簡(jiǎn)化動(dòng)畫。
animation: false,
progressive: 4000, // 分步渲染
progressiveThreshold: 10000, // 數(shù)據(jù)點(diǎn)門檻

圖表配置項(xiàng)太長(zhǎng),分離配置項(xiàng)

配置項(xiàng)代碼過(guò)長(zhǎng),組件可讀性降低。我們可以將配置項(xiàng)提取到單獨(dú)的模塊,便于復(fù)用和維護(hù)。

EChart 知識(shí)點(diǎn)常考

如何初始化和銷毀 ECharts 實(shí)例?

  • echarts.init(dom) 初始化。
  • chart.dispose() 銷毀實(shí)例,避免內(nèi)存泄漏。

ECharts 常見(jiàn)配置項(xiàng)有哪些?

  • titlelegendtooltipgridxAxisyAxisseriestoolboxdataZoom

動(dòng)態(tài)數(shù)據(jù)更新

- 如何實(shí)現(xiàn)圖表數(shù)據(jù)的動(dòng)態(tài)更新?
- 如何監(jiān)聽(tīng) `props` 變化并更新圖表配置?

性能優(yōu)化

- 大數(shù)據(jù)渲染場(chǎng)景如何優(yōu)化?
- 什么是 `progressive` 渲染模式?

圖表事件

- 如何捕獲圖表點(diǎn)擊、懸停事件并執(zhí)行對(duì)應(yīng)的業(yè)務(wù)邏輯?

如何處理數(shù)據(jù)較多導(dǎo)致渲染卡頓的情況?

  • 使用數(shù)據(jù)分片渲染(progressive)。
  • 禁用動(dòng)畫。
  • 使用 dataZoom 限制顯示范圍。

如何實(shí)現(xiàn)圖表導(dǎo)出功能?

使用 toolbox.feature.saveAsImage 或通過(guò) chart.getDataURL() 獲取圖表數(shù)據(jù)并導(dǎo)出。

最后

通過(guò)對(duì) ECharts 通用屬性的深入提煉與系統(tǒng)整理,以及常用配置項(xiàng)的歸納總結(jié),我們能夠迅速實(shí)現(xiàn)圖表的搭建與展示,極大地提升了開(kāi)發(fā)效率。此外,借助豐富的 ECharts 資源和示例,我們基本上能夠滿足大部分業(yè)務(wù)場(chǎng)景的需求。這樣一來(lái),我們不僅能夠更加快捷地實(shí)現(xiàn)功能需求,還能騰出更多寶貴的時(shí)間,專注于其他重要任務(wù)。

?轉(zhuǎn)自https://www.cnblogs.com/HaiJun-Aion/p/18569547


該文章在 2025/2/8 10:54:56 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲欧美另类久久久精品能播放的 | 亚洲精品私拍国产 | 日本成人手机在线天天看片 | 精品一区二区亚洲一二三区 | 亚洲日本天堂在线 | 一级加勒比视频在线观看 |