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

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

今在此提供一种复合式统计图的绘制方法供参考。
对于样本值的处理,代码中提供了一种计算方法。

 

b519a197e3604b3f96d4b5a0c5234079.png

 

下面是绘制复合式统计图( 雷达图 外套环形图 )的代码:
//变量: 可设置成全局变量或私有变量
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 ;         //打印文字
 int p[6] ;        //set data or  input  data
 double pn ;   //显示数据
  int cr, cg, cb ;     //设置颜色 setColor (a,r,g,b) 
 
//*************************  
compound1 (){   //统计复合图:雷达图加环图
     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,180,180,250);
      cs.SetColor (255,230,240,250);
      cs.DrawRect (20,20,700,580);   //back 

         cs.SetColor (255,200,220,250);
     cs.DrawRect (40,35,135,185);   //色标底左
         cs.SetColor (255,180,190,250);
     cs.DrawRect (40,185,135,340);   //色标底
         cs.SetColor (255,140,160,250);
     cs.DrawRect (40,340,135,490);   //色标底

        cs.SetColor (255,200,220,250);
     cs.DrawRect (585,200,680,440);   //色标底右

      cs.SetFillMode (0);//0不填色,1填色
      cs.SetColor (255,0,0,240);
      cs.DrawRect (20,20,700,580);   //框线
      cs.DrawRect (24,24,696,576);   //框线
//*************************
 double sum1, sum2, sum3, sum ;
 double sum4, sum5, sum6 ;

//绘制环形图加雷达图,先绘制环形图
         cs.SetFillMode (1);//0不填色,1填色
        cs.SetStrokeWidth(2);    //线
        dx=360;  dy=280 ;   r=200;  //center, radius
 p[1]=143;  p[2]=170;  p[3]=162 ;  
 p[4]=180;  p[5]=175;  p[6]=170 ;
 //* 此数值是以样本值换算后的作图数据,
 //* 计算方法列后
      k[0]=0;     //k= -180,12点钟方向为0位
                       //k=0, 3点钟方向为0位
       k[1]=k[0]+p[1]*72/100 ;
       k[2]=k[1]+p[2]*72/100 ;
       k[3]=k[2]+p[3]*72/100 ;
       k[4]=k[3]+p[4]*72/100 ;
       k[5]=k[4]+p[5]*72/100 ;
       k[6]=k[5]+p[6]*72/100 ;

         cs.SetColor(255,250,250,250);
         cs.DrawCircle(dx,dy,205);    //中心加圆是环图
         cs.SetTextStyle (0);      //show data
         cs.SetTextSize (18);
//绘制环形图
     for (n=1; n<=6 ; n++){   //data=5,  draw Piegraph
       for (i= k[n-1]; i<=k[n]+2; i++){  // +2  尾线圆闭合
             a=pi/360*i ;   // a/2 绘出的是半圆
       if (n==1) cs.SetColor(255,250,0,0);
       if (n==2) cs.SetColor(255,250,150,0);
       if (n==3) cs.SetColor(255,0,0,250);
       if (n==4) cs.SetColor(255,0,250,250);
       if (n==5) cs.SetColor(255,250,0,250);
       if (n==6) cs.SetColor(255,0,250,0);
           x0=(float)(r*cos (a))+dx;     //r=radius
           y0=(float)(-r*sin (a))+dy;     //逆时针
     cs.DrawLine (dx,dy,x0,y0);  //逐线绘出加色标
     cs.DrawRect (590,n*30+225,675,n*30+250); 
         cs.SetColor(255,250,250,250);
     cs.DrawCircle(dx,dy,117);    //中心加圆是环图
           pn=p[n]*1000 ;     //保留1位小数
           pn=pn/10000 ;
           ss=doubleToString (pn)+"%" ;
           ss1=intToString (n)+".  "+ss;
        cs.SetColor(255,250,250,250);
        cs.DrawText(ss1, 600,n*30+243);          
     cs.SetColor(255,250,250,250);  //环图上标( n% )
            ma=pi/360*((k[n-1]+k[n])/2) ;
            x1=(float)((r-45)*cos (ma))+dx;     
            y1=(float)(-(r-35)*sin (ma))+dy ;
            cs.DrawText (ss,x1-25,y1);     //商品色标
                 cs.Update ();        }   } //show 环图
       
