Home  >  Article  >  Web Front-end  >  Implementation method of clicking to rotate and highlight the echarts donut chart (code)

Implementation method of clicking to rotate and highlight the echarts donut chart (code)

不言
不言Original
2018-09-14 17:30:322787browse

The content of this article is about the implementation method (code) of clicking to rotate and highlight the echarts donut chart. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

Obtain the angle of a sector by calculating the percentage of the value of a sector in the entire circle, and then set the angle at which graphics start rendering based on the startAngle attribute, so that the circle rotates when a sector is clicked. Always aim at a certain point.

During this period, considering that a certain fan-shaped area is too small to be clicked, the minimum fan-shaped area is set.

const myChartContainer = document.getElementById( 'chart' );
const myChart = echarts.init( myChartContainer );
let minAngle = 30;// 最小扇形区域为30
for ( let i = 0; i < obj.data.length; i++ ) { //某项数据为0时,最小扇形区域为0
 if ( obj.data[ i ].value === 0 ) {
  minAngle = 0;
  break;
 }
}
const pieValue = obj.data.map( v => { 
 return v.value;
} )
const sum = pieValue.reduce( ( prev, cur ) => {//数据值的总和
 return prev + cur;
}, 0 );
const sum2 = pieValue.reduce( ( prev, cur ) => {
 if ( cur < sum / 12 && cur > 0 ) {//某个值大于0小于总和的1/12即30时,按30计算和
  return prev + sum / 12;
 }
 return prev + cur;
}, 0 );
let initPieValue = pieValue[ 0 ];// 初始值
if ( initPieValue < sum / 12 && initPieValue > 0 ) {
 initPieValue = sum / 12;
}
const option = {
tooltip: {
 show: false,
 trigger: &#39;item&#39;,
 formatter: &#39;{a} <br/>{b}: {c} ({d}%)&#39;
},
legend: {
 show: false,
 orient: &#39;vertical&#39;,
 x: &#39;left&#39;
},
color: [ &#39;#44bbf8&#39;, &#39;#93e588&#39;, &#39;#ffd87b&#39;, &#39;#f88071&#39; ],
series: [
{
 name: &#39;&#39;,
 type: &#39;pie&#39;,
 radius: [ &#39;45%&#39;, &#39;79%&#39; ],
 clockWise: false,
 startAngle: 167 - ( initPieValue / sum2 * 360 / 2 ),
 minAngle: minAngle,
 avoidLabelOverlap: false,
itemStyle: {
 emphasis: {
  radius: [ &#39;46%&#39;, &#39;100%&#39; ]
 }
},
label: {
 normal: {
  show: false,
  position: &#39;center&#39;
 },
 emphasis: {
  show: false,
  textStyle: {
  fontSize: &#39;30&#39;,
  fontWeight: &#39;bold&#39;
  }
 }
},
labelLine: {
  normal: {
   show: false
  }
},
 data: obj.data
  }
 ]
};
myChart.setOption( option );
if ( minAngle === 30 ) {  //最小扇形区域30时
myChart.dispatchAction( { type: &#39;highlight&#39;, seriesIndex: 0, dataIndex: 0 } );
}
let preDataIndex = 0;
myChart.on( &#39;click&#39;, ( v ) => {
 if ( v.dataIndex === preDataIndex ) {
  myChart.dispatchAction( {
  type: &#39;highlight&#39;,
  seriesIndex: 0,
  dataIndex: v.dataIndex
 } );
 return;
}
const sum1 = pieValue.reduce( ( prev, cur, index ) => {
 if ( index < v.dataIndex ) {
  if ( cur < sum / 12 && cur > 0 ) {
   return prev + sum / 12; // 饼图的扇形最小角度设置为30,占圆的1/12
  }
  return prev + cur;
 }
 return prev;
}, 0 );
let curPieValue = pieValue[ v.dataIndex ];
if ( curPieValue < sum / 12 && curPieValue > 0 ) {
 curPieValue = sum / 12;
}
option.series[ 0 ].startAngle = 167 - ( sum1 / sum2 * 360 + curPieValue / sum2 * 360 / 2 );// 开始渲染图形的角度
myChart.setOption( option );
preDataIndex = v.dataIndex;
window.setTimeout( () => {
 myChart.dispatchAction( {
 type: &#39;highlight&#39;,
 seriesIndex: 0,
 dataIndex: v.dataIndex
 } );
}, 400 );
this.mrkName = v.data.name;
this.mrkValue = v.data.value;
} );

Related recommendations:

vue Echarts to achieve click highlighting (with code)

##vue combined with Echarts to achieve click highlighting Example of bright effect

The above is the detailed content of Implementation method of clicking to rotate and highlight the echarts donut chart (code). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn