3d highcharts 3D echarts 在Vue中使用highCharts绘制3d饼图的方法

亲测:  官方文档:图表缩放 | Highcharts 使用教程

一、引入

1、安装依赖于highcharts

npm install highcharts --save

2、安装完成后,进入项目main.js进行配置:

import highcharts from 'highcharts'

因为我们需要使用3d图表,main.js还需要引入:

import highcharts3d from 'highcharts/highcharts-3d'

在main.js 中,调用3d图表:

highcharts3d(highcharts)

 二、页面画图

import HighCharts from "highcharts";

方法一:

 

3D 饼图 | Highcharts

配置参考:https://www.jb51.net/article/134744.htm

 方法一完整代码:

<template>
  <div>
    <YearTabBox
      :yearsList="yearsList"
      :selectYear="selectYear"
      @getSelectTime="getSelectTime"
    />

    <div class="card">
      <div :id="id" :option="option"></div>
    </div>
  </div>
</template>

<script>
import * as echarts from "echarts";
import HighCharts from "highcharts";
import RightTopPieLine from "../RightTopPieLine";
import YearTabBox from "@/components/YearTabBox";
import {
  getActionData,
  getYearActionData,
  getYearListBySql,
} from "@/api/manage";
import { GlobalMixin } from "@/mixins/globalMixin";

export default {
  name: "RightTopPie",
  mixins: [GlobalMixin],
  components: {
    RightTopPieLine,
    YearTabBox,
  },
  // props: {
  //   msg: String,
  // },

  data() {
    return {
      selectYear: "",
      yearsList: [],
      chartData: [],
      arrData: [],
      intDom: "",
      state: true,

      id: "test",
      option: {
        chart: {
          type: "pie", //饼图
          options3d: {
            enabled: true, //使用3d功能
            alpha: 60, //延y轴向内的倾斜角度
            beta: 0,
          },
        },
        title: {
          text: "测试用", //图表的标题文字
        },
        subtitle: {
          text: "", //副标题文字
        },

        plotOptions: {
          pie: {
            allowPointSelect: true, //每个扇块能否选中
            cursor: "pointer", //鼠标指针
            depth: 35, //饼图的厚度
            dataLabels: {
              enabled: true, //是否显示饼图的线形tip
            },
          },
        },
        series: [
          {
            type: "pie",
            name: "测试用1", //统一的前置词,非必须
            data: [
              ["测试1", 12], //模块名和所占比,也可以{name: '测试1',y: 12}
              ["测试2", 23],
              ["测试3", 19],
              ["测试4", 29],
            ],
          },
        ],
      },


    };
  },
  mounted() {
    // this.getAllYears();
    HighCharts.chart(this.id, this.option)
  },
  methods: {
    async getAllYears() {
      const yearsParams = {
        api_key: "qJwsmXalFui8LnPxye",
        metadata_id: "1529387467046707201",
      };
      const paramSql =
        "select count_year from dp_ads.ads_jm_trade_homepage GROUP BY count_year";

      const res = await getYearListBySql(
        "/ylgDataApply/advancedQueryData",
        yearsParams,
        paramSql
      );

      let years = [];
      years = res.items;
      let arr = [];
      years.map((item, index) => {
        // yearsList.push(Number(item.count_year));
        arr.push(item.count_year);
      });
      // 对年份进行排序
      arr.sort((a, b) => {
        return b - a;
      });
      this.yearsList = arr;
      this.selectYear = arr[0];
      // console.log(this.yearsList, "this.yearsList");
      this.getData();
    },

    async getData() {
      const params = {
        api_key: "qJwsmXalFui8LnPxye",
        metadata_id: "1529387467046707201",
      };
      const res = await getYearActionData(
        "/ylgDataApply/advancedQueryData",
        params,
        this.selectYear
      );
      let arr = res.items;
      // console.log(res.items, "00对外贸易关系");
      arr.forEach((item) => {
        item.exit = Number(Number(item.exit).toFixed(1));
        item.import = Number(Number(item.import).toFixed(1));
        item.total = Number(Number(item.total).toFixed(1));
      });
      this.chartData = arr;

      this.arrData = this.getDescend(arr, "total");
      // console.log(res.items, "对外贸易关系");
      // this.handleChangeGraph();
    },

    getSelectTime(val) {
      this.selectYear = val;
      this.getData();
      // this.handleData();
    },
  },
};
</script>

<style scoped lang="scss">
.card {
  margin-top: 10px;
  width: 100%;
  position: relative;
}

.rightTopPie {
  width: 96%;
  height: 32vh;
  // border: 1px solid red;
  margin: 0px 10px 0px auto;
  border-top: 0;
}

#line2 {
  width: 52%;
  height: calc(32vh - 2.5vh);
  // border: 1px solid blue;
  position: absolute;
  right: 0;
  top: 2.5vh;
  padding-left: 2%;
}

#line2 > div {
  width: 80%;

  // border: 1px solid blue;
}

