echarts 不连接的南丁格尔玫瑰图

本文讲述了在项目中遇到的三个图表问题:数据连续性处理、图表标题位置调整以避免溢出,并分享了使用ECharts解决饼图标题显示与布局的方法。通过加入空数据和自定义labelLayout函数,确保了图表的美观和信息完整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图

在这里插入图片描述

项目中遇到的问题

1、如何使它不连续 解决方案 我给他的数据在最后加入了两条空数据

const data = [
	{ value: 100, name: "我是首页1" },
	{ value: 80, name: "我是首页2" },
	{ value: 70, name: "我是首页3" },
	{ value: 65, name: "我是首页4" },
	{ value: 60, name: "我是首页5" },
	{ value: 55, name: "我是首页6" },
	{ value: 50, name: "我是首页7" },
	{ value: 45, name: "我是首页8" },
	{ value: 40, name: "我是首页9" },
	{ value: 35, name: "我是首页10" },
	{ value: 0, name: "" },
	{ value: 0, name: "" }
];

2、去掉只指引线后 发现 标题 距离图表较远如下图 解决方法:通过labelLayout这个字段 对别个标题的位置进行布局 只需改option即可

在这里插入图片描述

labelLayout(params) {
	// console.log(params, "值");
	if (params.dataIndex < 3) {
		return {
			x: params?.labelLinePoints[0][0] + 15,
			y: params?.labelLinePoints[0][1] + 10
		};
	} else if (params.dataIndex == 3) {
		return {
			x: params?.labelLinePoints[0][0] + 15,
			y: params?.labelLinePoints[0][1] + 15
		};
	} else if (params.dataIndex == 4) {
		return {
			x: params?.labelLinePoints[0][0] + -5,
			y: params?.labelLinePoints[0][1] + 30
		};
	} else if (params.dataIndex == 5) {
		return {
			x: params?.labelLinePoints[0][0] + 10,
			y: params?.labelLinePoints[0][1] + 20
		};
	} else if (params.dataIndex == 6) {
		return {
			x: params?.labelLinePoints[0][0] - 20,
			y: params?.labelLinePoints[0][1] + 10
		};
	} else if (params.dataIndex == 9) {
		return {
			x: params?.labelLinePoints[0][0] - 15,
			y: params?.labelLinePoints[0][1] - 10
		};
	} else {
		return {
			x: params?.labelLinePoints[0][0] - 40,
			y: params?.labelLinePoints[0][1] + 10
		};
	}
},

3、标题超出会省略号 解决overflow: "none"
完整代码 :注本文是vue+vite + ts 有单独封装hooks 不可直接粘贴

<template>
	<div class="box">
		<div class="top">
			<div class="top-left">
				<div class="vertical-line"></div>
				<div class="font1">系统发布商品类别排名(前10)</div>
			</div>
		</div>
		<div class="imgContent">
			<div v-for="(item, index) in imgList" :key="index" class="item">
				<img :src="item" alt="" style="width: 17.72px" />
				<div style="margin-left: 4px; font-size: 12px; color: #606266">{{ data[index].name }}</div>
			</div>
		</div>
		<!-- 饼图 -->
		<div ref="echartsRef" class="pie-box"></div>
	</div>
</template>

