echarts——饼图

12 篇文章 1 订阅

在这里插入图片描述

需求:三级分类的饼图

  • 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>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ECharts 中绘制饼图需要以下步骤: 1. 引入 EChartsJavaScript 文件。 2. 在 HTML 中创建一个用于显示图表的 DOM 元素。 3. 使用 ECharts 的 API 初始化图表。 4. 配置图表的基本信息,如标题、提示框等。 5. 配置饼图的数据和样式,如饼图的半径、颜色、标签等。 下面是一个简单的示例代码: ```html <!DOCTYPE html> <html> <head> <title>ECharts 饼图示例</title> <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.1.2/echarts.min.js"></script> </head> <body> <div id="chart" style="width: 600px; height: 400px;"></div> <script> // 初始化图表 var chart = echarts.init(document.getElementById('chart')); // 配置基本信息 chart.setOption({ title: { text: '年龄分布', left: 'center' }, tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' }, legend: { orient: 'vertical', left: 'left', data: ['20岁以下', '20-30岁', '30-40岁', '40岁以上'] }, series: [{ name: '年龄分布', type: 'pie', radius: '55%', center: ['50%', '60%'], data: [ {value: 20, name: '20岁以下'}, {value: 35, name: '20-30岁'}, {value: 25, name: '30-40岁'}, {value: 20, name: '40岁以上'} ], itemStyle: { emphasis: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } }] }); </script> </body> </html> ``` 在上述代码中,我们使用 ECharts 的 `init` 方法初始化了一个图表,并使用 `setOption` 方法配置了饼图的基本信息和数据。其中,`series` 属性中的 `type` 属性指定了图表类型为饼图,`data` 属性指定了饼图的数据,`itemStyle` 属性指定了饼图的样式。 需要注意的是,上述代码中的 ECharts 版本为 5.1.2,如果你使用的是其他版本的 ECharts,可能会有些许差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小曲曲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值