JavaScript+svg绘制的一个饼状图

svg参考:https://www.w3.org/TR/SVG/

<body onload=‘document.body.appendChild(
		pieChart([12,23,34,45],640,400,200,200,150,
			["red","blue","yellow","green"],
			["North","South","East","West"],400,100));
‘>
<!-- <object data="./sample.svg" type="image/svg+xml" width="300px" height="300px" /> -->
<script type="text/javascript">
/**
 * 创建一个<svg>元素,并在其中绘制一个饼状图
 * 参数:
 * 		data:用于绘制的数字类型的数组,数组每一项都表示饼状图的一个楔
 * 		width,height: SVG图形的大小,单位为像素
 * 		cx cy r :  饼状图的圆心及半径
 * 		colors:  一个包含HTML颜色信息的数组,每种颜色代表饼状图每个楔的颜色
 * 		labels:  一个标签数组,该信息说明饼状图中每个楔代表的含义
 * 		lx  ly:  饼状图的左上角
 * 	返回:
 * 		一个保存饼状图的<svg>元素
 * 		调用者必须将返回的元素插入到文档中
 */

function pieChart( data , width,height,cx,cy,r,colors,labels,lx,ly){
	//这个是表示svg元素的XML命名空间
	var svgns = "http://www.w3.org/2000/svg";

	//创建一个<svg>元素,同时制定像素大小和用户坐标
	var chart = document.createElementNS(svgns,"svg:svg");
	chart.setAttribute("width",width);
	chart.setAttribute("height",height);
	chart.setAttribute("viewBox","0 0 "+width+" "+height);

	//累加data的值,以便于知道饼状图的大小
	var total = 0;
	for(var i = 0 ; i < data.length ; i++)
		total += data[i];

	//现在计算出饼状图每个分片的大小,其中角度以弧度制计算
	var angles = [];
	for( var i = 0; i<data.length ; i++)
		angles[i] = data[i]/total*Math.PI*2;

	//遍历饼状图的每个分片
	startangle = 0 ;
	for(var i = 0 ; i < data.length ; i++){
		//这里表示楔的结束位置
		var endagle = startangle+angles[i];

		//计算出楔和园相交的两个点
		//这些计算公式都是以12点钟方向为0度
		//顺时针方向角度递增
		var x1 = cx+r*Math.sin(startangle);
		var y1 = cy-r*Math.cos(startangle);
		var x2 = cx+r*Math.sin(endagle);
		var y2 = cx-r*Math.cos(endagle);

		//这个标记表示角度大于半圆
		//此标记在绘制svg弧形组件的时候需要
		var big = 0;
		if(endagle - startangle > Math.PI)
			big = 1;

		//使用<svg:path>元素来描述楔
		//要注意的是,使用createElementNS()来创建该元素
		var path = document.createElementNS(svgns , "path");

		//下面的字符串包含路径的详细信息
		var d= "M " + cx + "," + cy + //从圆心开始
			" L " + x1 + "," + y1 + 	//画一条到(x1,y1)的线段
			" A " + r + "," + r +		//再画一条半径为r的弧
			" 0 " + big + " 1 " +		//弧的详细信息
			x2 + "," + y2 +				//弧到(x2,y2)结束
			" Z";						//当前路径到(cx,cy)结束

		//设置<svg:path>元素的属性
		path.setAttribute("d",d);				//设置路径
		path.setAttribute("fill",colors[i]);	//设置楔的颜色
		path.setAttribute("stroke","black");	//楔的外边框为黑色
		path.setAttribute("stroke-width","2");	//两个单位宽
		chart.appendChild(path);				//将楔加入到饼状图中

		//当前楔的结束就是下一个楔的开始
		startangle = endagle;

		//现在绘制一些相应的小方块来表示图例
		var icon = document.createElementNS(svgns,"rect");
		icon.setAttribute("x",lx);				//定位小方块
		icon.setAttribute("y",ly+30*i);
		icon.setAttribute("width",20);			//设置小方块的大小
		icon.setAttribute("height",20);
		icon.setAttribute("fill",colors[i]);	//填充小方块的颜色和对应的楔的颜色相同
		icon.setAttribute("stroke","black");	//子外边框颜色也相同
		icon.setAttribute("stroke-width","2");	//两个单位宽
		chart.appendChild(icon);				//添加到饼状图中

		//在小方块的右边添加标签
		var label = document.createElementNS(svgns,"text");
		label.setAttribute("x",lx+30);			//定位标签文本
		label.setAttribute("y",ly+30*i+18);
		//文本样式属性还可以通过CSS来设置
		label.setAttribute("font-size","16");
		label.setAttribute("font-family","sans-serif");
		//在<svg:text>元素中添加一个DOM文本节点
		label.appendChild(document.createTextNode(labels[i]));
		chart.appendChild(label);			//将文本添加到饼状图中
	}
	return chart;
}
</script>

  

