echarts实现多重环形图
大屏里有一个多重环形图的展示,设计图效果:

echarts没有直接实现的,参考了网上的几种方法,自己修改了一下,主要分两种: 1 环形饼图重叠 2 柱形图结合极坐标系
这篇先介绍使用环形饼图实现
两种效果图:
第一种效果代码:
<template>
<div>
<div id="chart3" />
</div>
</template>
<script setup>
import * as echarts from "echarts";
import { onMounted } from "vue";
onMounted(() => {
var myChart3 = echarts.init(document.getElementById("chart3"));
const placeItemStyle = {
label: {
show: false,
},
labelLine: {
show: false,
},
itemStyle: {
color: "#cbccd0",
},
emphasis: {
label: {
show: false,
},
labelLine: {
show: false,
},
},
};
myChart3.setOption({
title: {
text: "销售分布",
},
tooltip: {},
legend: {
data: ["一月", "二月", "三月"],
},
// yAxis: {},
series: [
{
name: "销量",
type: "pie",
radius: ["65%", "80%"],
color: ["#afdd8a", "#cbccd0"],
zlevel: 1,
hoverAnimation: false, //鼠标移入变大
data: [
{
value: 22,
name: "一月",
itemStyle: {
color: "#afdd8a",
// borderRadius: 15,
},
},
{
value: 64,
name: "",
...placeItemStyle,
},
],
},
{
name: "销量",
type: "pie",
radius: ["49%", "64%"],
color: ["#00BDAE", "#cbccd0"],
zlevel: 2,
hoverAnimation: false, //鼠标移入变大
data: [
{
value: 32,
name: "二月",
itemStyle: {
// color: '#00BDAE',
// borderRadius: 15,
},
labelLine: {
length: 45,
},
},
{
value: 54,
name: "",
...placeItemStyle,
},
],
},
{
name: "销量",
type: "pie",
radius: ["34%", "48%"],
color: ["#efb754", "#cbccd0"],
zlevel: 3,
hoverAnimation: false, //鼠标移入变大
itemStyle: {
color: "#efb754",
// borderRadius: 15,
},
data: [
{
value: 28,
name: "三月",
labelLine: {
length: 70,
},
},
{
value: 60,
name: "",
...placeItemStyle,
},
],
},
],
});
});
</script>
<style scoped>
#chart3 {
width: 500px;
height: 400px;
}
</style>
主要是将三个环形饼图叠加在一起,radius 递减就可以,配置高亮的颜色,与阴影的颜色,这里的阴影实际也是一项数据,只是不显示相关 label,看起来就像背景颜色
这里的 label 展示,正常是会被图形覆盖,可以添加 zlevel 来指定层级
如果不需要线段的尾端是圆弧型,这样就可以了,如果加上末尾的样式,borderRadius,连接处就会出现空隙,这个方法就不适用了,需要第二种实现
第二种效果代码:

<template>
<div>
<div id="chart" />
</div>
</template>
<script setup>
import * as echarts from "echarts";
import { onMounted } from "vue";
onMounted(() => {
var myChart = echarts.init(document.getElementById("chart"));
// 反向阴影效果
var placeHolderStyle = {
label: {
show: false,
position: "center",
},
labelLine: {
show: false,
},
itemStyle: {
color: "#5b5b5b",
borderColor: "#5b5b5b",
borderWidth: 10,
},
emphasis: {
disabled: true,
// label: {
// show: false,
// },
// labelLine: {
// show: false,
// },
},
};
const labelStyle = (color, length = 100) => {
return {
label: {
// show: false,
position: "outside",
formatter: "{a}: {c}",
},
labelLine: {
// show: false,
length,
smooth: 0.5,
},
itemStyle: {
borderWidth: BorderWidth,
shadowBlur: 40,
borderColor: color,
shadowColor: "rgba(0, 0, 0, 0)", //边框阴影
},
};
};
var BorderWidth = "10";
myChart.setOption({
backgroundColor: "#333",
color: ["#53f1f2", "#4ebefd", "#30ed9d", "#faa234", "#fff"],
legend: {
show: true,
orient: "vertical",
left: "left",
top: "middle",
data: ["正常", "次要", "警告", "重要", "严重"],
textStyle: {
color: "#fff",
fontSize: 16,
},
},
series: [
{
name: "正常",
type: "pie",
clockWise: false, //顺时加载
hoverAnimation: false, //鼠标移入变大
radius: [100, 101],
...labelStyle("#53f1f2", 50),
data: [
{
value: 3,
name: "",
...placeHolderStyle,
},
{
value: 7,
name: "70%",
},
],
},
{
name: "次要",
type: "pie",
clockWise: false,
hoverAnimation: false,
radius: [80, 81],
...labelStyle("#4ebefd", 60),
data: [
{
value: 4,
name: "",
...placeHolderStyle,
},
{
value: 6,
name: "60%",
},
],
},
{
name: "警告",
type: "pie",
clockWise: false,
hoverAnimation: false,
radius: [60, 61],
...labelStyle("#30ed9d", 70),
data: [
{
value: 5,
name: "",
...placeHolderStyle,
},
{
value: 5,
name: "40%",
},
],
},
{
name: "重要",
type: "pie",
clockWise: false,
hoverAnimation: false,
radius: [40, 41],
...labelStyle("#faa234", 90),
data: [
{
value: 7,
name: "",
...placeHolderStyle,
},
{
value: 3,
name: "30%",
},
],
},
{
name: "严重",
type: "pie",
clockWise: false,
hoverAnimation: false,
radius: [20, 21],
...labelStyle("#fff"),
labelLine: {
lineStyle: {
color: "#fff",
},
length: 100,
smooth: 0.5,
},
data: [
{
value: 6,
name: "",
...placeHolderStyle,
},
{
value: 4,
name: "30%",
},
],
},
],
});
});
</script>
<style scoped>
#chart {
width: 500px;
height: 400px;
}
</style>
这种也是将环形饼图叠加,但是不一样的是使用的是 border,radius 的宽度间距仅设置为 1;因为饼图的 border 默认是有圆角的,这样就解决了圆角的问题
这里要注意后一个数据的圆弧会覆盖前一个,所以这里的数据 data 顺序要换一下,可以通过 clockWise:false,逆时针放置饼图的扇区
总的来说,这种实现效果是最好的
使用极坐标+柱图实现多层环形图, 单独写了一篇https://www.cnblogs.com/steamed-twisted-roll/p/16919329.html

浙公网安备 33010602011771号