统计图饼图绘制方法(C语言)
常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。
前几类图比较容易绘制,饼图绘制较难。今值此介绍饼图的绘制方法。
本方法采用C语言的最基本功能:
( 1.) 绘图功能画线,画圆,画长方形。
(2) 界面美工设计,界面文字打印输出。
代码中有详细的注释,通俗易懂,一看就会。
下面是绘制饼图的代码:
//变量: 可设置成全局变量或私有变量
Canvas cs ; //画布,绘制图表载体
float pi=3.1415926535 ;
float a ; //三角函数 sin (a), cos (a),
float r ; //圆半径 radius
int i, j, n ;
float x0,y0,x1,y1 ; //作图坐标
float dx,dy ; //中心坐标
string ss, ss1, ss2 ; //打印文字
//饼图的代码 PieGraph ( ):
PieGraph ( ) { //绘制饼图和突出显示图块
int p[6] ; //set data or get data
int k[6] ; //作图数据换算
double pn ; //显示百分比数 " 29.16% "
int setn ; //突出图块选项
double ma ; //图上标文字 " 29.16% "
cs.ClearDraw (0,src); //清屏(cls), clear screen
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,250,250,250);
cs.DrawRect (0,4,720,600); //画图表底板
cs.SetColor (255,140,140,140);
cs.DrawRect (24,24,706,586); //back
cs.SetColor (255,230,240,250);
cs.DrawRect (20,20,700,580); //back
cs.SetFillMode (0); //0不填色,1填色
cs.SetColor (255,0,0,240);
cs.DrawRect (20,20,700,580); //框线
cs.DrawRect (24,24,696,576); //框线
cs.SetFillMode (1); //0不填色,1填色
cs.SetTextSize (28); //题标
cs.SetColor (255,0,0,250);
cs.DrawText ("达克科技⚛DUCK",470,60) ;
cs.SetStrokeWidth(2);
//图例: 图表底板宽高 720 *600
dx=360 ; dy=300 ; //center
cs.SetColor(255,250,240,240);
cs.DrawCircle(dx,dy,128); //图底板圆形
cs.SetTextStyle (0);
cs.SetTextSize (18);
r=120 ; //radius
setn=1 ; //突出图块选项
p[1]=210; p[2]=165; p[3]=115; p[4]=135; p[5]=95;
//预设置数据 p (5)
//*本图例预设置数据,可另行设计数据输入方法
//为保证图案填充色需增加线条密度,故作图整个
//圆分为 720 线,data p(n) 凑数成720。
//*若其他数据项要按比例换算成总数相加为720的数。
//若数据项和不满 720 图样就变为扇形。
//输入数据 p(n) 转换成绘图数据值 k(n)
k[0]= -180;
k[1]=k[0]+p[1];
k[2]=k[1]+p[2];
k[3]=k[2]+p[3];
k[4]=k[3]+p[4];
k[5]=k[4]+p[5];
for (n=1; n<=5 ; n++){ //data=5,绘制饼图
for (i= k[n-1] ; i<=k[n] ; i++){ //draw Piegraph
a=pi/360*i ; //** a/2 绘出的是半圆图形
if (n==1) cs.SetColor(255,0,250,0);
if (n==2) cs.SetColor(255,240,140,0);
if (n==3) cs.SetColor(255,250,0,0);
if (n==4) cs.SetColor(255,140,40,220);
if (n==5) cs.SetColor(255,0,150,180);
x0=(float)(r*cos (a))+dx; //r=radius
y0=(float)(r*sin (a))+dy;
cs.DrawLine (dx,dy,x0,y0); //逐线绘出
cs.DrawRect (100,n*50,195,30+n*50); //色标
//** print data as "29.16%"
s=intToString (p[n]);
cs.DrawText (s, 60,20+n*50);
pn=p[n]*10000/720 ; //扩大100, +"%"
pn=pn/100 ; //保留2位小数
ss1=doubleToString (pn)+"%" ;
cs.SetColor(255,250,250,250);
cs.DrawText (ss1,120,20+n*50);
if (n==1&&setn==1) ss2=ss1 ;
if (n==2&&setn==2) ss2=ss1 ;
cs.SetColor(255,0,0,150); //图上标( n% )
ma=pi/360*((k[n-1]+k[n])/2) ;
x1=(float)((r-45)*cos (ma))+dx-30;
y1=(float)((r-35)*sin (ma))+dy ;
cs.DrawText (ss1,x1,y1);
//*画环图方法: 中心加圆是环图,不加圆是饼图
//cs.SetColor(255,250,240,240);
//cs.DrawCircle(dx,dy,50); //中心加圆是环图
cs.Update (); } } //逐线动画显示绘制过程
//* 演示绘制重点突出的图块,暂设图例1 和 图例2
//* 展示二种画法 //***
//*本图例预设置,可另设计图表点击选取或其他选项方法 。
// 预设 setn=1 ; 0=无,setn1-5 可选。
// for (i= k[0] ; i<=k[1] ; i++){ 设置通用 k (n) , kstart to kend 即可
//*此方法可改写为 setn1-setn5 通用方法。
sleep (500) ; //延时
if (setn==1){
for (i= k[0] ; i<=k[1] ; i++){ //銷隐图块,圆底色遮罩
a=pi/360*i ;
cs.SetColor (255,250,240,240);
x0=(float)(r*cos (a))+dx;
y0=(float)(r*sin (a))+dy;
cs.DrawLine (dx,dy,x0,y0); }
cs.Update (); //銷隐
for (i= k[0] ; i<=k[1] ; i++){ //绘出突出图块
a=pi/360*i ;
cs.SetColor (255,0,240,0);
x0=(float)(r*cos (a))+dx+8 ;
y0=(float)(r*sin (a))+dy-6 ;
cs.DrawLine (dx+8,dy-6,x0,y0); //draw out
cs.SetColor (255,250,250,0);
cs.SetTextSize (20); //show text
cs.DrawText (ss2,dx+20,dy-42) ;
cs.Update (); } } //setn=1, 绘出突出色块
if (setn==2){
for (i= k[1] ; i<=k[2] ; i++){ //銷隐图块
a=pi/360*i ;
cs.SetColor (255,250,240,240);
x0=(float)(r*cos (a))+dx;
y0=(float)(r*sin (a))+dy;
cs.DrawLine (dx,dy,x0,y0); }
cs.Update (); //銷隐
a=pi/360*((k[1]+k[2])/2) ; //*** 这是第二种画法
x1=(float)(10*cos (a))+dx ;
y1=(float)(10*sin (a))+dy ;
for (i= k[1] ; i<=k[2] ; i++){ //绘出突出图块
a=pi/360*i ;
cs.SetColor (255,240,140,0);
x0=(float)(r*cos (a))+x1; //***
y0=(float)(r*sin (a))+y1; //***
cs.DrawLine (x1,y1,x0,y0); //*** draw out
cs.SetColor (255,250,250,0);
cs.SetTextSize (20); //show text
cs.DrawText (ss2,x1+15,y1+60) ; //***
cs.Update (); } } //setn=2, 绘出突出色块
//绘制立体字
cs.SetFillMode (1); //0不填色,1填色
cs.SetTextSize (60);
cs.SetTextStyle (1);
cs.SetStrokeWidth(1);
ss="统计图 - 饼图" ;
cs.SetColor(255,50,120,20);
cs.DrawText (ss,154,524); //阴影
cs.SetColor(255,0,200,250);
cs.DrawText (ss,150,520); //本字
cs.SetFillMode (0); //0不填色,1填色
cs.SetColor(255,250,0,0);
cs.DrawText (ss,150,520); //框线
cs.Update (); //显示
}//PieGraph ()
//**** END *****************