HighCharts实现3D不同高度圆环图、3D饼图

最近做可视化比较多,就常用的图表类型做了一下总结。

因为做可视化的图表代码量非常大,所以会把echarts图表单独抽离出来,封装成一个组件,也可以复用,所以这里我直接把封装的组件直接放在这里,是可以直接拿来用的,根据所需稍作修改即可。

这里都是用的vue3,其实和vue2差不多,在写法上稍作修改即可。

其中用到了一个 fontChart 的方法,这样是为了在window变化(改变缩放)的时候能够让字体也达到自适应,因为默认的单位是px,如果不使用的话,当我们去减小屏幕缩放的时候,这时候屏幕分辨率就会变大,但是我们的字体还是xxpx,就会让我们的字体看上去特别小,所以这里使用了这个方法,fontChart方法如下:

scr/utils/echartPxToRem.js

export function fontChart(res) {let docEl = document.documentElement,clientWidth =window.innerWidth ||document.documentElement.clientWidth ||document.body.clientWidth;if (!clientWidth) return;// 此处的3840 为设计稿的宽度,记得修改!let fontSize = clientWidth / 1920;return res * fontSize;
}

 接下来正题:

 第一步首先安装 highcharts 

npm install highcharts --save

 第二步 main.js 引入 3d相关 

import highcharts from 'highcharts'
import highcharts3d from 'highcharts/highcharts-3d'highcharts3d(highcharts)

 然后封装成组件

一.  3D饼图