//绘制雷达图底图
      cs.SetFillMode (0);//0不填色,1填色
      cs.SetStrokeWidth(2);    //雷达图底线
              dx=360;  dy=280 ;     //center
 int cr, cg, cb ;   //set color (a,r,g,b)
      for (i=1; i<=51 ; i++){   //底图圆渐变色
               cb=i*5 ;  L=i*2+10;
          cs.SetColor(255,50,i*2+90,cb);
          cs.DrawCircle(dx,dy,L);       }  //底图色
          cs.SetFillMode (1);//0不填色,1填色
          cs.SetColor(255,50,80,0);  
          cs.DrawCircle(dx,dy,15);     //圆心
 
          cs.SetFillMode (0);//0不填色,1填色
          cs.SetStrokeWidth(1);    //雷达图底线
          cs.SetColor(255,250,0,0);
          cs.SetTextStyle (0);      
          cs.SetTextSize (16);
     for (i=1; i<=5 ; i++){   //画标线圆和标值
            a=pi/360*i ;
            x0=(float)(200*cos (a))+dx ;
            y0=(float)(200*sin (a))+dy ;
        cs.SetFillMode (0);//0不填色,1填色
        cs.SetColor(255,250,250,250);
        cs.DrawCircle(dx,dy,i*20);  
        cs.SetFillMode (1);//0不填色,1填色
             x1=(float)(i*20*cos (a))+dx ;
             y1=(float)(i*20*sin (a))+dy ;
             ss=intToString (i*2);
        cs.DrawText(ss,x1-8,285);         }  

          cs.SetFillMode (1);//0不填色,1填色
          cs.SetTextSize (18);
          cs.SetColor(255,250,0,0);
    for (i=0; i<=5 ; i++){   //标线六角射线,标字
          a=pi/360*i*120 ;   
          x0=(float)(210*cos(a))+dx ;
          y0=(float)(210*sin(a))+dy ;
          cs.DrawLine (x0,y0,dx,dy);   
          x1=(float)(215*cos(a))+dx-5 ;
          y1=(float)(-215*sin(a))+dy+5 ;  //逆时针
            ss=intToString (i+1) ;
          cs.DrawText (ss,x1,y1) ;                 }  
               cs.SetTextSize (22);
          cs.SetColor(255,250,50,120);
          cs.DrawText ("1 - 6 ",600,250) ;                 
          cs.DrawText ("商品类 ",600,225) ;          
               cs.Update ();

  sleep(1000);
   
 //雷达图绘制方法:
//input data :  分三组,每组6个分数(或平均分数)
 int  p1[6],  p2[6], p3[6] ;
int L ;      //高度,长度
//演示的数据是杜撰的,不代表真实的平均数
            cs.SetStrokeWidth(2);    //雷达图线
 //Draw Group 1 *************
     p1[0]=85;   //0位,起点
     p1[1]=85; p1[2]=68; p1[3]=94; 
     p1[4]=60; p1[5]=75; p1[6]=88;
         cs.SetColor(255,250,0,0);  //group 1
          L=p1[1] ;
          a=pi/360 ;   
          x0=(float)(L*cos(a))+dx ;
          y0=(float)(-L*sin(a))+dy ;
          cs.DrawCircle(x0,y0,4);     
              x2=x0;  y2=y0;
   for (i=1; i<=5; i++){   //六角射线点
          L=p1[i+1] ;
          a=pi/360*i*120 ;   
          x1=(float)(L*cos(a))+dx ;
          y1=(float)(-L*sin(a))+dy ;   //逆时针
           cs.DrawCircle(x1,y1,4);     
           cs.DrawLine (x2,y2,x1,y1);   //连线
             x2=x1;  y2=y1 ;    }
           cs.DrawLine (x2,y2,x0,y0);   //连线0点
           cs.Update ();       
     for (i=1; i<=6; i++){   //打印色标
            ss=intToString (i)+" . "+intToString (p1[i]) ;
            cs.DrawText (ss, 60, i*20+60) ;   }
            cs.DrawText ("Group 1 ", 50, 60) ;   
       sleep (1000);     //逐步展示

 //Draw Group 2 ************
     p2[0]=65 ;
     p2[1]=65; p2[2]=75; p2[3]=70; 
     p2[4]=80; p2[5]=95; p2[6]=78;
          cs.SetColor(255,0,250,0);  //group 2
          L=p2[1];
          a=pi/360 ;   
          x0=(float)(L*cos(a))+dx ;
          y0=(float)(-L*sin(a))+dy ;
          cs.DrawCircle(x0,y0,4);     
              x2=x0;  y2=y0;
   for (i=1; i<=5; i++){   //六角射线点
          L=p2[i+1] ;
          a=pi/360*i*120 ;   
          x1=(float)(L*cos(a))+dx ;
          y1=(float)(-L*sin(a))+dy ;   //逆时针
           cs.DrawCircle(x1,y1,4);     
           cs.DrawLine (x2,y2,x1,y1);   //连线
             x2=x1;  y2=y1 ;        }
          cs.DrawLine (x2,y2,x0,y0);   //连线回0点
           cs.Update ();       
     for (i=1; i<=6; i++){   //打印色标
            ss=intToString (i)+" . "+intToString (p2[i]) ;
            cs.DrawText (ss, 60, i*20+210) ;   }
            cs.DrawText ("Group 2 ", 50, 210) ;   
      sleep (1000);      //逐步展示

