Vue3 Echarts 3D圓形柱狀圖實現教程以及封裝一個可復用的組件

文章目錄

  • 前言
  • 一、實現原理
  • 二、series ——type: "pictorialBar" 簡介
    • 2.1 常用屬性
  • 三、代碼實戰
    • 3.1 封裝一個echarts通用組件 echarts.vue
    • 3.2 首先實現一個基礎柱狀圖
    • 3.3 添加上下2個橢圓面
    • 3.4 進階封裝一個可復用的3D圓形柱狀圖組件
  • 總結


前言

在前端開發的數據可視化場景中,ECharts 是一個強大且靈活的工具,它能創建各種復雜而美觀的圖表。本文將詳細闡述如何利用 ECharts實現3D圓形柱狀圖,并封裝一個可復用的組件。

在這里插入圖片描述


一、實現原理

3D圓形柱狀圖實現原理很簡單,可以看成普通的柱狀圖+上下兩個圓面組合合成。模擬人眼斜俯視視角,上下兩個面呈現橢圓形,再把普通柱狀圖調成一定透明度使得底部圓面也能被看到,從而把簡單2D平面呈現出一定3D效果。

在這里插入圖片描述
如上圖所示上下2個獨立圓面往普通柱狀圖靠,調到合適位置變成如下效果:
在這里插入圖片描述

上下兩個橢圓形可通過 echarts ——series—— type: “pictorialBar” 自定義圖形實現

二、series ——type: “pictorialBar” 簡介

type: “pictorialBar” 是 ECharts 中的一種特殊柱狀圖類型,它允許使用自定義圖形(如圖片、形狀)來代替傳統的柱狀條,為數據可視化增添更多創意和靈活性。

type: "pictorialBar"也被叫作象形柱圖。它首先是個柱狀圖,但是柱狀圖的柱子并不顯示。這些柱子我們稱為『基準柱(reference bar)』,根據基準柱來定位和顯示各種象形圖形(包括圖片)。

每個象形圖形根據基準柱的定位,是通過 symbolPosition、symbolOffset 來調整其于基準柱的相對位置。

2.1 常用屬性

  • symbol 圖形類型,默認圓形

    可選值 ‘circle’(圓形), ‘rect’(直角長方形), ‘roundRect’(圓角長方形), ‘triangle’(三角形), ‘diamond’(菱形), ‘pin’(漏斗), ‘arrow’(箭頭), ‘none’(無)

  • symbolSize 圖形的大小,默認值 [‘100%’, ‘100%’]

可以用數組分開表示寬和高,例如 [20, 10] 表示標記寬為20,高為10,也可以設置成諸如 10 這樣單一的數字,表示 [10, 10]。
可以設置成絕對值(如 10),也可以設置成百分比(如 ‘120%’、[‘55%’, 23])。

  • symbolPosition 圖形的定位位置

可選擇 start’:圖形邊緣與柱子開始的地方內切,‘end’:圖形邊緣與柱子結束的地方內切。‘center’:圖形在柱子里居中。

  • symbolOffset 圖形相對于原本位置的偏移,默認[0, 0]

  • data 系列中的數據內容數組。數組項通常為具體的數據項。

更多屬性可以查閱官方文檔

本例需求通過上面幾個屬性我們就能構建一個橢圓形面