时间: 2024-10-23 23:40:48

JavaScript+svg绘制的一个饼状图的相关文章

Android开发自定义控件实现一个饼状图

实现一个如图所示的控件,包括两部分,左边的饼状图和中间的两个小方块,及右边的两行文字 实现起来比较简单,只是一些绘图API的调用 核心代码在onDraw函数里边,,对静态控件进行绘制即可 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); /*饼状图的x坐标*/ float centreX= getWidth()/5; /*饼状图的y坐标*/ float centreY= getHeight()/2; /*

JavaScript+svg绘制的一个动态时钟

结果图: 代码如下: <!DOCTYPE html> <html> <head> <title>动态时钟</title> </head> <body > <script type="text/javascript"> function updateTime(){ //更新svg时钟来显示当前时间 var now =new Date(); //当前时间 var min = now.getMin

javascript将数据展示成饼状图、柱状图和折线图

本文以展示柱状图为例进行介绍,当然这仅仅是一种方法而已:还有很多方法可以用于展示图表,例如自定义图表标签.使用jfreechart插件等: 1.导入js文件,包含了很多展示方法: <script type="text/javascript" src=<select:link page="/js/ChartObject.js"/>></script> <script type="text/javascript&quo

【应用】SVG饼状图

<!DOCTYPE html> <html> <head> <title></title> </head> <body onload="document.body.appendChild( pieChart([12,23,34,45],640,400,200,200,150, ['red','blue','yellow','green'], ['North','South','East','West'],400,100

【 D3.js 入门系列 --- 9.1 】 饼状图的制作

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 这一节用 Layout 做一个饼状图.第9节中说过, Layout 的作用只是转换数据,将不适合图形化的数据转化成适合图形化的数据.现在使用以下数据: var dataset = [ 30 , 10 , 43 , 55 , 13 ]; 这个数据要不能直接用于画饼状图,我们必须通过计算将它转换成角度.这个计算不需要我们手动计算,因为 D3 中提供了 d3.layo

D3.js的v5版本入门教程(第十三章)—— 饼状图

D3.js的v5版本入门教程(第十三章) 这一章我们来绘制一个简单的饼状图,我们只绘制构成饼状图基本的元素——扇形.文字,从这一章开始,内容可能有点难理解,因为每一章都会引入比较多的难理解知识点,在这里作者本人也只是粗略的讲解每个新知识点的意思!如果不是很理解的话,需要读者自行查看官网API 为了绘制一个饼状图,我们还是需要以下新的知识点 d3.arc( {} ),弧形生成器,用以绘制弧形,需要传入一些用以绘制弧形基本的数据的对象,例如,该对象的属性可以包括(我用官网api的示例) d3.pie

使用JS charts来画图表(二)——饼状图

如上是一个饼状图: 代码如下: <html> <head> <title>部门管理</title> <script type="text/javascript" src="codebase/jscharts.js"></script> </head> <body> <div id="graph">Loading graph...</d

FusionChart实现柱状图、饼状图的动态数据显示 附Demo

最近做的项目中需要用饼状图显示——'问卷调查'的统计结果(之前用过FusionChart做过柱状图的数据展示,那还是两年前的事了),在网上查了下FusionChart实现饼状图显示方面的资料,却发现资料都比较零散.不完整,或者说没有简洁明了的说清楚其用法,到FusionChart官网上去看,无奈是英文的,而且Deom项目太大,没有耐心去看,最后还是将以前的项目找出来,摸索着弄了下搞定,现将FusionChart实现柱状图.饼状图的动态数据显示的方法和经验写出来,希望对做web开发需要的朋友能有所

用canvas绘制的饼状图,6等分,颜色随机

都说程序员懒,生活还是不能懒的,比如洗头.洗脸,当然也包括是分享咯.下面分享一下我用H5的新标签canvas绘制的饼状图,颜色是随机生成的,动态生成6等分,我还做了随机生成数据的, 配上文字,每份所占的比例就显而意见.,这点用在分析数据还是挺好的.图片如下; canvas 是 HTML5 提供的一个用于展示绘图效果的标签. canvas 原意画布, 帆布. 在 HTML 页面中用于展示绘图效果. 最早 canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现.. 基本使用语法: 使用