//Draw Group 3  ************
     p3[0]=75 ;
     p3[1]=75; p3[2]=88; p3[3]=85; 
     p3[4]=97; p3[5]=70; p3[6]=68;
          cs.SetColor(255,250,250,0);  //group 3
          L=p3[1] ;
          a=pi/360 ;   
          x0=(float)(L*cos(a))+dx ;
          y0=(float)(-L*sin(a))+dy ;
          cs.DrawCircle(x0,y0,4);     
              x2=x0;  y2=y0;
   for (i=1; i<=5; i++){   //六角射线点
          L=p3[i+1] ;
          a=pi/360*i*120 ;   
          x1=(float)(L*cos(a))+dx ;
          y1=(float)(-L*sin(a))+dy ;   //逆时针
           cs.DrawCircle(x1,y1,4);     
          cs.DrawLine (x2,y2,x1,y1);   //连线
             x2=x1;  y2=y1 ;        }
          cs.DrawLine (x2,y2,x0,y0);   //连线回0点
      for (i=1; i<=6; i++){   //打印色标
            ss=intToString (i)+" . "+intToString (p3[i]) ;
            cs.DrawText (ss, 60, i*20+360) ;   }
            cs.DrawText ("Group 3 ", 50, 360) ;   

//数据计算方法
  //p1(6)={70,95,68,94,60,75}    //样本值
  //p2(6)={78,65,69,70,85,90}
  //p3(6)={50,75,88,85,97,70}
       sum=0 ; sum1=0 ; sum2=0 ; sum3=0 ;
       sum4=0 ; sum5=0 ; sum6=0 ;
    for (n=1; n<=6 ; n++){   //data=6
            sum=sum+p[n] ;                    }

//单个商品按类相加=单个商品总量
//分组6个商品总量相加=商品销售总量
//占比分析:单个商品量/商品销售总量
//商品*单价=销售额
//6个商品类销售额相加=销售总额
//单个销售额/销售总额=单个商品类占比
//占比分析:单个商品类销售总额/商品销售总额

//模拟数据:3组,每组 6 数值。原始数据绘制雷达图
//数据计算示例:

//         商品        Group            计算          calculate
//   序  大类    1     2      3     sum       %     环图数据
//-------------------------------------------------
//    1     A      70   78   50     198     14.3      143
//    2     B      95   65   75     235     17.0      170
//    3     C      68   69   88     225     16.2      162
//    4     D      94   70   85     249     18.0      180
//    5     E       60   85   97     242     17.5      175
//    6     F       75   90   70     235     17.0      170
//------------------------------------------------
//                                            1384    100%    1000
//作图数据以1000换算成720线

//商品类 量比总数
     sum1=70+78+50 ;      //198
     sum2=95+65+75 ;      //235
     sum3=68+69+88 ;      //225
     sum4=94+70+85 ;      //249
     sum5=60+85+97 ;      //242
     sum6=75+90+70 ;      //235  sum=1384
  sum=sum1+sum2+sum3+sum4+sum5+sum6 ;
 
          print "pns(3) sum1 =  ", sum1 ;
          print "pns(3) sum2 =  ", sum2 ;
          print "pns(3) sum3 =  ", sum3 ;
          print "pns(3) sum4 =  ", sum4 ;
          print "pns(3) sum5 =  ", sum5 ;
          print "pns(3) sum6 =  ", sum6 ;
          print "      sum (1-6) =  ", sum ;
