vue使用highcharts自定義儀表盤圖表
使用highchart圖表框架實現(xiàn)一個自定義的類似下圖的圖表,供大家參考,具體內(nèi)容如下

1. 原理
實際上就是4個餅圖疊起來(可以這么理解),中間一個完整的圓和三個大小不一的圓圈
2. 技術(shù)點
使用的是highchart中的Highstock
圖表類型是solidgauge
因為餅圖不支持陰影效果(可能是我沒找到),所以上圖中帶的一點類似陰影的效果,看起來有一點點立體的感覺用的是徑向漸變屬性來實現(xiàn)的
其中用到了圖表的時間屬性:鼠標(biāo)移出和移入事件
數(shù)據(jù)標(biāo)簽字符串格式化函數(shù)
3. 實現(xiàn)
因為使用的是Highstock,所以需要引入除highchart之外的其他文件,highchart使用npm安裝,所有的文件都會下載下來,直接使用就行,項目使用的是vue,包的引入方式如下:
import Highcharts from 'highcharts'; import highchartsMore from 'highcharts/highcharts-more'; highchartsMore(Highcharts);
以下是實現(xiàn)的代碼:
const charts = {
? ? chart: {
? ? ? type: 'solidgauge',
? ? ? height: '110%',
? ? ? margin: [100, 100, 70, 100], // 設(shè)置圖表距離容器組件的上下左右的邊距
? ? ? backgroundColor: { // 背景色是線性漸變
? ? ? ? linearGradient: { x1: 0, x2: 1, y1: 0, y2: 0 }, // x1,y1是左上角的坐標(biāo)點,x2,y2是右下角的坐標(biāo)點,從左到右的漸變 x1: 0, x2: 1, y1: 0, y2: 0
? ? ? ? stops: [ // 漸變顏色的分區(qū)0是起點,1是終點
? ? ? ? ? [0, '#6EB2E5'],
? ? ? ? ? [1, '#4791CB']
? ? ? ? ]
? ? ? },
? ? ? spacingTop: 50,
? ? },
? ? title: {
? ? ? text: '已完成30家企業(yè)診斷服務(wù)',
? ? ? style: { // 圖表標(biāo)題樣式
? ? ? ? fontSize: '20px',
? ? ? ? letterSpacing: '7px',
? ? ? ? color: '#fff',
? ? ? ? textShadow: '1px 0px #fff'
? ? ? }
? ? },
? ? tooltip: {
? ? ? enabled: false, // 關(guān)閉圖表自帶的提示框?qū)傩?
? ? },
? ? pane: { // 四個圓圈的背景樣式
? ? ? startAngle: 0, // 開始的角度0
? ? ? endAngle: 360, // 結(jié)束角度360
? ? ? background: [{
? ? ? ? outerRadius: '112%', // 圓環(huán)外部圈大小
? ? ? ? innerRadius: '90%', // 圓環(huán)內(nèi)部圈大小
? ? ? ? backgroundColor: { // 因為要帶一點點立體的效果,使用了徑向漸變
? ? ? ? ? radialGradient: { cx: 0.5, cy: 0.5, r: 0.5 }, // cx,cy相對于圖形的豎直和水平位置,r時漸變的半徑
? ? ? ? ? stops: [
? ? ? ? ? ? [0, '#aaa'],
? ? ? ? ? ? [1, '#fff']
? ? ? ? ? ]
? ? ? ? },
? ? ? ? borderWidth: 0,
? ? ? ? borderColor: '#C3CCDA',
? ? ? ? className: 'boxshadow' // 可以給每一個面板綁定一個自定義的class
? ? ? }, {
? ? ? ? outerRadius: '90%',
? ? ? ? innerRadius: '68%',
? ? ? ? backgroundColor: {
? ? ? ? ? radialGradient: { cx: 0.5, cy: 0.5, r: 0.5 },
? ? ? ? ? stops: [
? ? ? ? ? ? [0, '#aaa'],
? ? ? ? ? ? [1, '#fff']
? ? ? ? ? ]
? ? ? ? },
? ? ? ? borderWidth: 0,
? ? ? ? borderColor: '#C3CCDA',
? ? ? ? className: 'boxshadow'
? ? ? }, {
? ? ? ? outerRadius: '68%',
? ? ? ? innerRadius: '35%',
? ? ? ? backgroundColor: {
? ? ? ? ? radialGradient: { cx: 0.5, cy: 0.5, r: 0.4 },
? ? ? ? ? stops: [
? ? ? ? ? ? [0, '#999'],
? ? ? ? ? ? [1, '#fff']
? ? ? ? ? ]
? ? ? ? },
? ? ? ? borderWidth: 0,
? ? ? ? borderColor: '#C3CCDA'
? ? ? }, {
? ? ? ? outerRadius: '35%',
? ? ? ? innerRadius: '0',
? ? ? ? backgroundColor: {
? ? ? ? ? radialGradient: { cx: 0.5, cy: 0.5, r: 0.5 },
? ? ? ? ? stops: [
? ? ? ? ? ? [0, '#FFFFFF'],
? ? ? ? ? ? [0.5, '#F7FBFF'],
? ? ? ? ? ? [1, '#CEE7FF']
? ? ? ? ? ]
? ? ? ? },
? ? ? ? borderWidth: 0,
? ? ? }]
? ? },
? ? credits: {
? ? ? enabled: false, // 關(guān)閉版權(quán)標(biāo)志
? ? },
? ? yAxis: {
? ? ? min: 0, // 圓環(huán)y值的最小值
? ? ? max: 100, // 圓環(huán)y值得最大值
? ? ? lineWidth: 0,
? ? ? tickPositions: [] // 關(guān)閉刻度
? ? },
? ? plotOptions: {
? ? ? solidgauge: {
? ? ? ? dataLabels: { // 設(shè)置圖表的標(biāo)簽樣式
? ? ? ? ? enabled: true,
? ? ? ? ? style: {
? ? ? ? ? ? fontSize: '16px',
? ? ? ? ? ? textOutline: 'none',
? ? ? ? ? ? color: '#fff',
? ? ? ? ? ? letterSpacing: '1px'
? ? ? ? ? }
? ? ? ? },
? ? ? ? linecap: 'square', // ?帶顏色部分的的圓環(huán)邊角是矩形或者圓形
? ? ? ? stickyTracking: false,
? ? ? ? rounded: false,
? ? ? ? cursor: 'pointer', // 鼠標(biāo)選中樣式
? ? ? }
? ? },
? ? colors: ['#7CB5EC', '#FF5184', '#76DDFB'],
? ? series: [{
? ? ? name: '智能化',
? ? ? data: [{
? ? ? ? color: {
? ? ? ? ? radialGradient: { cx: 0.5, cy: 0.5, r: 0.5 },
? ? ? ? ? stops: [
? ? ? ? ? ? [0, '#000'],
? ? ? ? ? ? [1, '#FF5184']
? ? ? ? ? ]
? ? ? ? },
? ? ? ? radius: '112%',
? ? ? ? innerRadius: '90%',
? ? ? ? y: 80,
? ? ? ? dataLabels: {
? ? ? ? ? borderWidth: 0,
? ? ? ? ? color: '#616C80',
? ? ? ? ? enabled: true,
? ? ? ? ? formatter: function () {
? ? ? ? ? ? return `<span style="color:#FF5184">${this.series.name}</span>` + '<span style="color: #fff;">:' + ((this.y / (80+65+50)) * 100).toFixed(2) + '%</span>';
? ? ? ? ? },
? ? ? ? ? x: -80,
? ? ? ? ? y: -170, // 自定義數(shù)據(jù)標(biāo)簽的位置
? ? ? ? },
? ? ? ? events: { // 鼠標(biāo)事件,鼠標(biāo)移出或移入時圓環(huán)大小變化
? ? ? ? ? mouseOver: function () {
? ? ? ? ? ? this.update({
? ? ? ? ? ? ? radius: '120%',
? ? ? ? ? ? });
? ? ? ? ? },
? ? ? ? ? mouseOut: function () {
? ? ? ? ? ? this.update({
? ? ? ? ? ? ? radius: '112%',
? ? ? ? ? ? });
? ? ? ? ? },
? ? ? ? },
? ? ? }]
? ? }, {
? ? ? name: '信息化',
? ? ? data: [{
? ? ? ? color: {
? ? ? ? ? radialGradient: { cx: 0.5, cy: 0.5, r: 0.5 },
? ? ? ? ? stops: [
? ? ? ? ? ? [0, '#333'],
? ? ? ? ? ? [1, '#FFB958']
? ? ? ? ? ]
? ? ? ? },
? ? ? ? radius: '90%',
? ? ? ? innerRadius: '68%',
? ? ? ? y: 65,
? ? ? ? dataLabels: {
? ? ? ? ? borderWidth: 0,
? ? ? ? ? color: '#616C80',
? ? ? ? ? enabled: true,
? ? ? ? ? formatter: function () {
? ? ? ? ? ? return `<span style="color:#FFB958">${this.series.name}</span>` + '<span style="color: #fff;">:' + ((this.y / (80+65+50)) * 100).toFixed(2) + '%</span>';
? ? ? ? ? },
? ? ? ? ? x: 220,
? ? ? ? ? y: -320,
? ? ? ? },
? ? ? ? events: {
? ? ? ? ? mouseOver: function () {
? ? ? ? ? ? this.update({
? ? ? ? ? ? ? radius: '98%',
? ? ? ? ? ? });
? ? ? ? ? },
? ? ? ? ? mouseOut: function () {
? ? ? ? ? ? this.update({
? ? ? ? ? ? ? radius: '90%',
? ? ? ? ? ? });
? ? ? ? ? },
? ? ? ? },
? ? ? }]
? ? }, {
? ? ? name: '綠色化',
? ? ? data: [{
? ? ? ? color: '#6ED0F0',
? ? ? ? radius: '68%',
? ? ? ? innerRadius: '35%',
? ? ? ? y: 50,
? ? ? ? dataLabels: {
? ? ? ? ? borderWidth: 0,
? ? ? ? ? color: '#616C80',
? ? ? ? ? enabled: true,
? ? ? ? ? formatter: function () {
? ? ? ? ? ? return `<span style="color:${this.color}">${this.series.name}</span>` + '<span style="color: #fff;">:' + ((this.y / (80+65+50)) * 100).toFixed(2) + '%</span>';
? ? ? ? ? },
? ? ? ? ? x: -200,
? ? ? ? ? y: -320,
? ? ? ? },
? ? ? ? events: {
? ? ? ? ? mouseOver: function () {
? ? ? ? ? ? this.update({
? ? ? ? ? ? ? radius: '76%',
? ? ? ? ? ? });
? ? ? ? ? },
? ? ? ? ? mouseOut: function () {
? ? ? ? ? ? this.update({
? ? ? ? ? ? ? radius: '68%',
? ? ? ? ? ? });
? ? ? ? ? },
? ? ? ? },
? ? ? }]
? ? }, { // 中間名字的圓,沒有數(shù)據(jù),只有一個顯示
? ? ? name: '滎陽市',
? ? ? data: [{
? ? ? ? color: '#6ED0F0',
? ? ? ? radius: '35%',
? ? ? ? innerRadius: '0',
? ? ? ? y: 0,
? ? ? ? dataLabels: {
? ? ? ? ? borderWidth: 0,
? ? ? ? ? color: '#616C80',
? ? ? ? ? enabled: true,
? ? ? ? ? formatter: function () {
? ? ? ? ? ? return `滎陽市`;
? ? ? ? ? },
? ? ? ? ? x: 0,
? ? ? ? ? y: -12,
? ? ? ? }
? ? ? }]
? ? }]
};4. 問題
代碼重復(fù)較多,但暫時還沒找到更好的方法在一個統(tǒng)一的地方寫,會再優(yōu)化
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
axios請求中以params或body形式傳遞參數(shù)的區(qū)別淺析
最近在做自己項目中,做一個非常簡單的新增用戶場景,但是使用原生axios發(fā)送post請求的時候,還是踩了不少坑的,下面這篇文章主要給大家介紹了關(guān)于axios請求中以params或body形式傳遞參數(shù)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-04-04
nuxt 自定義 auth 中間件實現(xiàn)令牌的持久化操作
這篇文章主要介紹了nuxt 自定義 auth 中間件實現(xiàn)令牌的持久化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
詳解基于iview-ui的導(dǎo)航欄路徑(面包屑)配置
這篇文章主要介紹了詳解基于iview-ui的導(dǎo)航欄路徑(面包屑)配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
Vue向下滾動加載更多數(shù)據(jù)scroll案例詳解
這篇文章主要介紹了Vue向下滾動加載更多數(shù)據(jù)scroll案例詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
VSCode Vue開發(fā)推薦插件和VSCode快捷鍵(小結(jié))
這篇文章主要介紹了VSCode Vue開發(fā)推薦插件和VSCode快捷鍵(小結(jié)),文中通過圖文表格介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

