vue+highcharts實現(xiàn)3D餅圖效果
更新時間:2022年03月28日 08:40:41 作者:A孫大壯
這篇文章主要為大家詳細(xì)介紹了vue+highcharts實現(xiàn)3D餅圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了vue+highcharts實現(xiàn)3D餅圖效果的具體代碼,供大家參考,具體內(nèi)容如下
這是最終效果
<template> <div class="big-box"> ? <div class="com-container" ref="container" style="width:380px;height:300px;"> ? </div> ? <div class="tulibox"> ? ? <div v-for="(item,index) in peiData" :key="index" class="tuliboxitem"> ? ? ? <span class="name">{{item.name}}</span> ? <span class="value">{{item.y}}%</span> ? ? </div> ? </div> </div> </template> <script> import HighCharts from 'highcharts' export default { ? props: {}, ? data () { ? ? return { ? ? ? peiData: [ ? ? ? ? { name: '輸電', y: 28, h: 60 }, ? ? ? ? { name: '變電', y: 20, h: 20 }, ? ? ? ? { name: '配電', y: 10, h: 32 }, ? ? ? ? { name: '新業(yè)務(wù)', y: 6, h: 45 } ? ? ? ] ? ? } ? }, ? computed: {}, ? updated () {}, ? created () {}, ? mounted () { ? ? this.initChart() ? ? const that = this ? ? window.onresize = function () { that.initChart() } ? }, ? methods: { ? ? initChart () { ? ? ? // 修改3d餅圖繪制過程 ? ? ? const each = HighCharts.each ? ? ? const round = Math.round ? ? ? const cos = Math.cos ? ? ? const sin = Math.sin ? ? ? const deg2rad = Math.deg2rad ? ? ? HighCharts.wrap(HighCharts.seriesTypes.pie.prototype, 'translate', function (proceed) { ? ? ? ? proceed.apply(this, [].slice.call(arguments, 1)) ? ? ? ? // Do not do this if the chart is not 3D ? ? ? ? if (!this.chart.is3d()) { ? ? ? ? ? return ? ? ? ? } ? ? ? ? const series = this ? ? ? ? const chart = series.chart ? ? ? ? const options = chart.options ? ? ? ? const seriesOptions = series.options ? ? ? ? const depth = seriesOptions.depth || 0 ? ? ? ? const options3d = options.chart.options3d ? ? ? ? const alpha = options3d.alpha ? ? ? ? const beta = options3d.beta ? ? ? ? var z = seriesOptions.stacking ? (seriesOptions.stack || 0) * depth : series._i * depth ? ? ? ? z += depth / 2 ? ? ? ? if (seriesOptions.grouping !== false) { ? ? ? ? ? z = 0 ? ? ? ? } ? ? ? ? each(series.data, function (point) { ? ? ? ? ? const shapeArgs = point.shapeArgs ? ? ? ? ? var angle ? ? ? ? ? point.shapeType = 'arc3d' ? ? ? ? ? var ran = point.options.h ? ? ? ? ? shapeArgs.z = z ? ? ? ? ? shapeArgs.depth = depth * 0.75 + ran ? ? ? ? ? shapeArgs.alpha = alpha ? ? ? ? ? shapeArgs.beta = beta ? ? ? ? ? shapeArgs.center = series.center ? ? ? ? ? shapeArgs.ran = ran ? ? ? ? ? angle = (shapeArgs.end + shapeArgs.start) / 2 ? ? ? ? ? point.slicedTranslation = { ? ? ? ? ? ? translateX: round(cos(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)), ? ? ? ? ? ? translateY: round(sin(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)) ? ? ? ? ? } ? ? ? ? }) ? ? ? }); ? ? ? (function (H) { ? ? ? ? H.wrap(HighCharts.SVGRenderer.prototype, 'arc3dPath', function (proceed) { ? ? ? ? // Run original proceed method ? ? ? ? ? const ret = proceed.apply(this, [].slice.call(arguments, 1)) ? ? ? ? ? ret.zTop = (ret.zOut + 0.5) / 100 ? ? ? ? ? return ret ? ? ? ? }) ? ? ? }(HighCharts)) ? ? ? // 生成不同高度的3d餅圖 ? ? ? const highEcharts = this.$refs.container ? ? ? HighCharts.chart(highEcharts, { ? ? ? ? chart: { ? ? ? ? ? type: 'pie', ? ? ? ? ? animation: false, ? ? ? ? ? backgroundColor: 'rgba(0,0,0,0)', ? ? ? ? ? events: { ? ? ? ? ? ? load: function () { ? ? ? ? ? ? ? const each = HighCharts.each ? ? ? ? ? ? ? const points = this.series[0].points ? ? ? ? ? ? ? each(points, function (p, i) { ? ? ? ? ? ? ? ? p.graphic.attr({ ? ? ? ? ? ? ? ? ? translateY: -p.shapeArgs.ran ? ? ? ? ? ? ? ? }) ? ? ? ? ? ? ? ? p.graphic.side1.attr({ ? ? ? ? ? ? ? ? ? translateY: -p.shapeArgs.ran ? ? ? ? ? ? ? ? }) ? ? ? ? ? ? ? ? p.graphic.side2.attr({ ? ? ? ? ? ? ? ? ? translateY: -p.shapeArgs.ran ? ? ? ? ? ? ? ? }) ? ? ? ? ? ? ? }) ? ? ? ? ? ? } ? ? ? ? ? }, ? ? ? ? ? options3d: { ? ? ? ? ? ? enabled: true, ? ? ? ? ? ? alpha: 65 ? ? ? ? ? } ? ? ? ? }, ? ? ? ? title: { ? ? ? ? ? show: 'false', ? ? ? ? ? text: null ? ? ? ? }, ? ? ? ? subtitle: { ? ? ? ? ? text: null ? ? ? ? }, ? ? ? ? credits: { ? ? ? ? ? enabled: false ? ? ? ? }, ? ? ? ? legend: { // 【圖例】位置樣式 ? ? ? ? ? backgroundColor: 'rgba(0,0,0,0)', ? ? ? ? ? shadow: false, ? ? ? ? ? layout: 'vertical', ? ? ? ? ? align: 'right', // 水平方向位置 ? ? ? ? ? verticalAlign: 'top', // 垂直方向位置 ? ? ? ? ? x: 0, // 距離x軸的距離 ? ? ? ? ? y: 100, // 距離Y軸的距離 ? ? ? ? ? symbolPadding: 10, ? ? ? ? ? symbolHeight: 14, ? ? ? ? ? itemStyle: { ? ? ? ? ? ? lineHeight: '24px', ? ? ? ? ? ? fontSize: '16px', ? ? ? ? ? ? color: '#fff' ? ? ? ? ? }, ? ? ? ? ? labelFormatter: function () { ? ? ? ? ? ? /* ? ? ? ? ? ? * ?格式化函數(shù)可用的變量:this, 可以用 console.log(this) 來查看包含的詳細(xì)信息 ? ? ? ? ? ? * ?this 代表當(dāng)前數(shù)據(jù)列對象,所以默認(rèn)的實現(xiàn)是 return this.name ? ? ? ? ? ? */ ? ? ? ? ? ? return this.name + this.h + '%' ? ? ? ? ? } ? ? ? ? }, ? ? ? ? plotOptions: { ? ? ? ? ? pie: { ? ? ? ? ? ? allowPointSelect: true, ? ? ? ? ? ? cursor: 'pointer', ? ? ? ? ? ? depth: 35, ? ? ? ? ? ? innerSize: 180, ? ? ? ? ? ? dataLabels: { ? ? ? ? ? ? ? enabled: false ? ? ? ? ? ? }, ? ? ? ? ? ? // 顯示圖例 ? ? ? ? ? ? showInLegend: false ? ? ? ? ? } ? ? ? ? }, ? ? ? ? series: [{ ? ? ? ? ? type: 'pie', ? ? ? ? ? name: '占比', ? ? ? ? ? // h 是高度 ?y是占的圓環(huán)長度 ? ? ? ? ? colorByPoint: true, ? ? ? ? ? colors: [ ? ? ? ? ? ? { // 注意?。?!如果是柱狀圖請使用color,如果是面積圖請使用fillColor ? ? ? ? ? ? ? linearGradient: { ? ? ? ? ? ? ? ? x1: 0, ? ? ? ? ? ? ? ? y1: 1, ? ? ? ? ? ? ? ? x2: 1, ? ? ? ? ? ? ? ? y2: 0 ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? stops: [ ? ? ? ? ? ? ? ? [0, '#19596d'], ? ? ? ? ? ? ? ? [1, '#2ea1b2'] ? ? ? ? ? ? ? ] ? ? ? ? ? ? }, { // 注意!?。∪绻侵鶢顖D請使用color,如果是面積圖請使用fillColor ? ? ? ? ? ? ? linearGradient: { ? ? ? ? ? ? ? ? x1: 0, ? ? ? ? ? ? ? ? y1: 1, ? ? ? ? ? ? ? ? x2: 1, ? ? ? ? ? ? ? ? y2: 0 ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? stops: [ ? ? ? ? ? ? ? ? [0, '#ee7529'], ? ? ? ? ? ? ? ? [1, '#f5a86c'] ? ? ? ? ? ? ? ] ? ? ? ? ? ? }, { // 注意?。?!如果是柱狀圖請使用color,如果是面積圖請使用fillColor ? ? ? ? ? ? ? linearGradient: { ? ? ? ? ? ? ? ? x1: 0, ? ? ? ? ? ? ? ? y1: 1, ? ? ? ? ? ? ? ? x2: 1, ? ? ? ? ? ? ? ? y2: 0 ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? stops: [ ? ? ? ? ? ? ? ? [0, '#f5c055'], ? ? ? ? ? ? ? ? [1, '#967b3d'] ? ? ? ? ? ? ? ] ? ? ? ? ? ? }, { // 注意?。。∪绻侵鶢顖D請使用color,如果是面積圖請使用fillColor ? ? ? ? ? ? ? linearGradient: { ? ? ? ? ? ? ? ? x1: 0, ? ? ? ? ? ? ? ? y1: 1, ? ? ? ? ? ? ? ? x2: 1, ? ? ? ? ? ? ? ? y2: 0 ? ? ? ? ? ? ? }, ? ? ? ? ? ? ? stops: [ ? ? ? ? ? ? ? ? [0, '#2d7bb5'], ? ? ? ? ? ? ? ? [1, '#1a5784'] ? ? ? ? ? ? ? ] ? ? ? ? ? ? }], ? ? ? ? ? data: this.peiData ? ? ? ? }] ? ? ? }) ? ? } ? }, ? components: {} } </script> <style scoped lang="less"> .com-container{ ? ? width: 380px; ? ? height: 300px; ? ? padding-right: 20px; } .big-box{ ? ? display: flex; ? ? background-image: url('../img/dizuo.png'); ? ? background-repeat: no-repeat; ? ? background-position: 25px 144px; ? ? padding-top: 20px; } .tulibox{ ? padding-top: 65px; ? .tuliboxitem{ ? ? position: relative; ? ? margin: 10px 0; ? ? .name{ ? ? ? font-size: 18px; ? ? ? color: #FEFEFF; ? ? ? padding-right: 20px; ? ? } ? ? .value{ ? ? ? font-size: 22px; ? ? ? color: #0CD2EA; ? ? } ? } ? .tuliboxitem::before{ ? ? ?content: ""; ? ? ?position: absolute; ? ? ?width: 16px; ? ? height: 16px; ? ? top: 7px; ? ? border-radius: 50%; ? ? left: -33px; ? } ? .tuliboxitem:nth-child(1)::before{ ? ? ? background-color: #fff600; ? } ? .tuliboxitem:nth-child(2)::before{ ? ? ? background-color: #209FED; ? } ? .tuliboxitem:nth-child(3)::before{ ? ? ? background-color: #808EC7; ? } ? .tuliboxitem:nth-child(4)::before{ ? ? ? background-color: #EE6B26; ? } } </style>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue3+element-plus?Dialog對話框的使用與setup?寫法的用法
這篇文章主要介紹了vue3+element-plus?Dialog對話框的使用?與?setup?寫法的使用,本文通過兩種方式結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04在Vue中實現(xiàn)網(wǎng)頁截圖與截屏功能詳解
在Web開發(fā)中,有時候需要對網(wǎng)頁進(jìn)行截圖或截屏,Vue作為一個流行的JavaScript框架,提供了一些工具和庫,可以方便地實現(xiàn)網(wǎng)頁截圖和截屏功能,本文將介紹如何在Vue中進(jìn)行網(wǎng)頁截圖和截屏,需要的朋友可以參考下2023-06-06詳解用webpack2.0構(gòu)建vue2.0超詳細(xì)精簡版
本篇文章主要介紹了詳解用webpack2.0構(gòu)建vue2.0超詳細(xì)精簡版,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04在Vue3中使用vue-qrcode庫實現(xiàn)二維碼生成的方法
在Vue3中實現(xiàn)二維碼生成需要使用第三方庫來處理生成二維碼的邏輯,常用的庫有 qrcode和 vue-qrcode,這篇文章主要介紹了在Vue3中使用vue-qrcode庫實現(xiàn)二維碼生成,需要的朋友可以參考下2023-12-12