• 复合式统计图绘制方法(6)


    复合式统计图绘制方法(6)
    常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。
    前几类图比较容易绘制,饼图环形图绘制较难。
    在统计图的应用方面,有时候有两个关联的统计学的样本值要用统计图来表达,一张统计图不能表达清楚,就要二张图来表达。由此就产生了复合式的统计图,它能将两个需要表达的统计概念统一在一张图表上阐述清楚。

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

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

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

    //在统计图表的样本值的计算方面,样本值的量的表现是一个方面,重点是量的对比,这是体现统计图目的的主要意义。其中最基本的是完成与计划的对比。

    //介绍一个基本的计算方法:
    //单个商品按类相加=单个商品销售总量
    //分组6个,各商品总量相加=商品销售总量
    //分析:完成和计划指标比
    //商品*单价=销售额
    //6个商品类销售额相加=商品销售总额
    //单个销售额/销售总额=单个商品类占比
    //占比分析:单个商品类销售总额/商品销售总额


    下面是绘制复合式统计图的代码:
    //变量: 可设置成全局变量或私有变量
    Canvas cs ;     //画布,绘制图表载体
    float pi=3.1415926535 ;
    float a ;            //三角函数 sin (a), cos (a), 
    float r ;             //圆半径 radius
    int i, j, n ;
    float x0,y0,x1,y1,x2,y2 ;  //作图
    float dx1,dy1,dx,dy ;             //中心坐标
    string ss, ss1, ss2,ss3 ;         //打印文字
     int p[6] ;        //set data   or  input  data
     double pn ;   //显示数据,计算
      int cr, cg, cb ;     //设置颜色 setColor (a,r,g,b) 
     int  p1[16],  p2[16], p3[16] ;
     int ppn ;   //计算
     int tb ;      //set tab
     int k0, k1 ;    //圆720线 起终点
     double sum1, sum2, sum3, sum ;  //统计计算
     double sum4, sum5, sum6 ;

    e433a433c9a8411b8725532b13fa3e64.png 

    //*************************  
    compound6 (){  //复合式统计图 6  双拼半圆环图
          cs.ClearDraw (0,src);   //清屏
          clearOutput();
          selectStyle () ; //图例样式选项设置
          cs.SetFillMode (1);//0不填色,1填色
             cs.SetColor (255,250,250,250);
          cs.DrawRect (0,4,720,600);   //back board
             cs.SetColor (255,140,140,140);
          cs.DrawRect (24,24,706,586);   //back      
             cs.SetColor (255,250,250,240);
          cs.DrawRect (20,20,700,580);   //back 
          cs.SetFillMode (0);//0不填色,1填色
             cs.SetColor (255,0,0,250);
          cs.DrawRect (20,20,700,580);   //back 
          cs.DrawRect (26,25,694,575);   //back 
      
      //复合式统计图样例:
      //图例 (上下双拼半圆环图)
         cs.SetFillMode (1);//0不填色,1填色
                dx=360;  dy=270 ;   //center
             cs.SetColor (255,250,200,230);
         cs.DrawRect (50,80,150,268);   //样本值标底
         cs.DrawRect (590,245,675,530);   //样本值标底
         cs.SetColor(255,250,220,230);
         cs.DrawCircle(dx,dy,200);    //center 图案底色
         cs.DrawCircle(dx,dy+10,200); //center 图案底色
              cs.SetStrokeWidth(1);    //线
              cs.SetTextStyle (0);  //1 粗体字
              cs.SetTextSize (24);
              cs.SetColor(255,0,0,250);
            cs.DrawText ("Group ",65,105);
            cs.DrawText ("Goods ",595,270);
               cs.SetTextSize (20);
            cs.DrawText (" A",55,135);
            cs.DrawText (" B",55,175);
            cs.DrawText (" C",55,215);
            cs.DrawText (" D",55,255);
      
     //先绘制部门半圆环图,
     //图例样本值:input data   
     //data : 商品类销售量 p(n)_8,部门销售额 p1(n)_4 
     
         p1[1]=6400; p1[2]=3500;
         p1[3]=4500; p1[4]=5600;  //部门 20000
            k[0]=720;     //k=180,12点钟方向为0位
                                 //k=0, 3点钟方向为0位
            k[1]=k[0]+p1[1]*72/2000 ;   //样本值合计20000
            k[2]=k[1]+p1[2]*72/2000 ;   //转换成整圆720线
            k[3]=k[2]+p1[3]*72/2000 ;
            k[4]=k[3]+p1[4]*72/2000 ;

              cs.SetColor(255,250,0,0);
              cs.DrawLine (50,dy,dx+200,dy);
                r=190 ;
        for (n=1; n<=4 ; n++){   //data=4
           for (i= k[n-1]; i<=k[n]; i++){  // +2 尾线闭合
                 a=pi/360*i/2 ;   // a/2 绘出的是半圆
           if (n==1) cs.SetColor(255,0,250,250);
           if (n==2) cs.SetColor(255,0,220,250);
           if (n==3) cs.SetColor(255,0,170,250);
           if (n==4) cs.SetColor(255,0,120,250);
                x0=(float)(r*cos (a))+dx ;     //r=radius
                y0=(float)(r*sin (a))+dy ;     //顺时针
         cs.DrawLine (dx,dy, x0,y0);      }
                 //逐线绘出加色标
         cs.DrawRect (75,n*40+72 ,140,n*40+102); 
               pn=p1[n]*10 ;     //保留1位小数
               pn=pn/2000 ; 
               ss1=doubleToString (pn)+"%" ;
               ss2=intToString (p1[n]) ;
           cs.SetColor(255,250,250,0);
            cs.DrawText(ss2, 85,n*40+93);   //色标
         cs.SetColor(255,250,0,250);  //图上标p1(n)
                ma=pi/360*((k[n-1]+k[n])/2)/2 ;
                x1=(float)((r-45)*cos (ma))+dx ;     
                y1=(float)((r-45)*sin (ma))+dy ;
              cs.DrawText (ss1,x1-27,y1+10);     //标字
                     cs.Update ();        } //show 饼图

    //再绘制商品大类销售额下半圆环
        p[1]=800;  p[2]=950;  p[3]=1200 ;  p[4]=1800;  
        p[5]=1500;  p[6]=1000;  p[7]=1150;  p[8]=1600 ;
            k[0]=0;     //k=180,12点钟方向为0位
                             //k=0, 3点钟方向为0位
            k[1]=k[0]+p[1]*72/1000 ;   //样本值合计10000
            k[2]=k[1]+p[2]*72/1000 ;   //转换成整圆720线
            k[3]=k[2]+p[3]*72/1000 ;
            k[4]=k[3]+p[4]*72/1000 ;
            k[5]=k[4]+p[5]*72/1000 ;
            k[6]=k[5]+p[6]*72/1000 ;
            k[7]=k[6]+p[7]*72/1000 ;
            k[8]=k[7]+p[8]*72/1000 ;
                  dx=360 ;  dy=280 ;
              cs.SetColor(255,250,0,0);
              cs.DrawLine (dx-200,dy-1,675,dy-1);
         for (n=1; n<=8 ; n++){   //data=4
           for (i= k[n-1]; i<=k[n]+2; i++){  // +2 尾线闭合
                 a=pi/360*i/2 ;   // a/2 绘出的是半圆
            cr=250-n*18 ;  cg=200-n*15 ;  cb=250 ;
            cs.SetColor(255,cr,cg,cb);   //紫色渐变
                 x0=(float)(r*cos (a))+dx ;     //r=radius
                 y0=(float)(r*sin (a))+dy ;     //顺时针
             cs.DrawLine (dx,dy, x0,y0);    //绘制饼图线
         cs.DrawRect (600,n*30+250 ,665,n*30+275); 
              cs.SetColor(255,250,230,240);
          cs.DrawCircle(dx,dy,80);    //可加空圆芯
                          }    //动画显示:逐线绘出加色标
               pn=p[n]*10 ;  //保留1位小数,标样本值和 %
               pn=pn/1000 ; 
               ss1=doubleToString (pn)+"%" ;
               ss2=intToString (p[n]) ;
           cs.SetColor(255,250,250,0);
               tb=0;
               if (p[n]<1000) tb=7 ;  //tab
           cs.DrawText(ss2, 610+tb,n*30+270);   //色标
         cs.SetColor(255,250,250,0);  //图上标p1(n)
                ma=pi/360*((k[n-1]+k[n])/2)/2 ;
                x1=(float)((r-45)*cos (ma))+dx ;     
                y1=(float)((r-45)*sin (ma))+dy ;
                cs.DrawText (ss1,x1-23,y1+5);     //标字
                     cs.Update ();        } // show 饼图

         for (n=1; n<=7 ; n++){   //绘制色块分隔线
            a=pi/360*k[n]/2 ;   // a/2 绘出的是半圆
                x2=(float)(r*cos (a))+dx ;     //r=radius
                y2=(float)(r*sin (a))+dy ;     //顺时针
              cs.SetColor(255,250,230,240);
              cs.DrawLine (dx,dy, x2,y2);    }

            cs.SetTextSize (80);
            cs.SetColor(255,0,0,250);      
            cs.DrawText (" 📛",293, 307) ;
      
    //题标:  艺术立体字制作
            cs.SetFillMode (1);//0不填色,1填色
            cs.SetTextStyle (1);
            cs.SetStrokeWidth(1);
            cs.SetTextSize (28);
            cs.SetColor(255,0,0,250);      
          cs.DrawText ("Art Graphics 📊",480,60) ;
          cs.SetTextSize (46);
             ss="复合统计图:双半圆环图" ;
          cs.SetColor(255,50,120,20);      //立体字
               cs.DrawText (ss,114,544);    //阴影
          cs.SetColor(255,0,250,0);
               cs.DrawText (ss,110,540);    //本字
          cs.SetFillMode (0);//0不填色,1填色
          cs.SetColor(255,250,150,0);
               cs.DrawText (ss,110,540);    //框线
           cs.Update ();
    }//compound6 ()

     


    //**** END *****************

  • 相关阅读:
    Docker-Compose
    机器学习入门四
    为什么大家都开始做游戏化产品?
    C# ZIP解压缩 模拟时钟
    【微信小程序】三分钟学会小程序的列表渲染
    【WebDriver】使用AutoIt上传文件
    ArgoDB 5.1 正式发布:多模融合、实时分析和数据安全多重升级
    Spring AOP
    凌恩客户文章|菜豆“不菜”——浙江省农科院新发现:菜用大豆和粮用大豆可能是独立训驯化
    一、访问控制修饰符
  • 原文地址:https://blog.csdn.net/baidu_41801770/article/details/136618672