.rightLine {
  width: 100%;
  // border: 1px solid red;
  > span:first-child {
    display: inline-block;
    width: 10px;
    height: 10px;
    background: #8fbfff;
    box-shadow: 0px 0px 12px #8fbfff;
    margin-right: 10px;
  }
  > span:nth-child(2) {
    font-size: 16px;
    font-family: Microsoft YaHei;
    font-weight: bold;
    font-style: italic;
    color: #eceff4;
    margin-right: 20px;
  }
  > span:nth-child(3) {
    font-size: 16px;
    font-family: PangMenZhengDao;
    font-weight: bold;
    font-style: italic;
    color: #eceff4;
  }
  > span:nth-child(4) {
    font-size: 16px;
    font-family: Adobe Heiti Std;
    font-weight: normal;
    color: #eceff4;
    padding-left: calc(100% - 20px - 60px - 60px - 55px);
    // text-align: right;
  }
}

/deep/ .el-progress-bar {
  padding-right: 0px;
}

/deep/ .el-progress-bar__inner {
  background-image: linear-gradient(
    to right,
    #0b3fff 0%,
    #587bfd 50%,
    #6c8bfd 100%
  );
  border-radius: 0px;
}

::v-deep .el-progress {
  .el-progress-bar__outer {
    background-color: #181f35; //这里是背景颜色
    border-radius: 0px;
  }
}

::v-deep .el-progress__text {
  display: none;
}
</style>
<template>
  <div>
    <YearTabBox
      :yearsList="yearsList"
      :selectYear="selectYear"
      @getSelectTime="getSelectTime"
    />

    <div class="card ">
      <!-- <div ref="rightTopPie" class="rightTopPie" /> -->

      <div :id="id" :option="option"></div>

      <!-- <div id="line2">
        <RightTopPieLine
          v-for="(item, index) of arrData.slice(0, 4)"
          :key="index"
          :NoNum="index"
          :title="item.nation"
          :percentage="Number(item.proportion)"
        />
      </div> -->
    </div>
  </div>
</template>

<script>
import * as echarts from "echarts";
import HighCharts from "highcharts";
import RightTopPieLine from "../RightTopPieLine";
import YearTabBox from "@/components/YearTabBox";
import {
  getActionData,
  getYearActionData,
  getYearListBySql,
} from "@/api/manage";
import { GlobalMixin } from "@/mixins/globalMixin";
export default {
  name: "RightTopPie",
  mixins: [GlobalMixin],
  components: {
    RightTopPieLine,
    YearTabBox,
  },
  // props: {
  //   msg: String,
  // },

  data() {
    return {
      selectYear: "",
      yearsList: [],
      chartData: [],
      arrData: [],
      intDom: "",
      state: true,
      id: "rightTopPie",
      option: "",
    };
  },
  mounted() {
    this.getAllYears();
    this.getData();
  },
  methods: {
    async getAllYears() {
      const yearsParams = {
        api_key: "qJwsmXalFui8LnPxye",
        metadata_id: "1529387467046707201",
      };
      const paramSql =
        "select count_year from dp_ads.ads_jm_trade_homepage GROUP BY count_year";

      const res = await getYearListBySql(
        "/ylgDataApply/advancedQueryData",
        yearsParams,
        paramSql
      );

      let years = [];
      years = res.items;
      let arr = [];
      years.map((item, index) => {
        // yearsList.push(Number(item.count_year));
        arr.push(item.count_year);
      });
      // 对年份进行排序
      arr.sort((a, b) => {
        return b - a;
      });
      this.yearsList = arr;
      this.selectYear = arr[0];
      // console.log(this.yearsList, "this.yearsList");
      this.getData();
    },

    async getData() {
      const params = {
        api_key: "qJwsmXalFui8LnPxye",
        metadata_id: "1529387467046707201",
      };
      const res = await getYearActionData(
        "/ylgDataApply/advancedQueryData",
        params,
        this.selectYear
      );
      let arr = res.items;
      // console.log(res.items, "00对外贸易关系");
      arr.forEach((item) => {
        item.exit = Number(Number(item.exit).toFixed(1));
        item.import = Number(Number(item.import).toFixed(1));
        item.total = Number(Number(item.total).toFixed(1));
      });
      this.chartData = arr;

      this.arrData = this.getDescend(arr, "total");
      // console.log(res.items, "对外贸易关系");
      // this.handleChangeGraph();

      this.option = {
        chart: {
          type: "pie", //饼图
          options3d: {
            enabled: true, //使用3d功能
            alpha: 60, //延y轴向内的倾斜角度
            beta: 0,
          },
          spacing: [0, 100, 0, 0], //图标与四周的间距 相当于echarts grid
        },

        // title: {
        //   text: "测试用", //图表的标题文字
        // },
        // subtitle: {
        //   text: "", //副标题文字
        // },

        legend: {
          align: "left", //水平方向位置
          verticalAlign: "top", //垂直方向位置
          x: 0, //距离x轴的距离
          y: 0, //距离Y轴的距离
        },

        plotOptions: {
          pie: {
            allowPointSelect: true, //每个扇块能否选中
            cursor: "pointer", //鼠标指针
            depth: 35, //饼图的厚度
            dataLabels: {
              enabled: true, //是否显示饼图的线形tip
            },
          },
        },
        series: [
          {
            type: "pie",
            name: "测试用1", //统一的前置词,非必须
            data: [
              ["测试1", 12], //模块名和所占比,也可以{name: '测试1',y: 12}
              ["测试2", 23],
              ["测试3", 19],
              ["测试4", 29],
            ],
            showInLegend: true,

            // verticalAlign:top
          },
        ],
      };

      HighCharts.chart(this.id, this.option);
    },

    getSelectTime(val) {
      this.selectYear = val;
      this.getData();
      // this.handleData();
    },
  },
};
</script>

