人口结构统计图表绘制方法
在网络科技发展进步的当下,原来一些传统的统计图表都有了进一步的创新。以前企业的PPT都依赖微软的各应用软件来制作图表,现时企业的PPT展示的图表应用不再满足于Excle,Word等的图表绘制方法,进而使用一些第三方应用软件来制作新颖漂亮的图表。由此而有许多图表制作的应用软件面市。这些图表很吸引眼球,我对此也很感兴趣,故试着写了一些各种式样图表的绘制方法,供有同好的同行参考和评论。
新样式的统计图有复合式,堆叠式,展开式等等,不一而足。在美工艺术方面有许多独到新颖的样式,给人一个赏心悦目的感受。
人口结构统计图有一种宝塔图形式,今在此提供的此类图表的绘制方法供参考。
本方法采用C语言的最基本功能:
( 1) 绘图功能画线,画圆,画长方形。
(2) 界面美工设计,界面文字打印输出。
代码中有详细的注释,通俗易懂,一看就会。
在统计图表的样本值的计算方面,样本值的量的表现是一个方面,重点是量的对比,这是体现统计图目的的主要意义。
//*************************
下面是源码:
ArtGraphics10 (){
//人口结构统计图表,数据来自网络
cs.ClearDraw (0,src); //清屏
clearOutput();
selectStyle () ; //图例样式选项设置
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,230,250,250);
cs.DrawRect (0,2,720,1000); //back board
cs.SetColor (255,140,140,140);
cs.DrawRect (24,24,706,986); //back
cs.SetColor (255,250,250,250);
cs.DrawRect (20,20,700,980); //back
cs.SetFillMode (0);//0不填色,1填色
cs.SetColor (255,0,0,250);
cs.DrawRect (20,20,700,980); //back
cs.DrawRect (26,25,694,975); //back
p[1]=78; p[2]=90; p[3]=85; p[4]=73;
p[5]=75; p[6]=92; p[7]=124; p[8]=99;
p[9]=93; p[10]=114; p[11]=121; p[12]=101;
p[13]=73; p[14]=74; p[15]=50; p[16]=30;
p[17]=20; p[18]=11; p[19]=4; p[20]=1;
//中心绘制面上的四块渐进色饼图
cs.SetFillMode (1);//0不填色,1填色
cs.SetStrokeWidth(3); //线
dx=360 ; dy=280 ; r=165 ;
for (i=0 ; i<=180 ; i++){
a=pi/360*i ;
cs.SetColor(255,250-i/2 ,0,0);
x0=(float)(r*cos (a))+dx ; //r=radius
y0=(float)(r*sin (a))+dy ; //顺时针
x1=(float)((r-120)*cos (a))+dx ; //r=radius
y1=(float)((r-120)*sin (a))+dy ; //顺时针
cs.DrawLine (x1,y1, x0,y0); //绘环形
} //cs.Update () ; //动画式展示
for (i=0 ; i<=180 ; i++){
a=pi/360*(i+180) ;
cs.SetColor(255,250-i/2 ,0,0);
x0=(float)(r*cos (a))+dx ; //r=radius
y0=(float)(r*sin (a))+dy ; //顺时针
x1=(float)((r-120)*cos (a))+dx ; //r=radius
y1=(float)((r-120)*sin (a))+dy ; //顺时针
cs.DrawLine (x1,y1, x0,y0); //绘环形
} //cs.Update () ; //动画式展示
for (i= 0; i<=180; i++){
a=pi/360*(i+360) ;
cs.SetColor(255,250-i/2 ,0,0);
x0=(float)(r*cos (a))+dx ; //r=radius
y0=(float)(r*sin (a))+dy ; //顺时针
x1=(float)((r-120)*cos (a))+dx ; //r=radius
y1=(float)((r-120)*sin (a))+dy ; //顺时针
cs.DrawLine (x1,y1, x0,y0); //绘环形
} //cs.Update () ; //动画式展示
for (i= 0; i<=180; i++){
a=pi/360*(i+540) ;
cs.SetColor(255,250-i/2 ,0,0);
x0=(float)(r*cos (a))+dx ; //r=radius
y0=(float)(r*sin (a))+dy ; //顺时针
x1=(float)((r-120)*cos (a))+dx ; //r=radius
y1=(float)((r-120)*sin (a))+dy ; //顺时针
cs.DrawLine (x1,y1, x0,y0); //绘环形
} //cs.Update () ; //动画式展示
cs.SetStrokeWidth(3); //线
cs.SetColor(255,160 ,0,100);
for (n=0; n<=27 ; n++){
cs.DrawLine (265, 268,250+n,283) ;
cs.DrawLine (457, 295,443+n,280) ;
cs.DrawLine (359, 167+n,375,181) ;
cs.DrawLine (362, 368+n,345,380) ; }
//16岁以下:25337万,17.97%
//16-45岁:55556万,39.41%
//46-65岁:41016万,29.10%
//66岁以上:19059万,13.52%
cs.SetColor(255,250 ,250,0);
cs.SetTextSize (18);
cs.DrawText ("16岁以下 ", 390,190);
cs.DrawText ("青少年人群 ", 390 ,210);
cs.DrawText ("2. 5337亿 ", 390 ,230);
cs.DrawText ("17.97% ", 390 ,250); //标字
cs.DrawText ("16-45岁 ", 390,320);
cs.DrawText ("青壮劳动力", 390 ,340);
cs.DrawText ("5. 5556亿 ", 390 ,360);
cs.DrawText ("39.41% ", 390 ,380); //标字
cs.DrawText ("46-65岁 ", 250,320);
cs.DrawText ("后备劳动力 ", 250 ,340);
cs.DrawText ("4. 1016亿 ", 250 ,360);
cs.DrawText ("29.10% ", 250 ,380); //标字
cs.DrawText ("66岁以上 ", 250,190);
cs.DrawText ("老年化人群 ", 250 ,210);
cs.DrawText ("1. 9059亿 ", 250 ,230);
cs.DrawText ("13.52% ", 250 ,250); //标字
//绘制外圈下半环(按年龄不等半径展示样本值)
for (n=1; n<=20 ; n++){ //data=20
r=p[n]/2+170; //半径依样本值大小(不等半径)
cr=50+n*10; cg=250-n*10 ; cb=0 ;
k0=n*36-36 ; k1=k0+36 ;
for (i= k0+3; i<=k1-3; i++){ //show
cs.SetColor(255,cr,cg,cb);
a=pi/360*i/2;
x0=(float)(r*cos (a))+dx ; //r=radius
y0=(float)(r*sin (a))+dy ; //顺时针
x1=(float)(170*cos (a))+dx ; //r=radius
y1=(float)(170*sin (a))+dy ; //顺时针
cs.DrawLine (x1,y1,x0,y0); //动画式逐线显示
cs.DrawRect (50,n*27+20,100,n*27+45); //色标
cs.SetTextSize (16);
ss=intToString (p[n]);
tb=0 ;
if (p[n]<10) tb=11 ; //居中
if (p[n]>9&&p[n]<100) tb=6 ;
cs.SetColor(255,250,250,0); //标值
cs.DrawText (ss, 60+tb,38+n*27); } //标样本值
cs.Update (); } //绘制,动画显示
cs.SetStrokeWidth(1); //标样本值标分隔线
for (n=1 ; n<=21 ; n++){ //data=20
r=p[n]/2+170 ; //半径依样本值大小
k0=n*36-36 ; k1=k0+36 ;
ma=pi/360*k0/2 ;
x0=(float)(r*cos (ma))+dx; //r=radius
y0=(float)(r*sin (ma))+dy;
ma=pi/360*k0/2 ;
x1=(float)(170*cos (ma))+dx; //r=radius
y1=(float)(170*sin (ma))+dy;
cs.SetColor(255,250,0,0); //图上标线
// cs.DrawLine (x0,y0,x1,y1) ; //分隔线
ma=pi/360*(k0-18)/2 ;
x2=(float)(190*cos (ma))+dx; //r=radius
y2=(float)(190*sin (ma))+dy;
cs.SetTextSize (14);
pn=n*10/2-5 ;
kn=(int)pn ;
ss=intToString (kn);
cs.SetColor(255,0,0,250); //图上标值
cs.DrawText (ss,x2-10 ,y2+5); } //标字
//绘制外圈上半环(不等半径展示样本值)
cs.SetStrokeWidth(3); //标样本值标分隔线
for (n=1; n<=20 ; n++){ //data=20
r=p[n]/2+170; //半径依样本值大小(不等半径)
cr=220-n*5; cg=80 ; cb=230 ;
k0=n*36-36 ; k1=k0+36 ;
for (i= k0+3; i<=k1-3; i++){ //show
cs.SetColor(255,cr,cg,cb);
a=pi/360*i/2;
x0=(float)(r*cos (a))+dx ; //r=radius
y0=(float)(-r*sin (a))+dy ; //逆时针
x1=(float)(170*cos (a))+dx ; //r=radius
y1=(float)(-170*sin (a))+dy ; //逆时针
cs.DrawLine (x1,y1,x0,y0); } //绘线
cs.Update (); } //动画式逐线显示
cs.SetStrokeWidth(1); //标样本值标分隔线
for (n=1 ; n<=20; n++){ //data=20
r=p[n]/2+170 ; //半径依样本值大小
k0=n*36 ; k1=k0+36 ;
ma=pi/360*k0/2 ;
x0=(float)(r*cos (ma))+dx; //r=radius
y0=(float)(-r*sin (ma))+dy;
ma=pi/360*k0/2 ;
x1=(float)(170*cos (ma))+dx; //r=radius
y1=(float)(-170*sin (ma))+dy;
cs.SetColor(255,250,0,0); //图上标线
// cs.DrawLine (x0,y0,x1,y1) ; //分隔线
ma=pi/360*(k0-18)/2 ;
x2=(float)(190*cos (ma))+dx; //r=radius
y2=(float)(-190*sin (ma))+dy;
cs.SetTextSize (14);
ss=intToString (p[n]);
cs.SetColor(255,0,0,250); //图上标值
cs.DrawText (ss,x2-10 ,y2+5); } //标字
cs.SetColor(255,250 ,0,0);
cs.DrawRect (520,282,620,284) ;
cs.SetTextSize (18);
cs.DrawText ("单位:百万 ", 35,605);
cs.DrawText ("人数 ", 580 ,270); //标字
cs.DrawText ("年龄 ", 580 ,308); //标字
//绘制金字塔人口结构图
dx=360 ; dy=920 ;
for (n=1 ; n<=20 ; n++){ //data=20
cr=220-n*5; cg=80 ; cb=230 ;
cs.SetColor(255,cr,cg,cb);
dx1=dx-p[n]*2 ; dy1=dy-n*17 ;
cs.DrawRect (dx-3, dy1, dx1, dy1+15) ;
cs.SetTextSize (16);
ss=intToString (p[n]);
tb=0 ;
if (p[n]<10) tb=14 ; //居中
if (p[n]>9&&p[n]<100) tb=8 ;
cs.DrawText (ss, dx1-34+tb,dy1+14); //标样本值
cr=50+n*10; cg=250-n*10 ; cb=0 ;
cs.SetColor(255,cr,cg,cb);
dx1=dx+p[n]*2+2 ; dy1=dy-n*17 ;
cs.DrawRect (dx+3, dy1, dx1, dy1+15) ;
kn=n*5 ;
ss1=intToString (kn);
tb=0 ;
if (p[n]<10) tb=12 ;
if (p[n]>9) tb=6 ;
cs.DrawText (ss1, dx1+tb,dy1+14); //标样本值
} //show table
cs.DrawText ("人数 | 年龄 ", 300,955);
cs.DrawText ("120 100 80 60 40 20 " , 103,935) ;
cs.DrawText ("20 40 60 80 100 120 " , 393,935) ;
for (i=0; i<7; i++){ //grid line
cs.SetColor (255,220,220,220) ;
dx1=359-i*40 ; dx2=361+i*40 ;
cs.DrawLine (dx1, 578,dx1, 923) ;
cs.DrawLine (dx2, 578,dx2, 923) ; }
//题标: 艺术立体字制作
cs.SetFillMode (1);//0不填色,1填色
cs.SetTextStyle (1);
cs.SetStrokeWidth(1);
cs.SetTextSize (28);
cs.SetColor(255,0,0,250);
cs.DrawText ("Infographics 📊",480,60) ;
cs.SetTextSize (40);
cs.DrawText ("👪 ", 337 ,292); //标字
ss="2023 年中国人口年龄结构图" ;
cs.SetColor(255,50,120,20); //立体字
cs.DrawText (ss,124,564); //阴影
cs.SetColor(255,0,250,0);
cs.DrawText (ss,120,560); //本字
cs.SetFillMode (0);//0不填色,1填色
cs.SetColor(255,250,150,0);
cs.DrawText (ss,120,560); //框线
cs.Update ();
}//ArtGraphics10 ()
//**** END *****************