<script setup lang="ts" name="pieChart">
import { ref, onMounted, reactive } from "vue";
import * as echarts from "echarts";
import { useEcharts } from "@/hooks/useEcharts";
const echartsRef = ref<HTMLElement>();
const imgList = reactive([
	new URL("../../../../assets/images/smallFirstC.png", import.meta.url).href,
	new URL("../../../../assets/images/smallSecondC.png", import.meta.url).href,
	new URL("../../../../assets/images/smallThirdC.png", import.meta.url).href,
	new URL("../../../../assets/images/home4.png", import.meta.url).href,
	new URL("../../../../assets/images/home5.png", import.meta.url).href,
	new URL("../../../../assets/images/home6.png", import.meta.url).href,
	new URL("../../../../assets/images/home7.png", import.meta.url).href,
	new URL("../../../../assets/images/home8.png", import.meta.url).href,
	new URL("../../../../assets/images/home9.png", import.meta.url).href,
	new URL("../../../../assets/images/home10.png", import.meta.url).href
]);
const data = [
	{ value: 100, name: "我是首页1" },
	{ value: 80, name: "我是首页2" },
	{ value: 70, name: "我是首页3" },
	{ value: 65, name: "我是首页4" },
	{ value: 60, name: "我是首页5" },
	{ value: 55, name: "我是首页6" },
	{ value: 50, name: "我是首页7" },
	{ value: 45, name: "我是首页8" },
	{ value: 40, name: "我是首页9" },
	{ value: 35, name: "我是首页10" },
	{ value: 0, name: "" },
	{ value: 0, name: "" }
];
onMounted(() => {
	let myChart: echarts.ECharts = echarts.init(echartsRef.value as HTMLElement);
	// let maxArr = new Array(datas.length).fill(100);

	let option: echarts.EChartsOption = {
		color: [
			"#EB5757",
			"#FAA53B",
			"#4CCCD4",
			"#4475C6",
			"#4CCCD4",
			"#5E9EE3",
			"#95BEEB",
			"#C2D1FE",
			"#CEE2F6",
			"#E1E1F0",
			"#E8E8F8"
		],
		tooltip: {
			trigger: "item",
			formatter: "{b} : {c}"
		},
		series: [
			{
				type: "pie",
				radius: [0, "100%"],
				center: ["45%", "55%"],
				roseType: "area",
				label: {
					color: "inherit",
					position: "outside",
					overflow: "none",
					align: "center",
					rich: {
						a: {
							align: "center"
						}
					},
					formatter: param => {
						console.log(param, "来了");
						if (param.value != 0) {
							return "{a|" + param.name + "\n" + param.value + "种}";
						} else {
							return "";
						}
					}
				},
				labelLine: {
					show: false
				},
				labelLayout(params) {
					// console.log(params, "值");
					if (params.dataIndex < 3) {
						return {
							x: params?.labelLinePoints[0][0] + 15,
							y: params?.labelLinePoints[0][1] + 10
						};
					} else if (params.dataIndex == 3) {
						return {
							x: params?.labelLinePoints[0][0] + 15,
							y: params?.labelLinePoints[0][1] + 15
						};
					} else if (params.dataIndex == 4) {
						return {
							x: params?.labelLinePoints[0][0] + -5,
							y: params?.labelLinePoints[0][1] + 30
						};
					} else if (params.dataIndex == 5) {
						return {
							x: params?.labelLinePoints[0][0] + 10,
							y: params?.labelLinePoints[0][1] + 20
						};
					} else if (params.dataIndex == 6) {
						return {
							x: params?.labelLinePoints[0][0] - 20,
							y: params?.labelLinePoints[0][1] + 10
						};
					} else if (params.dataIndex == 9) {
						return {
							x: params?.labelLinePoints[0][0] - 15,
							y: params?.labelLinePoints[0][1] - 10
						};
					} else {
						return {
							x: params?.labelLinePoints[0][0] - 40,
							y: params?.labelLinePoints[0][1] + 10
						};
					}
				},
				data: data,
				left: 0,
				right: 0,
				startAngle: 60
			}
		]
	};
	useEcharts(myChart, option);
});
</script>
### 如何将 ECharts 中的饼转换为南丁格尔玫瑰图ECharts 中,可以通过调整 `series` 的配置项,将普通的饼转换为南丁格尔玫瑰图。具体来说,通过设置 `type: 'pie'` 和 `roseType: true` 或者指定 `roseType: 'radius'`/`roseType: 'area'` 来实现这一效果[^2]。 以下是详细的代码示例: ```javascript // 初始化 echarts 实例 var chartDom = document.getElementById('main'); var myChart = echarts.init(chartDom); // 配置项 var option = { title: { text: '南丁格尔玫瑰图', subtext: '纯属虚构数据', left: 'center' }, tooltip: { trigger: 'item', formatter: '{a} <br/>{b}: {c} ({d}%)' }, legend: { orient: 'vertical', left: 'left', data: ['分类A', '分类B', '分类C', '分类D'] }, series: [ { name: '访问来源', type: 'pie', radius: [0, '70%'], // 设置内外半径范围 center: ['50%', '50%'], roseType: 'area', // 使用面积模式绘制南丁格尔玫瑰图 itemStyle: { borderRadius: 8 }, labelLine: { length: 15, length2: 10 }, data: [ { value: 40, name: '分类A' }, { value: 30, name: '分类B' }, { value: 20, name: '分类C' }, { value: 10, name: '分类D' } ] } ] }; // 渲染表 myChart.setOption(option); ``` 上述代码中,`roseType: 'area'` 表示按照扇区面积的比例来绘制南丁格尔玫瑰图;如果将其改为 `roseType: 'radius'`,则会按照扇区半径的比例进行绘制。 #### 关键参数说明 - **`roseType`**: 控制是否启用南丁格尔玫瑰图以及其计算方式。可以选择 `'radius'`(基于半径比例)或者 `'area'`(基于面积比例)。默认情况下,该属性未开启。 - **`radius`**: 定义饼的大小范围,默认值为 `[0, '75%']`,表示从圆心到外圈占容器宽度的百分比。 - **`data`**: 数据数组,每项包含 `value` 值和对应的名称 `name`。 此外,在实际开发过程中,可能还需要自定义样式、动画以及其他交互功能。建议参考官方文档或实例进一步优化表展示效果[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值