//化成百分数*10 ,此为作图数据
         pn=sum1/sum*10000/10 ;  
     pn=(int)pn ;    print "sum1 = ",pn ;
         pn=sum2/sum*10000 ;
     pn=(int)pn ;    print "sum2 = ",pn ;
         pn=sum3/sum*10000  ;
     pn=(int)pn ;    print "sum3 = ",pn ;
         pn=sum4/sum*10000 ;
     pn=(int)pn ;    print "sum4 = ",pn ;
         pn=sum5/sum*10000 ;
     pn=(int)pn ;    print "sum5 = ",pn ;
         pn=sum6/sum*10000 ;
     pn=(int)pn ;    print "sum6 = ",pn ;
//****数据计算*******************************
 
//题标:  艺术立体字制作
      cs.SetFillMode (1);//0不填色,1填色
        cs.SetTextStyle (1);
       cs.SetStrokeWidth(1);
       cs.SetTextSize (26);
      cs.SetColor(255,0,0,250);      
      cs.DrawText ("Radar Chart 📊",500,60) ;
      cs.SetTextSize (40);
         ss="统计图:雷达加扇形复合图" ;
      cs.SetColor(255,50,120,20);      //立体字
           cs.DrawText (ss,124,544);    //阴影
      cs.SetColor(255,0,250,0);
           cs.DrawText (ss,120,540);    //本字
      cs.SetFillMode (0);//0不填色,1填色
      cs.SetColor(255,250,150,0);
           cs.DrawText (ss,120,540);    //框线
       cs.Update ();
}//compound1 ()

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/410042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Webserver解决segmentation fault(core dump)段错问问题

前言 在完成了整个项目后&#xff0c;我用make命令编译了server&#xff0c;当我运行./server文件时&#xff0c;出现了段错误 在大量的代码中找出错因并不是一件容易的事&#xff0c;尤其是对新手程序员来说。而寻找bug的过程就像是侦探调查线索追查凶手一样&#xff0c;我们…

GO语言基础总结

多态&#xff1a; 定义一个父类的指针&#xff08;接口&#xff09;&#xff0c;然后把指针指向子类的实例&#xff0c;再调用这个父类的指针&#xff0c;然后子类的方法被调用了&#xff0c;这就是多态现象。 Golang 高阶 goroutine 。。。。。 channel channel的定义 …

【JVM】聊聊JVM生产环境常见的OOM问题

对于JVM来说&#xff0c;因为划分有固定的区域来执行字节码文件&#xff0c;无外乎&#xff0c;出问题的&#xff0c;也就是按照对应分分区会有常见的OOM问题。 栈 对于栈来说&#xff0c;栈的主要作用就是用于方法的执行&#xff0c;方法调用入栈、方法调出出栈。但是如果我…

LeetCode_Java_动态规划系列(1)(题目+思路+代码)

目录 斐波那契类型 746.使用最小花费爬楼梯 矩阵 120. 三角形最小路径和 斐波那契类型 746.使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。…

TS223——触摸键检测IC,具有低功耗和宽工作电压是触摸键的DC和AC特点,广泛消费性产品

TS223是触摸键检测IC&#xff0c;提供1个触摸键。触摸检测IC是为了用可变面积的键取代传统的按钮键而设计的。低功耗和宽工作电压是触摸键的DC和AC特点。 TS223采用SSOP16、SOT-23-6的封 装形式封装。 主要特点&#xff1a; ● 工作电压2.0V~5.5V ● 工作电流VDD3V&#xff0…

C++数据库连接池

功能实现设计 &#xff1a; ConnectionPool.cpp 和 ConnectionPool.h &#xff1a;连接池代码实现 Connection.cpp 和 Connection.h &#xff1a;数据库操作代码、增删改查代码实现 连接池主要包含了以下功能点 &#xff1a; 1.连接池只需要一个实例&#xff0c;所以 Connec…

力扣思路题:丑数

此题的思路非常奇妙&#xff0c;可以借鉴一下 bool isUgly(int num){if(num0)return false;while(num%20)num/2;while(num%30)num/3;while(num%50)num/5;return num1; }

no main manifest attribute, in app.jar

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

安全测试自学手册之软件安全测试基础

