echarts——饼图

在这里插入图片描述

需求:三级分类的饼图

  • 1、一级分类通过左右箭头切换的方式展现
  • 2、二级分类通过饼图的形式展现(默认不显示每块区域name,高亮时候显示name)
  • 3、三级分类通过鼠标放在饼图某一区域上时以文字的形式呈现(自定义提示文字)
<template>
  <div class="w100 h100">
    <!-- 左右切换箭头及一级分类名字 -->
    <div>
      <div class="title">{{ pieData[index].name }}</div>
      <div v-if="index > 0" @click="onLeft" class="left"></div>
      <div v-if="index < pieData.length - 1" @click="onRight" class="right"></div>
    </div>
    <div ref="pie" class="w100 h100"></div>
  </div>
</template>

<script>
import { ququ } from "../../public/static/theme/ququ";
export default {
  data() {
    return {
      size: null, //基准字体大小——控制标题和图例的大小
      pieChart: null,
      pieData: [
        {
          name: "服装",
          children: [
            {
              name: "上衣",
              value: 100,
              children: [
                {
                  name: "男士",
                  value: 10,
                },
                {
                  name: "女士",
                  value: 30,
                },
              ],
            },
            {
              name: "裤子",
              value: 210,
              children: [
                {
                  name: "男士",
                  value: 10,
                },
                {
                  name: "女士",
                  value: 30,
                },
              ],
            },
            {
              name: "裙子",
              value: 400,
              children: [
                {
                  name: "男士",
                  value: 10,
                },
                {
                  name: "女士",
                  value: 30,
                },
              ],
            },
            {
              name: "棒球服",
              value: 233,
              children: [
                {
                  name: "男士",
                  value: 10,
                },
                {
                  name: "女士",
                  value: 30,
                },
              ],
            },
            {
              name: "羽绒服",
              value: 280,
              children: [
                {
                  name: "男士",
                  value: 10,
                },
                {
                  name: "女士",
                  value: 30,
                },
              ],
            },
          ],
        },
        {
          name: "手机",
          children: [
            {
              name: "apple",
              value: 220,
              children: [
                {
                  name: "大屏",
                  value: 110,
                },
                {
                  name: "小屏",
                  value: 30,
                },
              ],
            },
            {
              name: "华为",
              value: 410,
              children: [
                {
                  name: "大屏",
                  value: 150,
                },
                {
                  name: "小屏",
                  value: 230,
                },
              ],
            },
          ],
        },
      ],
      index: 0, // 当前一级分类的索引
    };
  },
  mounted() {
    /**
     * 需求:三级分类的饼图
     * 1、一级分类通过左右箭头切换的方式展现
     * 2、二级分类通过饼图的形式展现(默认不显示每块区域name,高亮时候显示name)
     * 3、三级分类通过鼠标放在饼图某一区域上时以文字的形式呈现(自定义提示文字)
     */
    this.init();
    this.getData();
    // 监听屏幕大小变化
    window.addEventListener("resize", this.screenResize);
    // 一进来主动调取屏幕适配
    this.screenResize();
  },
  beforeDestroy() {
    window.removeEventListener("resize", this.screenResize);
  },
  methods: {
    // 初始化图表
    init() {
      this.$echarts.registerTheme("ququ", ququ);
      this.pieChart = this.$echarts.init(this.$refs.pie, "ququ");

      let initOption = {
        // 标题
        title: {
          text: "▍三级饼图", // ▍ 任意打一个字,调出搜狗输入法卡片,右键单击——表情符号——符号大全
          left: 40,
          top: 40,
          textStyle: {
            color: "#fff",
          },
        },
        // 提示框设置
        tooltip: {
          trigger: "item",
          show: true,
          //  自定义提示文字
          formatter: (arg) => {
            let str = "";
            arg.data.children.forEach((item) => {
              str += `${item.name}${item.value}<br/>`;
            });
            return str;
          },
        },
        // 图例
        legend: {
          show: true,
          top: 130,
          icon: "circle",
          textStyle: {
            color: "#fff",
          },
        },
        series: [
          {
            type: "pie",
            radius: "50%", // 饼图的大小
            center: ["50%", "50%"], // 饼图的位置——正中心
            label: {
              show: false, // 隐藏饼图每块区域的名称
            },
            // 每块区域高亮时候的样式
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: "rgba(0, 0, 0, 0.5)",
              },
              label: {
                show: true, //高亮时候显示每块区域的name
              },
              labelLine: {
                show: false, // 隐藏名字和图之间默认的一条线
              },
            },
          },
        ],
      };
      this.pieChart.setOption(initOption);
    },
    // 切换一级分类
    onLeft() {
      this.index--;
      this.getData();
    },
    onRight() {
      this.index++;
      this.getData();
    },
    // 获取并处理数据,然后渲染图表
    getData() {
      let dataOption = {
        series: [
          {
            name: this.pieData[this.index].name,
            data: this.pieData[this.index].children,
          },
        ],
      };
      // 生成图表
      this.pieChart.setOption(dataOption);
    },
    // 监听屏幕变化
    screenResize() {
      this.$nextTick(() => {
        // 获取图表区域的宽度,作为基准值来设置其他需要动态改变的尺寸
        let width = this.$refs.pie.offsetWidth;
        this.size = (width / 100) * 3.6; // 定义一个基准尺寸

        // 拆分option:3、受屏幕大小影响的配置在屏幕改变的时候set
        let screenOption = {
          title: {
            textStyle: {
              fontSize: this.size,
            },
          },
          legend: {
            itemWidth: this.size / 2,
            itemHeight: this.size / 2,
          },
        };
        this.pieChart.setOption(screenOption);
        // 更新图表
        this.pieChart.resize();
      });
    },
  },
};
</script>

