不用库js饼图

javascript,// 创建饼图的函数,不使用任何库,function createPieChart(data) {, const canvas = document.createElement('canvas');, canvas.width = 300;, canvas.height = 300;, const ctx = canvas.getContext('2d');, let startAngle = 0;, data.forEach((item, index) => {, const endAngle = startAngle + 2 Math.PI (item / 100);, ctx.fillStyle = hsl(${index 60}, 100%, 50%);, ctx.beginPath();, ctx.moveTo(150, 150);, ctx.arc(150, 150, 150, startAngle, endAngle);, ctx.closePath();, ctx.fill();, startAngle = endAngle;, });, document.body.appendChild(canvas);,}// 示例数据,createPieChart([20, 30, 50]);,

在不使用任何外部库的情况下,用原生JavaScript绘制饼图是一项具有挑战性但可实现的任务,以下是详细的步骤和代码示例,帮助你理解如何实现这一目标。

不用库js饼图

创建HTML结构

我们需要一个基本的HTML结构来容纳我们的饼图,这个结构包括一个<canvas>元素,用于绘制图形。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Pie Chart with Pure JavaScript</title>
    <style>
        canvas {
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <canvas id="pieCanvas" width="600" height="400"></canvas>
    <script src="piechart.js"></script>
</body>
</html>

准备数据

我们准备一些数据来绘制饼图,假设我们有一组数据表示不同类别的销售额。

const data = [
    { label: 'Category A', value: 30 },
    { label: 'Category B', value: 70 },
    { label: 'Category C', value: 50 },
    { label: 'Category D', value: 20 }
];

计算总值和每个部分的角度

为了绘制饼图,我们需要计算每个部分所占的角度,整个圆的角度是360度,因此每个部分的角度可以通过以下公式计算:

[ text{角度} = left( frac{text{部分值}}{text{总值}} right) times 360^circ ]

const totalValue = data.reduce((acc, item) => acc + item.value, 0);
const angles = data.map(item => (item.value / totalValue)  360);

获取画布上下文并设置初始参数

我们需要获取<canvas>元素的上下文,并设置一些初始参数,如中心点、半径等。

不用库js饼图

const canvas = document.getElementById('pieCanvas');
const ctx = canvas.getContext('2d');
const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
const radius = Math.min(centerX, centerY) 20; // 留出一些边距
let startAngle = 0;

绘制饼图

现在我们可以开始绘制饼图了,我们将遍历每个数据项,并绘制相应的扇形。

data.forEach((item, index) => {
    const endAngle = startAngle + angles[index];
    ctx.beginPath();
    ctx.moveTo(centerX, centerY);
    ctx.arc(centerX, centerY, radius, startAngle, endAngle);
    ctx.closePath();
    ctx.fillStyle = getRandomColor(); // 随机颜色函数(稍后定义)
    ctx.fill();
    // 添加标签
    const textX = centerX + (radius / 2)  Math.cos(startAngle + (endAngle startAngle) / 2);
    const textY = centerY + (radius / 2)  Math.sin(startAngle + (endAngle startAngle) / 2);
    ctx.fillStyle = '#000';
    ctx.fillText(item.label, textX, textY);
    startAngle = endAngle;
});

随机颜色生成函数

为了让每个扇形有不同的颜色,我们可以编写一个简单的随机颜色生成函数。

function getRandomColor() {
    const letters = '0123456789ABCDEF';
    let color = '#';
    for (let i = 0; i < 6; i++) {
        color += letters[Math.floor(Math.random()  16)];
    }
    return color;
}

完整代码示例

将上述所有部分组合在一起,我们得到一个完整的饼图绘制脚本。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Pie Chart with Pure JavaScript</title>
    <style>
        canvas {
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <canvas id="pieCanvas" width="600" height="400"></canvas>
    <script>
        const data = [
            { label: 'Category A', value: 30 },
            { label: 'Category B', value: 70 },
            { label: 'Category C', value: 50 },
            { label: 'Category D', value: 20 }
        ];
        const totalValue = data.reduce((acc, item) => acc + item.value, 0);
        const angles = data.map(item => (item.value / totalValue)  360);
        const canvas = document.getElementById('pieCanvas');
        const ctx = canvas.getContext('2d');
        const centerX = canvas.width / 2;
        const centerY = canvas.height / 2;
        const radius = Math.min(centerX, centerY) 20; // 留出一些边距
        let startAngle = 0;
        function getRandomColor() {
            const letters = '0123456789ABCDEF';
            let color = '#';
            for (let i = 0; i < 6; i++) {
                color += letters[Math.floor(Math.random()  16)];
            }
            return color;
        }
        data.forEach((item, index) => {
            const endAngle = startAngle + angles[index];
            ctx.beginPath();
            ctx.moveTo(centerX, centerY);
            ctx.arc(centerX, centerY, radius, startAngle, endAngle);
            ctx.closePath();
            ctx.fillStyle = getRandomColor(); // 随机颜色函数(稍后定义)
            ctx.fill();
            // 添加标签
            const textX = centerX + (radius / 2)  Math.cos(startAngle + (endAngle startAngle) / 2);
            const textY = centerY + (radius / 2)  Math.sin(startAngle + (endAngle startAngle) / 2);
            ctx.fillStyle = '#000';
            ctx.fillText(item.label, textX, textY);
            startAngle = endAngle;
        });
    </script>
</body>
</html>

FAQs

Q1: 如何调整饼图的大小?

A1: 你可以通过修改<canvas>元素的widthheight属性来调整饼图的大小,确保在JavaScript中相应地调整centerXcenterY的值,以保持饼图居中显示,如果将宽度和高度设置为800×600,那么centerX应为400,centerY应为300。

不用库js饼图

Q2: 如何为每个扇形指定特定的颜色而不是随机颜色?

A2: 你可以在数据数组中添加一个color属性,为每个扇形指定特定的颜色,然后在绘制时使用该颜色。

const data = [
    { label: 'Category A', value: 30, color: '#FF6347' }, // Tomato
    { label: 'Category B', value: 70, color: '#4682B4' }, // SteelBlue
    { label: 'Category C', value: 50, color: '#32CD32' }, // LimeGreen
    { label: 'Category D', value: 20, color: '#FFD700' }  // Gold
];

然后在绘制扇形时,使用ctx.fillStyle = item.color;来设置颜色。

原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1663519.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希
上一篇 2025-03-24 23:51
下一篇 2024-08-14 21:21

相关推荐

  • common.min.js

    common.min.js 是一个常见的 JavaScript 文件名,通常用于存放网站或应用程序中常用的函数和工具。

    2025-03-24
    01
  • common name 服务器

    “Common Name” 在服务器上下文中通常指的是SSL/TLS证书中的通用名称,用于标识服务器的身份。它确保了客户端与正确的服务器建立安全连接。

    2025-03-24
    05
  • com和top域名一样吗

    不一样。com 是国际通用顶级域名,常用于商业机构等;top 也是顶级域名,有 “顶尖、高端” 之意,二者在含义和用途上有区别。

    2025-03-24
    011
  • common js 编译

    CommonJS 是一种模块化规范,主要用于服务器端 JavaScript 编程。它通过 require 和 module.exports 来实现模块的导入和导出。

    2025-03-24
    017

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入