<style scoped lang="scss">
.card {
  margin-top: 10px;
  width: 100%;
  position: relative;
}

.rightTopPie {
  width: 96%;
  height: 32vh;
  border: 1px solid red;
  margin: 0px 10px 0px auto;
  border-top: 0;
}

#line2 {
  width: 52%;
  height: calc(32vh - 2.5vh);
  // border: 1px solid blue;
  position: absolute;
  right: 0;
  top: 2.5vh;
  padding-left: 2%;
}

#line2 > div {
  width: 80%;

  // border: 1px solid blue;
}

.rightLine {
  width: 100%;
  // border: 1px solid red;
  > span:first-child {
    display: inline-block;
    width: 10px;
    height: 10px;
    background: #8fbfff;
    box-shadow: 0px 0px 12px #8fbfff;
    margin-right: 10px;
  }
  > span:nth-child(2) {
    font-size: 16px;
    font-family: Microsoft YaHei;
    font-weight: bold;
    font-style: italic;
    color: #eceff4;
    margin-right: 20px;
  }
  > span:nth-child(3) {
    font-size: 16px;
    font-family: PangMenZhengDao;
    font-weight: bold;
    font-style: italic;
    color: #eceff4;
  }
  > span:nth-child(4) {
    font-size: 16px;
    font-family: Adobe Heiti Std;
    font-weight: normal;
    color: #eceff4;
    padding-left: calc(100% - 20px - 60px - 60px - 55px);
    // text-align: right;
  }
}

/deep/ .el-progress-bar {
  padding-right: 0px;
}

/deep/ .el-progress-bar__inner {
  background-image: linear-gradient(
    to right,
    #0b3fff 0%,
    #587bfd 50%,
    #6c8bfd 100%
  );
  border-radius: 0px;
}

::v-deep .el-progress {
  .el-progress-bar__outer {
    background-color: #181f35; //这里是背景颜色
    border-radius: 0px;
  }
}

::v-deep .el-progress__text {
  display: none;
}
</style>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以按照以下步骤在Vue使用Highcharts绘制3D饼图: 1. 在你的项目的main.js文件引入Highchartshighcharts-3d插件: ```javascript import Highcharts from 'highcharts' import Highcharts3d from 'highcharts/highcharts-3d' Highcharts3d(Highcharts) ``` 2. 在你的组件创建一个容器来显示图表,并引入Highcharts库: ```vue <template> <div class="container"> <div :id="id" :option="option" class="chart-container"></div> </div> </template> <script> import Highcharts from 'highcharts' export default { props: { id: { type: String }, // 用于区分多个图表的唯一标识符 option: { type: Object } // 图表的配置选项 }, data() { return { chart: null } }, mounted() { // 在组件加载完成后初始化图表 this.setOption() }, methods: { setOption() { // 销毁之前的图表实例 if (this.chart) { this.chart.destroy() } // 创建一个新的图表实例并渲染到指定容器 this.chart = Highcharts.chart(this.id, this.option) // 重新调整图表大小,以适应容器 this.chart.reflow() } } } </script> <style scoped> .container { width: 100%; height: 100%; background: #043b8c; .chart-container { width: 100%; height: 100%; } /* 去除水印 */ .highcharts-credits { display: none; } } </style> ``` 3. 在你的父组件使用刚才创建的组件,并传入相应的id和配置选项: ```vue <template> <div> <pie-chart id="chart1" :option="chartOptions"></pie-chart> </div> </template> <script> import PieChart from './PieChart.vue' export default { components: { PieChart }, data() { return { chartOptions: { chart: { type: 'pie', options3d: { enabled: true, alpha: 45, beta: 0 } }, title: { text: '3D饼图' }, series: [{ name: 'Brands', data: [ ['Chrome', 61.41], ['Internet Explorer', 11.84], ['Firefox', 10.85], ['Edge', 4.67], ['Safari', 4.18], ['Other', 7.05] ] }] } } } } </script> ``` 这样,你就可以在Vue使用Highcharts绘制3D饼图了。记得根据你的需求修改配置选项和数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值