安全测试的概念 定义&#xff1a;指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程。】 应用软件的安全性测试&#xff1a;软件自身设计中存在的安全隐患&#xff0c;并检查软件对非法入侵的防御能力。系统级别的安全性测试&#xff1a;确保只有具备系统平台访问权限…

挑战杯 基于机器学习与大数据的糖尿病预测

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE&#xff08;递归特征消除法&#xff09;4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

ARCMAP进行天空开阔度(SVF)分析

这里的SVF并不是生物学或医学的(Stromal Vascular Fraction),而是指GIS中的(Sky View Factor,SVF),即为(城市)天空开阔度。 城市天空开阔度(Sky View Factor,SVF)是重要的城市形态学参数,那今天博主就跟大家讲一下如何用ArcMap来计算天空开阔度。 1、加载数据 需要加载…

【《高性能 MySQL》摘录】第 2 章 MySQL 基准测试

文章目录 2.1 为什么需要基准测试2.2 基准测试的策略2.2.1 测试何种指标 2.3 基准测试方法2.3.1 设计和规划基准测试2.3.2 基准测试应该运行多长时间2.3.3 获取系统性能和状态2.3.4 获得准确的测试结果2.3.5 运行基准测试并分析结果2.3.6 绘图的重要性 2.4 基准测试工具…

[ffmpeg] x264 配置参数解析

背景 创建 x264 编码器后&#xff0c;其有一组默认的编码器配置参数&#xff0c;也可以根据需要修改参数&#xff0c;来满足编码要求。 具体参数 可修改的参数&#xff0c;比较多&#xff0c;这边只列举一些常用的。 获取可以配置的参数 方式1 查看 ffmpeg源码 libx264.c…

Kotlin:协程基础

点击查看&#xff1a;协程基础 中文文档 点击查看&#xff1a;协程基础 英文文档 第一个协程程序 import kotlinx.coroutines.*fun main(){GlobalScope.launch {delay(1000L)//delay 是一个特殊的 挂起函数 &#xff0c;它不会造成线程阻塞&#xff0c;但是会 挂起 协程&…

【Redis学习笔记03】Java客户端

1. 初识Jedis Jedis的官网地址&#xff1a;https://github.com/redis/jedis 1.1 快速入门 使用步骤&#xff1a; 注意&#xff1a;如果是云服务器用户使用redis需要先配置防火墙&#xff01; 引入maven依赖 <dependencies><!-- 引入Jedis依赖 --><dependency&g…

机器学习:SVM算法(Python)

一、核函数 kernel_func.py import numpy as npdef linear():"""线性核函数:return:"""def _linear(x_i, x_j):return np.dot(x_i, x_j)return _lineardef poly(degree3, coef01.0):"""多项式核函数:param degree: 阶次:param …

stream流-> 判定 + 过滤 + 收集

List<HotArticleVo> hotArticleVos hotArticleVoList .stream() .filter(x -> x.getChannelId().equals(wmChannel.getId())).collect(Collectors.toList()); 使用Java 8中的Stream API对一个名为hotArticleVoList的列表进行过滤操作&#xff0c;筛选出符合指定条件…

一次登录、便捷访问所有?聊聊CAS单点登录是如何实现的

前言 之前我们说到“”对组织建设的价值和建设思路&#xff0c;知道了通过实施统一身份管理解决方案&#xff0c;能够简化用户管理、降本增效、并加强安全性。对于员工来说&#xff0c;给予一套单一的凭证&#xff08;如账号密码&#xff09;&#xff0c;就可以使其访问多个权限…

conda 导出/导出配置好的虚拟环境

一. 导出环境配置&#xff08;yml文件&#xff09; 1. 在主目录下激活虚拟环境&#xff08;UE4是我的虚拟环境名称&#xff0c;请根据你自己的名称进行修改&#xff09; conda activate UE4 2. 运行此代码 conda env export > environment.yml 二. 导入环境配置&#xf…

备战蓝桥杯---基础算法刷题2

题目有一点水&#xff0c;不过还是有几个好题的&#xff0c;我在这分享一下&#xff1a; 很容易想到先往最高处跳再往最低处跳&#xff0c;依次类推&#xff0c;那怎么保证其正确性呢&#xff1f; 证法1. 在此&#xff0c;我们从0开始&#xff0c;假设可以跳到a,b,c(a<b<…