<style scoped lang="less">
.left,
.right,
.title {
  color: #fff;
  position: absolute;

  z-index: 999;
}
.left {
  left: 60px;
  top: 50%;
  transform: translateY(-50%);
}
.right {
  right: 60px;
  top: 50%;
  transform: translateY(-50%);
}
.title {
  right: 60px;
  bottom: 60px;
  font-size: 30px;
}
</style>

### 实现 ECharts 3D 的不同高度效果 为了在 ECharts 中创建带有不同高度的 3D 来表示不同的数值大小,可以通过配置项中的 `series` 属性来进行设置。具体来说,在构建三维时,需要引入额外的支持库并调整系列选项。 首先,确保已经加载了必要的扩展包: ```javascript import * as echarts from 'echarts'; import 'echarts-gl'; ``` 接着,初始化表实例,并通过设定特定参数让各个扇区拥有独特的厚度属性,以此体现数据间的差异[^1]。 对于想要展示的高度变化特性,主要关注于修改 `itemStyle` 下面的 `emphasis` 和常规状态下的 `normal` 设置里的 `height` 或者利用更灵活的方式——即针对每一片区域单独指定其对应的 z 值作为第三维度坐标轴上的位置偏移量,从而达到视觉上看起来像是改变了该部分的高度的目的[^2]。 下面是一个简单的例子说明如何操作这些配置项以实现所需功能: ```javascript option = { title: { text: '3D Pie Chart with Varying Heights', subtext: '', left: 'center' }, tooltip: { trigger: 'item' }, series: [{ type: 'pie', // 定义为 pie 类型即可自动转换成 3d 形态 radius: ['40%', '70%'], roseType: 'radius', data:[ {value:335, name:'A类'}, {value:310, name:'B类'}, {value:234, name:'C类'}, {value:135, name:'D类'} ], itemStyle:{ normal:{ labelLine :{show:true}, borderWidth:1, borderColor:'#fff', shadowBlur:200, shadowColor:'rgba(0,0,0,0.5)' } }, emphasis: { scale: true, scaleSize: 20 }, top: "middle", bottom:"middle", height:[80,90,100,110],// 这里尝试模拟不同高度;实际应用中可能需根据实际情况微调此值或采用其他方法控制z轴方向的距离 sort:false }] }; myChart.setOption(option); ``` 需要注意的是,上述代码片段中的 `height` 参数并非官方文档正式支持用于调节单个切片高度的方法,而是提供了一种思路启发。要真正实现精确的高度差表达,则建议深入研究 `echarts-gl` 提供的相关 API 文档,探索更多可能性,比如借助自定义几何体等方式达成目标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小曲曲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值