例如:

 {type: "pictorialBar",symbolSize: [50, 22],//50x22尺寸symbolOffset: [0, -8],//向上偏移8pxsymbolPosition:'end',//位于頂部}

三、代碼實戰

以vue3為代碼為示例

3.1 封裝一個echarts通用組件 echarts.vue

echarts.vue

<template><div class="echarts-box"><div ref="echartRef" class="charts" ></div></div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount, watch, nextTick, markRaw } from 'vue';
import * as echarts from 'echarts';
const props = defineProps({// 圖表配置data: {type: Object,default: () => {},},
});
const echartRef = ref();let dom = null;//設置圖表配置
const setOptions = (options) => {//清除畫布dom && dom.clear();//重新渲染dom && dom.setOption(options);
};watch(() => props.data,(val) => {nextTick(() => {//默認關閉動畫setOptions({animation: false,...val});});},{ deep: true, immediate: true }
);
const emits= defineEmits(['click'])
onMounted(() => {//初始化dom = markRaw(echarts.init(echartRef.value));//點擊事件dom.on('click',  (param)=> {emits('click',param)} )
});
onBeforeUnmount(() => {//離開銷毀echarts.dispose(dom);dom = null;
});defineExpose({setOptions,
});
</script>
<style lang="scss" scoped>
.echarts-box {width: 100%;height: 100%;box-sizing: border-box;
}.charts {width: 100%;height: 100%;
}
</style>

上述代碼封裝了一個echarts通用組件,只需傳入data圖表配置數據就會重新渲染,需要注意的是組件默認繼承父元素的寬高(100%),所以父元素需要設置尺寸。

3.2 首先實現一個基礎柱狀圖

demo.vue

<template><div class="container"><div class="echarts-view"><Echarts :data="data" /></div></div>
</template>
<script setup>
import Echarts from "./echarts.vue";
import { ref } from "vue";const data = ref({//位置grid: {left: "5%",right: "5%",bottom: "10%",top: "15%",},//提示框tooltip: {},//圖例legend: {show: true,right: "5%",textStyle: {color: "#fff",fontSize: 14,},},//x軸xAxis: {type: "category",//坐標軸軸線axisLine: {show: true,lineStyle: {color: "rgba(0, 176, 255,0.3)",},},//刻度axisTick: {show: false,},//分割線splitLine: {show: false,},// x軸文字axisLabel: {color: "#D8E6FF",fontSize: 14,margin: 15,},data: ["星期一","星期二","星期三","星期四","星期五","星期六","星期日",],},//y軸yAxis: {name: "單位:元", //單位文字nameTextStyle: {//單位樣式color: "#BCD0F4",nameLocation: "start",fontSize: 14,},nameGap: 40, //單位與y軸距離type: "value",//分割線splitLine: {show: true,lineStyle: {color: "rgba(0, 176, 255, 0.2)",type: "dashed",},},//坐標軸軸線axisLine: {show: false,},//刻度數值文字樣式axisLabel: {color: "#BCD0F4",fontSize: 14,},},//數據series: [//中間柱狀圖{type: "bar",barWidth: 50, //柱子寬度itemStyle: {//柱子樣式color: {//漸變顏色type: "linear",x: 0,y: 0,x2: 0,y2: 1,colorStops: [{ offset: 0, color: "#00B7FF" },{ offset: 1, color: "rgba(34,68,172,0.3)" },],},},name: "收入",data: [200, 500, 300, 250, 360, 700, 556],},],
});
</script>
<style scoped>
.container {width: 100%;height: 100%;display: flex;flex-direction: column;justify-content: center;background-color: #0a2270;align-items: center;
}
.echarts-view {height: 700px;width: 1200px;
}
</style>

運行效果:

在這里插入圖片描述

上述代碼渲染一個最基礎的柱狀圖

3.3 添加上下2個橢圓面

新增如下代碼

//數據series:[//中間柱狀圖............//頂部圓面{type: "pictorialBar",symbolSize: [50, 22],symbolOffset: [0, -8],symbolPosition: "end",z: 12,//層級itemStyle: {color:'#21F3FF',},name: "收入",data: [200, 500, 300, 250, 360, 700, 556],},//底部圓面{type: "pictorialBar",symbolSize: [50, 22],symbolOffset: [0, 8],z: 12,//層級itemStyle: {color: 'rgba(31,97,234,0.4)',},name: "收入",data: [200, 500, 300, 250, 360, 700, 556],}]

運行效果:
在這里插入圖片描述

上述代碼通過象形柱狀圖自定義2個橢圓面,其中一個橢圓面通過symbolPosition: "end"設置為頂部顯示另一個默認顯示在底部,并通過symbolOffset調整橢圓面位置偏移量使得與基礎柱狀圖融合為一體。

3.4 進階封裝一個可復用的3D圓形柱狀圖組件

bar-3d.vue

<!-- 3D柱狀圖 -->
<template><div class="bar-wrap"><Echarts :data="data" /></div>
</template><script setup>
import Echarts from "../components/echarts.vue";
import { computed } from "vue";
const props = defineProps({
//位置grid: {type: Object,default: () => ({left: "5%",right: "5%",bottom: "10%",top: "15%",}),},//圖例legend:{type: Object,default: () => {},},//數據series: {type: Object,default: () => {},},//x軸配置xAxis: {type: Array,default: () => {},},//y軸配置yAxis: {type: Object,default: () => {},},//單位unit: {type: String,default: "",},//上下圓面顏色pictorialBarColor: {type: Array,default: () => ["#21F3FF", "rgba(31,97,234,0.4)"],},
});//echarts配置
const data = computed(() => {let { name, data } = props.series;//series配置處理let seriesData = [//中間柱狀圖{type: "bar",barWidth: 50, //柱子寬度itemStyle: {//柱子樣式color: {//漸變顏色type: "linear",x: 0,y: 0,x2: 0,y2: 1,colorStops: [{ offset: 0, color: "#00B7FF" },{ offset: 1, color: "rgba(34,68,172,0.3)" },],},},...props.series,},//頂部圓面{type: "pictorialBar",symbolSize: [50, 22],symbolOffset: [0, -8],symbolPosition:'end',z: 12,itemStyle: {color: props.pictorialBarColor[0],},name,data: data.map((item) => {return {value: item,itemStyle: {opacity: item > 0 ? 1 : 0, //值為0時隱藏},};}),},//底部圓面{type: "pictorialBar",symbolSize: [50, 22],symbolOffset: [0, 8],z: 12,itemStyle: {color: props.pictorialBarColor[1],},name,data: data.map((item) => {return {value: item,itemStyle: {opacity: item > 0 ? 1 : 0,},};}),},];return {grid: props.grid,tooltip: {},legend: {show: true,right: "5%",textStyle: {color: "#fff",fontSize: 14,},...props.legend},//x軸xAxis: {type: "category",axisLine: {show: true,lineStyle: {color: "rgba(0, 176, 255,0.3)",},},axisTick: {show: false,},splitLine: {show: false,},// x軸文字axisLabel: {color: "#D8E6FF",fontSize: 14,margin: 15,},data: props.xAxis,},//y軸yAxis: {name: props.unit ? `單位:${props.unit}` : "", //單位文字nameTextStyle: {//單位樣式color: "#BCD0F4",nameLocation: "start",fontSize: 14,},nameGap: 40, //單位與y軸距離type: "value",splitLine: {show: true,lineStyle: {color: "rgba(0, 176, 255, 0.2)",type: "dashed",},},axisLine: {show: false,},//刻度數值樣式axisLabel: {color: "#BCD0F4",fontSize: 14,},...props.yAxis,},series: seriesData,};
});
</script>
<style scoped lang="scss">
.bar-wrap {width: 100%;height: 100%;
}
</style>

上述代碼封裝了一個3D圓形柱狀圖組件,預設了默認樣式,同時也暴露了x軸、y軸、圖例、圓形柱狀圖顏色等配置屬性可根據需求自定義進行樣式覆蓋。

頁面調用:

demo.vue

<template><div class="container"><div class="echarts-view"><Bar3D unit="元" :xAxis="xAxisData" :series="seriesData" /></div></div>
</template>
<script setup>
import Bar3D from "./components/bar-3d.vue";
import { ref } from "vue";//x軸標簽
const xAxisData = ref(["星期一","星期二","星期三","星期四","星期五","星期六","星期日",
]);//數據
const seriesData = ref({name: "收入",data: [200, 500, 300, 250, 360, 700, 556],
});</script>
<style scoped>
.container {width: 100%;height: 100%;display: flex;flex-direction: column;justify-content: center;background-color: #0a2270;align-items: center;
}
.echarts-view {height: 700px;width: 1200px;
}
</style>

運行效果:
在這里插入圖片描述

默認漸變色樣式

修改圓柱配色

<template><div class="container"><div class="echarts-view"><Bar3D unit="元" :xAxis="xAxisData" :series="seriesData" :pictorialBarColor="pictorialBarColor"/></div></div>
</template>
<script setup>
import Bar3D from "./bar-3d.vue";
import { ref } from "vue";//x軸標簽
const xAxisData = ref(["星期一","星期二","星期三","星期四","星期五","星期六","星期日",
]);//數據
const seriesData = ref({name: "收入",data: [200, 500, 300, 250, 360, 700, 556],//柱狀圖顏色itemStyle: {color: "#14b1eb",opacity: 0.7,},
});//上下圓面顏色
const pictorialBarColor=ref(['#14b1eb','#14b1eb'])</script>
<style scoped>
.container {width: 100%;height: 100%;display: flex;flex-direction: column;justify-content: center;background-color: #0a2270;align-items: center;
}
.echarts-view {height: 700px;width: 1200px;
}
</style>

運行效果:

在這里插入圖片描述


總結

通過組合使用 type: bar 和 type: “pictorialBar”,我們成功實現了 3D 圓形柱狀圖。同時,了解了 type: “pictorialBar” 的簡單使用,它為我們在數據可視化方面提供了更多的創意和可能性。你可以根據實際需求,進一步調整圖表的樣式和配置,創造出更加美觀和實用的可視化效果。

實際開發中可根據使用場景進階封裝,例如在echarts中加入對屏幕尺寸變化監聽改變圖表尺寸以達到不同分辨率響應式效果以及空數據的顯示優化,使得組件更加健壯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903422.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

yolov8中train、test、val

說明yolov8中train、test、val是什么意思&#xff0c;是什么作用呢&#xff1f;詳細介紹使用yolov8進行實例分割&#xff0c;我應該如何制作我的數據集呢&#xff1f; 1. YOLOv8中的train、val、test是什么意思&#xff1f;作用是什么&#xff1f; 在YOLOv8&#xff08;由Ultr…

借助Spring AI實現智能體代理模式:從理論到實踐

借助Spring AI實現智能體代理模式&#xff1a;從理論到實踐 前言 在人工智能領域&#xff0c;大語言模型&#xff08;LLM&#xff09;的應用愈發廣泛&#xff0c;如何高效構建基于LLM的系統成為眾多開發者關注的焦點。Anthropic的研究報告《構建高效代理》為我們提供了新的思…

【學習筆記】計算機操作系統(二)—— 進程的描述與控制

第二章 進程的描述與控制 文章目錄 第二章 進程的描述與控制2.1 前趨圖和程序執行2.1.1 前趨圖2.1.2 程序順序執行2.1.3 程序并發執行 2.2 進程的描述2.2.1 進程的定義和特征2.2.2 進程的基本狀態及轉換2.2.3 掛起操作和進程狀態的轉換2.2.4 進程管理中的數據結構 2.3 進程控制…

具身智能之強化學習

在具身智能&#xff08;Embodied AI&#xff09;中&#xff0c;強化學習&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;是一種非常核心的學習方法。它讓智能體&#xff08;agent&#xff09;通過與環境交互&#xff0c;不斷試錯&#xff0c;學習完成任務的策略…

go打印金字塔

需求 打印空心金字塔 解析 // * // * * // * * * // * * * *// 看成由星號、空格組成的矩形&#xff1a; // 1 1 1 0 // 2 3 2 1 // 3 5 3 2 // 4 7 4 3// 層數&#xff1a;n // 每層總元素數&#xff1a;2n-1 // 每星號數&#xff1a;n // 每層空格數&am…

C語言教程(二十二):C 語言頭文件詳解

一、頭文件的定義與形式 頭文件一般具有 .h 擴展名&#xff0c;它主要用來存放函數聲明、宏定義、結構體和共用體的定義、全局變量的聲明等內容。在C語言程序里&#xff0c;可借助 #include 預處理指令把這些頭文件包含到源文件中。 二、頭文件的作用 2.1 函數聲明 頭文件可對…

數據庫day-08

一、實驗名稱和性質 刪除修改數據 驗證 設計 二、實驗目的 1&#xff0e;掌握數據操作-- 刪除、修改&#xff1b; 三、實驗的軟硬件環境要求 硬件環境要求&#xff1a; PC機&#xff08;單機&#xff09; 使用的軟件名稱、版本號以及模塊&#xff1a; Windows 10&#x…

JAVA中Spring全局異常處理@ControllerAdvice解析

一、ControllerAdvice基礎概念 1. 什么是ControllerAdvice&#xff1f; ControllerAdvice是Spring 3.2引入的注解&#xff0c;用于定義全局控制器增強組件&#xff0c;主要功能包括&#xff1a; 全局異常處理&#xff08;最常用&#xff09;全局數據綁定全局數據預處理 2. …

開放平臺架構方案- GraphQL 詳細解釋

GraphQL 詳細解釋 GraphQL 是一種用于 API 的查詢語言&#xff0c;由 Facebook 開發并開源&#xff0c;旨在提供一種更高效、靈活且強大的數據獲取和操作方式。它與傳統的 REST API 有顯著不同&#xff0c;通過類型系統和靈活的查詢能力&#xff0c;解決了 REST 中常見的過度獲…

labview項目文件架構

為了使 LabVIEW 項目更具可擴展性和易于維護&#xff0c;合理規劃和設計項目文件結構是非常重要的。 以下是一些基于行業經驗和最佳實踐的建議&#xff1a; 1. ### 文件夾層次劃分 將不同的功能模塊分開存儲在一個清晰的分層目錄結構中是一個常見的做法。通常情況下&#xff…

Chrome的插件擴展程序安裝目錄是什么?在哪個文件夾?

目錄 前提 直接復制到瀏覽器中打開 Mac下Chrome extension 安裝路徑 最近換了mac pro用起來雖然方便&#xff0c;但是對常用的一些使用方法還是不熟悉。這不為了找到mac上chrome插件的安裝路徑在哪里&#xff0c;花費了不少時間。我想應用有不少像小編一樣剛剛使用mac的小白…

第13講:圖形尺寸與分辨率設置——適配論文版面,打造專業圖稿!

目錄 ?? 為什么這一講重要? ?? 一、先認識幾個關鍵詞 ?? 二、ggsave() 是導出圖的標準方法 ?? 三、尺寸設置技巧:對齊目標期刊 ?? 找到目標期刊的圖形欄寬 ?? 四、多個圖組合導出(與 patchwork 搭配) ?? 五、使用 Cairo / ragg 導出高質量圖 ?? 六…

2025年- H13-Lc120-189.輪轉數組(普通數組)---java版

1.題目描述 2.思路 import java.util.Arrays;public class H189 {public static void main(String[] args) {int[] newArr {1, 2, 3, 4, 5};int[] nums new int[5];System.arraycopy(newArr,0,nums,0,4);System.out.println(Arrays.toString(nums)); } }補充2&#xff1a; 3.…

機器人--相機

教程 畸變和校正 單目和雙目標定 單雙&#xff0c;rgb-d原理 單目相機 只有一個攝像頭的相機。 原理 小孔成像。 缺點 單目相機無法測量物體點的深度信。 因為物體的Z軸坐標系無法測量。 雙目相機 有兩個攝像頭的相機。 用兩個單目相機組成的雙目相機就可以測量深度信…

Go 語言入門:(一) 環境安裝

一、前言 這里不同于其他人的 Go 語言入門&#xff0c;環境安裝我向來注重配置&#xff0c;比如依賴包、緩存的默認目錄。因為前期不弄好&#xff0c;后面要整理又影響這影響那的&#xff0c;所以就干脆寫成文章&#xff0c;方便后期撿起。 二、安裝 1. 安裝包 https://go.…

筆試專題(十二)

文章目錄 主持人調度題解代碼 小紅的ABC題解代碼 不相鄰取數題解代碼 空調遙控題解代碼 主持人調度 題目鏈接 題解 1. 排序 2. 先按左端點的大小進行排序&#xff0c;保證時間是連續的&#xff0c;如果后一個點的左端點大于等于前一個點的右端點就是和法的&#xff0c;否則…

Ansible 守護 Windows 安全(Ansible Safeguards Windows Security)

Ansible 守護 Windows 安全&#xff1a;自動化基線檢查與加固 在當今網絡威脅日益嚴峻的形勢下&#xff0c;保障 Windows 系統安全至關重要。Ansible 作為一款強大的自動化運維工具&#xff0c;可通過自動化腳本實現 Windows 安全基線檢查和加固&#xff0c;大幅提升運維效率并…

深度解析 MyBatis`@TableField(typeHandler = JacksonTypeHandler.class)`:優雅處理復雜數據存儲

一、引言&#xff1a;當Java對象遇見數據庫 在現代應用開發中&#xff0c;我們經常面臨一個關鍵問題&#xff1a;如何將復雜的Java對象&#xff08;如Map、List或自定義POJO&#xff09;優雅地存儲到關系型數據庫中&#xff1f;傳統解決方案需要開發者手動進行序列化和反序列化…

【無標題】四色定理研究團隊的構建與實施路徑——跨學科建模、編程與理論拓展的全流程方案

### **四色定理研究團隊的構建與實施路徑** **——跨學科建模、編程與理論拓展的全流程方案** --- #### **一、團隊構建與核心分工** ##### **1.1 核心角色與技能需求** | **角色** | **職責** | **技能要求** …

SQLMesh增量模型實戰指南:時間范圍分區

引言 在數據工程領域&#xff0c;處理大規模數據集和高頻率數據更新是一項挑戰。SQLMesh作為一款強大的數據編排工具&#xff0c;提供了增量模型功能&#xff0c;幫助數據工程師高效地管理和更新數據。本文將詳細介紹如何使用SQLMesh創建和管理基于時間范圍的增量模型&#xf…