<template><div :id="id" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import highcharts from "highcharts";
import { fontChart } from "@/utils/echartPxToRem";
import { onMounted, watch, onUnmounted } from "vue";const props = defineProps({id: {type: String,required: true,},pieData: {type: Array,default: () => ([["综采", 3],["综掘", 6],["胶带运输", 4],["排水", 3],["通风", 3],["压风", 4],]),},
});watch(() => props.pieData,(newValue) => {initOption();},{deep: true,}
);onMounted(() => {initOption();window.addEventListener("resize", initOption);
});onUnmounted(() => {window.removeEventListener("resize", initOption);
});
//  初始化echarts
const initOption = () => {let option = {chart: {backgroundColor: "none",type: "pie", //饼图margin: [0, 0, 0, 100],options3d: {enabled: true, //使用3d功能alpha: 18, //延y轴向内的倾斜角度beta: 0,},},title: {text: "", //图表的标题文字},plotOptions: {pie: {allowPointSelect: true, //每个扇块能否选中cursor: "pointer", //鼠标指针depth: fontChart(105), //饼图的厚度showInLegend: true, // 是否显示图例// center: ['30%', '60%'],size: "78%",dataLabels: {enabled: true, //是否显示饼图的线形tipdistance: -fontChart(35),align: "center",// position:'center',format: "<b>{point.y}</b>",style: {fontSize: fontChart(13),},},events: {//点击事件click: () => {},},},},colors: ["#59678c", "#1760bc", "#1890ff", "#06c8cd", "#03ac32", "#acff02"],legend: {align: "left", //水平方向位置verticalAlign: "top", //垂直方向位置layout: "vertical",x: fontChart(20),y: fontChart(40),symbolWidth: fontChart(10),symbolHeight: fontChart(10),symbolRadius: 0,itemMarginBottom: fontChart(4),itemStyle: {color: "#f4f4f6",fontSize: fontChart(14),},},credits: {enabled: false, // 禁用版权信息},series: [{type: "pie",name: "", //统一的前置词,非必须data: props.pieData,},],};highcharts.chart(props.id, option);
};
</script>

二. 3D不同高度环形图 

 Vue2写法 

<template><div :id="id" style="height: 100%; width: 100%"></div>
</template>
<script>
import highcharts from "highcharts";
import { fontChart } from "@/utils/echartPxToRem";
export default {props: {id: {type: String,required: true,},dataList: {type: Array,default: () => ([{name: "红草莓",y: 10254,h: 0,bfb: 0},{name: "白草莓",y: 6894,h: 0,bfb: 0},{name: "红颜草莓",y: 7667,h: 0,bfb: 0},{name: "甜宝草莓",y: 4287,h: 0,bfb: 0},{name: "红颜草莓",y: 8687,h: 0,bfb: 0},{name: "甜宝草莓",y: 16112,h: 0,bfb: 0}])}},watch: {dataList() {this.$nextTick(() => {this.initOption();});},},mounted() {// this.$nextTick(() => {this.initOption();// });window.addEventListener("resize", this.initOption);},destroyed() {window.removeEventListener("resize", this.initOption);},methods: {initOption() {let quantity = 0; // 总数this.dataList.forEach((item) => {quantity += item.y;});this.dataList.forEach((item) => {item.bfb = parseInt((item.y / quantity) * 100);item.h = item.bfb * 1.5 >= 70 ? 70 : item.bfb * 1.5// item.h = parseInt(0.86 * item.bfb); // 最高高度60,根据比例渲染高度// console.log(this.dataList, "dataList----->>>");});// 修改3d饼图绘制过程var each = highcharts.each,round = Math.round,cos = Math.cos,sin = Math.sin,deg2rad = Math.deg2rad;highcharts.wrap(highcharts.seriesTypes.pie.prototype,"translate",function (proceed) {proceed.apply(this, [].slice.call(arguments, 1));// Do not do this if the chart is not 3Dif (!this.chart.is3d()) {return;}var series = this,chart = series.chart,options = chart.options,seriesOptions = series.options,depth = seriesOptions.depth || 0,options3d = options.chart.options3d,alpha = options3d.alpha,beta = options3d.beta,z = seriesOptions.stacking? (seriesOptions.stack || 0) * depth: series._i * depth;z += depth / 2;if (seriesOptions.grouping !== false) {z = 0;}each(series.data, function (point) {var shapeArgs = point.shapeArgs,angle;point.shapeType = "arc3d";var ran = point.options.h;shapeArgs.z = z;shapeArgs.depth = depth * 0.75 + ran;shapeArgs.alpha = alpha;shapeArgs.beta = beta;shapeArgs.center = series.center;shapeArgs.ran = ran;angle = (shapeArgs.end + shapeArgs.start) / 2;point.slicedTranslation = {translateX: round(cos(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)),translateY: round(sin(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)),};});});(function (H) {H.wrap(highcharts.SVGRenderer.prototype,"arc3dPath",function (proceed) {// Run original proceed methodvar ret = proceed.apply(this, [].slice.call(arguments, 1));ret.zTop = (ret.zOut + 0.5) / 100;return ret;});})(highcharts);highcharts.chart(this.id, {chart: {animation: false,backgroundColor: "none",type: "pie", //饼图margin: [0, 0, 0, 0],options3d: {enabled: true, //使用3d功能alpha: 58, //延y轴向内的倾斜角度beta: 0,},events: {load: function () {var each = highcharts.each,points = this.series[0].points;each(points, function (p, i) {p.graphic.attr({translateY: -p.shapeArgs.ran,});p.graphic.side1.attr({translateY: -p.shapeArgs.ran,});p.graphic.side2.attr({translateY: -p.shapeArgs.ran,});});},},},legend: {enabled: true, // 关闭图例align: "right", //水平方向位置verticalAlign: "top", //垂直方向位置layout: "vertical",x: fontChart(-20),y: fontChart(30),symbolWidth: fontChart(10),symbolHeight: fontChart(10),symbolRadius: "50%", // 修改成圆itemMarginBottom: fontChart(8),useHTML: true,//labelFormat: '{name}&nbsp;&nbsp;&nbsp;&nbsp;{y}',labelFormatter: function () {return ('<div style="width: .3125rem;display: inline-block">' +this.name +':&nbsp;&nbsp;</div><div style="color: #00d7da;display: inline-block">' +this.y +"</div>");},itemStyle: {color: "#f4f4f6",fontSize: fontChart(12),},},title: {// enabled: false,text: "",},subtitle: {text: "",},plotOptions: {pie: {allowPointSelect: false, // 禁用点击cursor: "pointer",depth: fontChart(15),showInLegend: true,size: "75%", // 外圈直径大小innerSize: fontChart(95), // 内圈直径大小center: ["30%", "50%"],colors: ["rgb(235,147,39)","rgb(234,219,54)","rgb(12,214,137)","rgb(25,234,219)","rgb(13,145,239)","rgb(167,67,234)",],dataLabels: {useHTML: true,enabled: true, //是否显示饼图的线形tipdistance: 5,borderColor: '#007acc',align: "center",// verticalAlign: 'top',position: "right",format: "{point.bfb}%",// formatter: (point,b) => {//   console.log(point,'ponit-->>')//   console.log(b,'ponit-->>')// },color: "#ffffff",style: {textOutline: "none",fontSize: fontChart(13),},},},},credits: {enabled: false, // 禁用版权信息},series: [{type: "pie",name: "数量",data: this.dataList,},],});},},
};
</script>

Vue3写法 

<template><div :id="id" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import highcharts from "highcharts";
import { fontChart } from "@/utils/echartPxToRem";
import { onMounted, watch, onUnmounted } from "vue";const props = defineProps({id: {type: String,required: true,},dataList: {type: Array,default: () => ([{name: "红草莓",y: 15687,h: 16,bfb: 29,},{name: "白草莓",y: 15687,h: 12,bfb: 8,},{name: "红颜草莓",y: 15687,h: 5,bfb: 11,},{name: "甜宝草莓",y: 15687,h: 9,bfb: 11,},{name: "红颜草莓",y: 15687,h: 8,bfb: 13,},{name: "甜宝草莓",y: 15687,h: 36,bfb: 18,},]),},
});watch(() => props.dataList,(newValue) => {initOption();},{deep: true,}
);onMounted(() => {initOption();window.addEventListener('resize', initOption)
});onUnmounted(() => {window.removeEventListener("resize", initOption);
});
//  初始化echarts
const initOption = () => {let quantity = 0; // 总数props.dataList.forEach((item) => {quantity += item.y;});props.dataList.forEach((item) => {item.bfb = parseInt((item.y / quantity) * 100);item.h = item.bfb * 1.5 >= 70 ? 70 : item.bfb * 1.5// item.h = parseInt(0.86 * item.bfb); // 最高高度60,根据比例渲染高度// console.log(props.dataList, "dataList----->>>");});// 修改3d饼图绘制过程var each = highcharts.each,round = Math.round,cos = Math.cos,sin = Math.sin,deg2rad = Math.deg2rad;highcharts.wrap(highcharts.seriesTypes.pie.prototype,"translate",function (proceed) {proceed.apply(this, [].slice.call(arguments, 1));// Do not do this if the chart is not 3Dif (!this.chart.is3d()) {return;}var series = this,chart = series.chart,options = chart.options,seriesOptions = series.options,depth = seriesOptions.depth || 0,options3d = options.chart.options3d,alpha = options3d.alpha,beta = options3d.beta,z = seriesOptions.stacking? (seriesOptions.stack || 0) * depth: series._i * depth;z += depth / 2;if (seriesOptions.grouping !== false) {z = 0;}each(series.data, function (point) {var shapeArgs = point.shapeArgs,angle;point.shapeType = "arc3d";var ran = point.options.h;shapeArgs.z = z;shapeArgs.depth = depth * 0.75 + ran;shapeArgs.alpha = alpha;shapeArgs.beta = beta;shapeArgs.center = series.center;shapeArgs.ran = ran;angle = (shapeArgs.end + shapeArgs.start) / 2;point.slicedTranslation = {translateX: round(cos(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)),translateY: round(sin(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)),};});});(function (H) {H.wrap(highcharts.SVGRenderer.prototype, "arc3dPath", function (proceed) {// Run original proceed methodvar ret = proceed.apply(this, [].slice.call(arguments, 1));ret.zTop = (ret.zOut + 0.5) / 100;return ret;});})(highcharts);highcharts.chart(props.id, {chart: {animation: false,backgroundColor: "none",type: "pie", //饼图margin: [0, 0, 0, 0],options3d: {enabled: true, //使用3d功能alpha: 58, //延y轴向内的倾斜角度beta: 0,},events: {load: function () {var each = highcharts.each,points = this.series[0].points;each(points, function (p, i) {p.graphic.attr({translateY: -p.shapeArgs.ran,});p.graphic.side1.attr({translateY: -p.shapeArgs.ran,});p.graphic.side2.attr({translateY: -p.shapeArgs.ran,});});},},},legend: {enabled: true, // 关闭图例align: "right", //水平方向位置verticalAlign: "top", //垂直方向位置layout: "vertical",x: fontChart(0),y: fontChart(30),symbolWidth: fontChart(10),symbolHeight: fontChart(10),symbolRadius: "50%", // 修改成圆itemMarginBottom: fontChart(8),labelFormat: "{name}&nbsp;&nbsp;&nbsp;&nbsp;{y}",itemStyle: {color: "#f4f4f6",fontSize: fontChart(12),},},title: {// enabled: false,text: "",},subtitle: {text: "",},plotOptions: {pie: {allowPointSelect: false, // 禁用点击cursor: "pointer",depth: fontChart(45),showInLegend: true,size: "65%", // 外圈直径大小innerSize: fontChart(95), // 内圈直径大小center: ["30%", "50%"],colors: ["rgba(157, 88, 32, .9)","rgba(169, 199, 62, .9)","rgba(11, 146, 89, .9)","rgba(16, 138, 174, .9)","rgba(0, 77, 161, .9)","rgba(60, 32, 173, .9)",],dataLabels: {enabled: true, //是否显示饼图的线形tipdistance: fontChart(0),align: "center",position: "center",format: "{point.bfb}%",// formatter: (point,b) => {//   console.log(point,'ponit-->>')//   console.log(b,'ponit-->>')// },style: {fontSize: fontChart(13),},},},},credits: {enabled: false, // 禁用版权信息},series: [{type: "pie",name: "Browser share",data: props.dataList,},],});
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17033.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直播合辑 | 微软ATP与您相约100场公益演讲

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; Public100已历经了近一年的春夏秋冬&#xff0c;截止目前我们一共举办33场公益直播&#xff0c;由微软及合作伙伴中从事 AI 相关工作的工程师、产品经理、市场总监、运营经理等各类专家和学者&#xff0c;分享自己在学…

微信春节大数据出炉:《三体》阅读量第一 ;曝iOS 17应用商店将向第三方开放;斯坦福大学推出DetectGPT|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

ChatGPT 串接 Firebase,實現上下文歷史紀錄

ChatGPT 串接 Firebase&#xff0c;實現上下文歷史紀錄 在使用 ChatGPT API 時&#xff0c;因為 API 本身是「一次性」&#xff0c;無法儲存聊天的歷史紀錄&#xff0c;這也衍生了「無法串聯上下文」的問題&#xff0c;不過如果將 ChatGPT 串連 Firebase 的 Realtime database…

ChatGPT:我围观了量子位MEET2023智能未来大会,还当了一回课代表

编辑部 ChatGPT 发自 凹非寺量子位 | 公众号 QbitAI 什么是“MEET2023智能未来大会”&#xff1f; 大会上来了哪些重磅嘉宾&#xff1f; 他们在大会上探讨了什么主题&#xff1f; 没错&#xff01;ChatGPT也参与了今年的大会&#xff0c;作为AI代表与人类嘉宾们一起回顾这一年来…

LM详解 GPT3,GPT2, GPT1 论文译读

LM详解 GPT3&#xff0c;GPT2, GPT1 论文译读 T5&#xff0c;Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer&#xff0c;2019 arxiv https://arxiv.org/abs/1910.10683 中译 https://zhuanlan.zhihu.com/p/89719631 讨论 如何评价 Goo…

chatgpt赋能python:Python提取扫描版PDF:一篇SEO文章

Python提取扫描版PDF&#xff1a;一篇SEO文章 Python在数据科学、自然语言处理、机器学习等领域中广泛应用。今天我们将关注Python的另一个应用&#xff1a;提取扫描版PDF。本文介绍了如何使用Python提取文本以及搜索引擎优化&#xff08;SEO&#xff09;的最佳实践。 提取扫…

Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。

ChatPDF的妙用 1、引言2、代码实战2.1 原理2.2 安装2.2 示例2.2.1 创建PDF文件2.2.2 旋转PDF文件2.2.3 拆分PDF文件2.2.4 合并PDF文件2.2.5 提取PDF文件内容 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;最近干啥了&#xff1f; 小鱼&#xff1a;最近&#xff1f; 你指…

chatgpt赋能python:Python实现多关键词搜索PDF文件

Python实现多关键词搜索PDF文件 概述 在今天的数字化社会中&#xff0c;很多信息都以数字化的形式存储在PDF文件中。这让我们在搜索特定信息时面临很多挑战&#xff0c;特别是当我们需要同时搜索多个PDF文件并集中检索这些文件时。 在这篇文章中&#xff0c;我们将介绍如何使…

零代码编程:用ChatGPT将PDF文件的表格批量转为Excel表格

电脑中有几百个PDF文件&#xff0c;文件内容格式一致&#xff0c;每个PDF文件第一页是一个表格。想把这几百个PDF文件里面的表格都提取出来&#xff0c;转为excel表&#xff0c;该怎么办&#xff1f; 打开ChatGPT&#xff08;一定要用GPT4&#xff0c;编程能力很强。相比之下&a…

chatgpt赋能python:Python抓取PDF内容:一个全面的指南

Python 抓取 PDF 内容&#xff1a;一个全面的指南 引言 Python 作为一种广泛使用的编程语言&#xff0c;已经拥有了许多应用功能。其中之一是抓取 PDF 文件的内容。 PDF 文件在今天的数字化世界中使用广泛&#xff0c;使得从 PDF 文件中提取内容变得尤其重要&#xff0c;对于…

ChatGPT-4模型读取PDF/网页链接实测结果!

联网和插件功能使用 直接在设置里面&#xff0c;把这两个开关开起来 联网功能&#xff1a; 3.5不会的东西是不会自动联网搜索的&#xff0c;Plus4.0可以进行联网搜索答案 插件功能&#xff1a; 首先在Settings里面把Plugins进行安装&#xff0c;选中要安装的插件&#xff0c;直…

a16z深度分析:AI 将创造哪些新的游戏玩法?

来源/a16z 编译/Nick 早期关于游戏中的生成式 AI 革命的讨论主要集中在 AI 工具如何提高游戏创作者的效率&#xff0c;使得游戏的制作速度比以前更快、规模更大。从长远来看&#xff0c;我们认为&#xff0c;AI 不仅能改变创造游戏的方式&#xff0c;还能改变游戏本身的性质。 …

ChatGPT对金融业将产生哪些影响?

黄浦区金融办 2023-05-22 02:30 发表于上海 近期人机互动模型ChatGPT进入应用领域&#xff0c;意味着人工智能的发展达到了新高地。那么&#xff0c;人工智能在金融领域的应用与未来发展趋势如何&#xff1f;会给金融机构带来哪些挑战&#xff1f;日前&#xff0c;《金融时报》…

OpManager 实时网络监控

网络是全球企业背后的基础。它在为您的员工提供行政服务以及为各大洲的客户提供服务方面发挥着关键作用。网络可帮助您将信息保存在一个集中位置 - 需要和限制所有其他入站请求的人员可以访问。那么&#xff0c;您如何提供持续的一流最终用户体验并维护快速发展的网络呢&#x…

使用 LangChain、Pinecone 和 LLM(如 GPT-4 和 ChatGPT)构建基于文档的问答系统

目录 一、简介 二、为什么语义搜索GPT问答比微调GPT更好&#xff1f; 2.1、更广泛的知识覆盖&#xff1a; 2.2、特定于上下文的答案&#xff1a; 2.3、适应性 2.4、更好地处理模糊查询 三、LangChain 模块 四、设置环境 五、加载文档 六、分割文档 七、使用 OpenAI 嵌入…

ChatGPT 启示录:AI 已经把人类逼退到了信仰和宗教的边界上了?

哲学的滑落 哲学之初&#xff0c;研究的对象是客观存在的物质实体&#xff0c;物体是不依赖于人们思想的东西。后来康德、叔本华等说物自体不可知&#xff0c;于是哲学家离开客体&#xff0c;转而研究人这一主体&#xff0c;研究人们内在感知到的表象世界。 到了维特根斯坦这里…

特斯拉因辅助驾驶发生致命车祸;APUS发布AiLMe大模型;欧洲成立人工智能研究中心来监督大型平台丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 APUS多模态大模型“AiLMe”发布 4月19日&#xff0c;APUS发布自研多模态人工智能大模型“AiLMe”。据介绍&#xff0c;AiLMe参数已达千亿规模&#xff0c;具备对文本、图像、视频、音频的理解和生成能力。针对具…

关于生成式人工智能服务管理的一些思考

&#xff08;本文阅读时间&#xff1a;&#xff16;分钟&#xff09; 01 生成式AI是我这几个月的重点研究领域&#xff0c;我也先后发表了20多篇文章&#xff0c;20来条视频节目&#xff0c;现在也在写作一本相关书籍&#xff0c;在业界也有那么一点点影响。 所以当生成式人工智…

马斯克低头了?改口此前评价比亚迪“做的不好”!

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 不得不说&#xff0c;互联网是带记忆的。 近日&#xff0c;有网友“挖”出一条 YouTube 上的“考古”视频 —— 特斯拉 CEO 马斯克评价比亚迪汽车“做的不好”。 令人没想到的是&#x…

【人工智能】AI 人工智能技术近十年演变发展历程

人工智能技术近十年演变发展历程 过去十年对于人工智能(AI)领域来说是一段激动人心的多事之秋。对深度学习潜力的适度探索变成了一个领域的爆炸性扩散,现在包括从电子商务中的推荐系统到自动驾驶汽车的对象检测以及可以创建从逼真的图像到连贯文本的所有内容的生成模型。 …