人口结构统计图表绘制方法

人口结构统计图表绘制方法
在网络科技发展进步的当下,原来一些传统的统计图表都有了进一步的创新。以前企业的PPT都依赖微软的各应用软件来制作图表,现时企业的PPT展示的图表应用不再满足于Excle,Word等的图表绘制方法,进而使用一些第三方应用软件来制作新颖漂亮的图表。由此而有许多图表制作的应用软件面市。这些图表很吸引眼球,我对此也很感兴趣,故试着写了一些各种式样图表的绘制方法,供有同好的同行参考和评论。

新样式的统计图有复合式,堆叠式,展开式等等,不一而足。在美工艺术方面有许多独到新颖的样式,给人一个赏心悦目的感受。
人口结构统计图有一种宝塔图形式,今在此提供的此类图表的绘制方法供参考。

本方法采用C语言的最基本功能:
( 1) 绘图功能画线,画圆,画长方形。
(2) 界面美工设计,界面文字打印输出。
代码中有详细的注释,通俗易懂,一看就会。

在统计图表的样本值的计算方面,样本值的量的表现是一个方面,重点是量的对比,这是体现统计图目的的主要意义。

fd0c1612d8244964b36bf0166397955a.png 

//*************************  
下面是源码:
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 *****************
 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-06 03:00:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-06 03:00:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-06 03:00:03       87 阅读
  4. Python语言-面向对象

    2024-04-06 03:00:03       96 阅读

热门阅读

  1. 设计模式:原型模式

    2024-04-06 03:00:03       43 阅读
  2. deepspeed学习-多机all_reduce

    2024-04-06 03:00:03       31 阅读
  3. Kubernetes学习笔记6

    2024-04-06 03:00:03       42 阅读
  4. 威胁建模与网络安全测试方法

    2024-04-06 03:00:03       42 阅读
  5. 2024.3.24力扣每日一题——零钱兑换

    2024-04-06 03:00:03       35 阅读
  6. 2024/4/2 HarmonyOS学习笔记一TS数据类型

    2024-04-06 03:00:03       36 阅读
  7. matlab学习(二)(4.2-4.8)

    2024-04-06 03:00:03       32 阅读
  8. 【趣味学算法】11_黑洞数

    2024-04-06 03:00:03       36 阅读
  9. postcss安装和使用

    2024-04-06 03:00:03       40 阅读
  10. 【WPF应用26】C#中的CheckBox控件详解与应用示例

    2024-04-06 03:00:03       43 阅读