精华内容
下载资源
问答
  • 2021-04-22 06:55:43

    matlab循环存储问题

    2018-7-11来自ip:11.164.174.74的网友咨询

    浏览量:156

    问题补充:

    matlab循环存储问题

    自己写了个循环画图程序 想存储时存储语句总是报错saveas(gcf,[num2str(file),'号静态测试误差曲线图_',num2str(sheet),'℃.fig']); 这句我不知道该咋改了,求大侠给个意见 源程序附上

    clear

    clc

    num=[-5 1;-5 2;-5 3;-5 4;-5 5;-5 6;-5 7;-5 8;-5 9;-5 10;-5 12;-5 13;-5 14;-5 15;-5 32;-5 33;

    20 1;20 2;20 3;20 4;20 5;20 6;20 7;20 8;20 9;20 10;20 12;20 13;20 14;20 15;20 32;20 33;];

    for i=1:16

    file=num(i,1);

    sheet=num(i,2);

    data=xlsread(['2012年10月 气压检定结果',num2str(file),'℃.xls'],[num2str(sheet)],'A1:K27');

    x=1:7;

    plot(x,data(3,:),'b*-',x,data(6,:),'b.--');

    hold on;

    plot(x,data(9,:),'g*-',x,data(12,:),'g.--');

    hold on;

    plot(x,data(15,:),'r*-',x,data(18,:),'r.--');

    hold on;

    legend('第一循环上行','第一循环下行','第二循环上行','第二循环下行','第三循环上行','第三循环下行');

    title('静态测试误差曲线');

    xlabel('气压行程点');

    ylabel('误差值(hPa)');

    saveas(gcf,[num2str(file),'号静态测试误差曲线图_',num2str(sheet),'℃.fig']);

    end

    更多相关内容
  • 说明:我是一个初学c语言的小白,很多地方都不是很理解,所以就会自己动手敲代码进行相应的推理验证,希望可爱的...2、分支语句if的语法结构表达编程练习题1:编程练习题2:switch的语法结构表达3、循环语句while的语法

    说明:我是一个初学c语言的小白,很多地方都不是很理解,所以就会自己动手敲代码进行相应的推理验证,希望可爱的你在看到这些步骤时,不要嫌弃我啰嗦。本篇文章内容相对较多,干货满满,有条件的小伙伴可以将文章中的练习和代码动手敲一敲。(吐槽环节:这作者咋这样呀,这么简单的还要敲代码验证,真菜呀!…我:好吧,我不装了,我摊牌了,我确实菜,真的菜,咋滴啦,还不允许初学者菜呀!)



    前言

    c语言是一门结构化的程序设计语言
    有三种基本结构(生活中的所有问题都可以归纳总结到这三种结构或其变式和组合中)
    顺序结构、选择结构、循环结构(这三种结构分别是什么意思呢?)
    顺序结构就是按照既定的步骤依次执行,从头做到尾。
    选择结构就是执行到特定的语句(选择语句),会进行相应的判断,满足条件执行一种路径,不满足条件执行另一种路径。
    循环结构就是重复、不间断的执行特点的语句(循环体),满足条件执行或不执行。
    画图理解:① 顺序结构 ②选择语句 ③ 循环语句
    在这里插入图片描述
    本章内容包括:
    选择结构-- - 分支语句:if | switch
    循环结构-- - 循环语句:while | for | do while goto语句


    1、什么叫做语句?

    概念:C语言中由一个; (分号)隔开的就是一条语句。

    int main()
    {
    	int a = 1; //由;隔开的程序句子叫做语句  
    	;//只有一个;没有其它内容,也是一条语句,叫做空语句
    	return 0;
    }
    

    2、分支语句

    也叫做选择语句,有选择才会有分支,分支语句可以理解为存在选择的语句。


    if的语法结构表达

    if(表达式)  
          语句;
    

    eg(举例):

    #include<stdio.h>
    int main()
    {
    	int age = 20;
    	if (age >= 18)
    		printf("adult\n");
    }
    

    if(表达式) 
        语句1else   
        语句2

    eg :

    #include<stdio.h>
      int main()
      {
    	  int age = 10;
    	  if (age >= 18)
    		  printf("adult\n");//成年
    	  else
    		  printf("nonage\n");//未成年
      }
    
    

    在这里插入图片描述


    if(表达式1)
         语句1else if(表达式2)  
         语句2else   
         语句3

    eg :

    #include<stdio.h>
      int main()
      {
    	  int age = 140;
    	  if (age < 18)
    		  printf("young pepole\n");//少年
    	  else if (age >= 18 && age < 26)
    		  printf("youth\n");//青年
    	  else if (age >= 26 && age < 50)
    		  printf("wrinkly\n");//中年
    	  else if (age >= 50 && age < 100)
    		  printf("older pepole\n");//老年
    	  else
    		  printf("the god of longevity!\n");//寿星
    	  return 0;
      }
    

    在这里插入图片描述
    详解:逻辑操作符: && 表示 “且”
    eg : if(age >= 18 && age < 26) 这个地方切记不可以直接写成18 <= age < 28,虽然数学中我们是这样书写的,但是在c中会先将(18 <= age)看作一个整体,若条件成立则为真,值为1,条件不成立则为假,值为0,而不管值为1还是0,1 / 0 < 26 恒成立,程序执行得不到我们想要的结果。


    为了更好的理解学习分支语句,我们要了解C语言中是如何表示真和假,非0就是真(比如 1、2、3、 - 1等非0,就是真),0就是假

    总结:c语言中 0表示假 非0表示真

      所以表达式为0,则表示假,条件不成立
      表达式非0,则表示真,条件成立
    

    if语句中,单条语句可以直接写,多条语句需要用代码块{}括起来。如果多条语句不带大括号{ }则默认执行第一条语句。


    看一下下面这个代码,猜猜会打印什么?(先猜一下,然后对着结果)
    在这里插入图片描述
    结果:什么都不打印

    上面的case就是一个悬空else的问题,即else是如何进行匹配的?
    else匹配原则: else跟离得最近的未匹配的if进行匹配


    再看看下面这个case,猜猜结果是什么?
    在这里插入图片描述

    = 赋值符号 /易与 == 判断相等符号弄混淆

    虽然语法不报错,但是结果却不是想要的
    为了避免将 == 写成 = 可以将 num == 5 写成 if (5 == num) 若缺少 = 就会报错
    将常量放到 == 左边 (好的代码风格,编程老司机)


    编程练习题1:

    判断一个数是否为奇数(建议先自己动手完成相应的练习,再对照答案)
    思路:如何判断一个数是奇数呢?—> % 2 余1 则为奇数,不为1则不是奇数

    #include<stdio.h>
    	  int main()
      {
    	  int num = 0;
    	  scanf("%d", &num);
    	  if (num % 2 == 1)//判断奇数的方法:%2 看余数是否为1
    		  printf("%d是奇数\n", num);
    	  else
    		  printf("%d不是奇数\n", num);
    	  return 0;
      }
    
    

    在这里插入图片描述


    编程练习题2:

    输出1 - 100之间的奇数(建议先自己动手完成相应的练习,再对照答案)
    思路:要想输出1 - 100之间的奇数,首先我们要产生1 - 100之间的数字(利用循环产生),判断这里面哪些是奇数,将奇数打印出来。

    #include<stdio.h>
    	  int main()
      {
    	  int i = 0;
    	  for (i = 1; i <= 100; i++)
    	  {
    		  if (i % 2 == 1)
    			  printf("%d ", i);
    	  }
    	  return 0;
      }
    

    在这里插入图片描述

    switch的语法结构表达

    这个地方除了刚刚的思路外,还有另外一种思路:根据已有的数学知识,我们知道第一个奇数是1,后面的奇数都是前一个奇数 + 2(这样 % 2之后余数仍然为1),根据这个思路,我们可以这样写:

    #include<stdio.h>
    	  int main()
      {
    	  int i = 0;
    	  for (i = 1; i <= 100; i += 2)
    	  {
    		  printf("%d ", i);
    	  }
    	  return 0;
      }
    

    在这里插入图片描述


    当存在多个分支或选择的情况时,如果这时候我们继续选择使用if…else if…else if……就会显得很繁琐。这种语法形式太复杂了,这时候我们可以使用switch语句,用来解决这一类问题非常简单和明了。

    	  switch语句
    	  语法结构 switch(整型表达式)
    	           {
    	              语句项;
    	            }
    	  语句项   case 整型常量表达式:
    	               语句;
    

    case后面的整型常量表达式可以常量,也可以是表达式,比如:可以是 case 1,或case 1 + 0;
    另外,字符也属于整型(字符存储的是ASCII值),可以为字符,如case ‘a’: 或 case ‘A’ + 1:
    但是不能是变量或变量表达式,比如:不能是 case n;或 case n + 0;也不能是小数(浮点型)比如:不能是 case
    1.1、case 0.0 或case 1.1 + 0等 整型(计算机中的一个基本的专业术语,指没有小数部分的数据)即可。


    看下面这个例子:通过键盘输入数字将其转换输出成相应的星期

    #include<stdio.h>
    			  int main()
    		  {
    			  int day = 0;
    			  scanf("%d", &day);
    			  switch (day)
    			  {
    			  case 1:
    				  printf("星期一\n");
    				  break;
    			  case 2:
    				  printf("星期二\n");
    				  break;
    			  case 3:
    				  printf("星期三\n");
    				  break;
    			  case 4:
    				  printf("星期四\n");
    				  break;
    			  case 5:
    				  printf("星期五\n");
    				  break;
    			  case 6:
    				  printf("星期六\n");
    				  break;
    			  case 7:
    				  printf("星期天\n");
    				  break;
    			  default:
    				  printf("输入错误\n");
    				  break;
    			  }
    			  return 0;
    		  }
    
    

    在这里插入图片描述
    switch的入口是case ,出口是break。
    break;直接跳出switch语句,不执行后续操作
    default:当case中所有的整型变量表达式均不满足时,执行default中的语句,default可以写在任意case语句可以出现的位置,没有顺序可言,没有强规定将default只能放到前面或后面。(不过一般习惯将default放到后面)

    说明:这里的break不一定要有,是否添加break需要根据我们想要达到的效果和程序运行逻辑来定。比如说刚刚那个例子,如果我们想要在输入1,2,3,4,5的时候,打印输出“工作日”,输入6,7的时候,打印输出“休息日”,可以这样写:

    #include<stdio.h>
    			  int main()
    		  {
    			  int day = 0;
    			  scanf("%d", &day);
    			  switch (day)
    			  {
    			  case 1:
    			  case 2:
    			  case 3:
    			  case 4:
    			  case 5:
    				  printf("工作日\n");
    				  break;
    			  case 6:
    			  case 7:
    				  printf("休息日\n");
    				  break;
    			  default:
    				  printf("输入错误\n");
    				  break;
    			  }
    			  return 0;
    		  }
    

    在这里插入图片描述


    编程好习惯:
    ①最后一个break要不要加上?
    我们知道最后一个break加不加,程序执行到这里都会跳出去,但是建议加上,为了代码以后的扩展性考虑。(比如后面还需要加上case 8: 若之前case 7:处未添加break,添加case 8:的代码后,程序执行可能会得不到想要的效果。)
    ②default语句要不要加?
    建议加上default:语句,用来处理异常值,并给出相应的提示。


    switch语句本身可以嵌套使用
    怎么理解这句话呢?下面我们来看一下这个例子 :

    #include<stdio.h>
    		  int main()
    		  {
    			  int n = 1;
    			  int m = 2;
    			  switch (n)
    			  {
    			  case 1:
    				  m++;
    			  case 2:
    				  n++;
    			  case 3:
    				  switch (n)//switch允许嵌套使用
    				  {
    				  case 1:
    					  n++;
    				  case 2:
    					  m++;
    					  n++;
    					  break;
    				  }
    			  case 4:
    				  m++;
    				  break;
    			  default:
    				  break;
    			  }
    			  printf("m = %d, n = %d\n", m, n);
    			  return 0;
    		  }
    

    先别急着看结果,先猜一下程序运行的结果是什么?
    在这里插入图片描述
    你猜对了吗?
    注意:break跳出的是break所在的switch语句。


    3、循环语句

    循环语句的结构有三种 for\while\do while

    while的语法结构

    	while语句
    	语法结构:while(表达式)
    		     {
    		      循环语句;
    		     }
    

    在学习循环语句while之前,我们先来看一个例子:
    在这里插入图片描述
    我们知道if(1) 1表示条件为真,所以打印haha(条件成立,执行后面语句)
    现在我们将if换成while,再来看这个例子:
    在这里插入图片描述
    会发现执行之后,死循环打印haha。可以看出来while(表达式),只要表达式为真,就会一直执行循环体(条件成立,循环执行后面语句),跟if选择语句的区别是一个条件成立执行一次,一个条件成立一直执行。
    再看下面这个例子:
    在这里插入图片描述


    break在while循环的作用:

    在循环中遇到break,就停止后期的所有循环,直接终止循环,所以while中的break是用于永久终止循环的

    eg:
    在这里插入图片描述

    打印0,1,2,3,4后 i = 5 if条件成立,break跳出程序。所以打印结果为0 1 2 3 4


    continue在while循环的作用:

    continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。

    eg:
    在这里插入图片描述

    实际效果红框部分还在执行,光标还在闪动(程序结束的时候后面会有一句话:按任意键结束程序,这里没有出现),也就是说打印 0 1 2 3 4
    后进入死循环了

    那么为什么会出现死循环呢?

    i = 5之后,if条件成立,执行continue,后面的语句跳过不执行,进入下一次循环,但是在进入下一次循环的时候i没有进行调整,值一直为5,所以进入死循环了!

    展开全文
  • for循环 遍历数字 #测试for循环 for x in (10,20,30):#遍历数字 print(x*30,end="\t")#end是为了把输出内容整合为一行 遍历字符串 for y in "abcdef":#遍历字符串 print(y,end="\t") 遍历字典 d={"name":"gaoqi...

    for循环

    在这里插入图片描述
    遍历数字

    #测试for循环
    for x in (10,20,30):#遍历数字
        print(x*30,end="\t")#end是为了把输出内容整合为一行
    

    遍历字符串

    for y in "abcdef":#遍历字符串
        print(y,end="\t")
    

    遍历字典

    d={"name":"gaoqi","age":18,"job":"programmer"}
    for x in d:#遍历字典 ,字典的键值对提前规定
        print (x,end="\t")#此处默认打印键
    for x in d.keys():
        print(x, end="\t")  # 此处默认打印键
    for x in d.values():
        print (x,end="\t")#此处默认打印值
    for x in d.items():
        print (x,end="\t")#此处默认打印键值对
        ##end="\t"可写可不写
    

    range对象

    在这里插入图片描述
    range 对象是一个迭代器对象,用来产生指定范围的数字序列。格式:range(start,end,step) 包头不包尾,一般步长默认为1
    eg:range(5),–> 0,1,2,3,4
    for x in range(3,10,2):
    print(x)#不要忘记写打印,否则不能出结果
    小练习:
    利用for循环,计算1-100之间数字的累加和;
    计算1-100之间偶数的累加和;
    计算1-100之间技术的累加和;
    累加和为sum_all
    循环的时候num+=1 ;num+=2
    默认原始为0,即从0开始。

    sum_all=0 #1-100所有数的累加和
    sum_even=0  #1-100偶数的累加和
    sum_odd=0 #1-100所有数的累加和
    for x in range(101):
        sum_all+=x #此处为x ,因为要将所有的数依次相加
        if x%2==1: #条件判断不能写=,%取余的意思,奇数/2 余数为1是共通的
            sum_odd+=x
        else:
            sum_even+=x
    print(sum_all)
    print(sum_odd)
    print(sum_even)
    ##打印出也可以表达为
    print("1-100所有整数和为{0},1-100所有奇数和为{1},1-100所有偶数和为{2}".format(sum_all,sum_odd,sum_even))
    

    嵌套循环

    for x in range(5):
        for y in range(5):
            print(x,end="\t")
        print ()#该函数天然带有换行的意思
    

    嵌套循环的意思就是,外面一层是大循环,里面是小循环。当x=0,y=0,1,2,3,4;当x=1,y=0,1,2,3,4;当x=2,y=0,1,2,3,4;当x=3,y=0,1,2,3,4;当x=4,y=0,1,2,3,4;
    结果如下:
    在这里插入图片描述

    ##九九乘法表的打印
    for x in range(1,10): #这里不能写range(10),因为range(10)默认是从0开始
        for y in range(1,x+1):
            print("{0}*{1}={2}".format(x,y,(x*y)),end="\t")
        print()
    
    #使用列表和字典存储表格的数据
    r1=dict(name="gaoqi",age=18,salary=30000,city="北京")#此处复习字典创建的三种方法
    r2=dict(name="gaoqi1",age=19,salary=20000,city="南京")
    r3=dict(name="gaoqi2",age=20,salary=10000,city="上海")
    tb=[r1,r2,r3]#将字典的内容制表
    for x in tb:
        if x.get("salary")>15000: #x.get() 获取函数值,字典中通过键判断
            print (x)
    

    复习字典的创建方法:

    r1= {"name":"gaoqi0","age":18,"salary":30000,"city":"北京"}#此处复习字典创建的三种方法
    r2= {"name":"gaoqi1","age":18,"salary":20000,"city":"上海"}
    r3= {"name":"gaoqi2","age":18,"salary":10000,"city":"深圳"}
    tb=[r1,r2,r3]
    
    r1=dict([("name","gaoqi0"),("age",18),("salary",30000),("city","北京")])#此处复习字典创建的三种方法
    r2=dict([("name","gaoqi1"),("age",19),("salary",20000),("city","上海")])
    r3=dict([("name","gaoqi2"),("age",20),("salary",10000),("city","深圳")])
    tb=[r1,r2,r3]
    

    break语句与continue语句

    在这里插入图片描述
    区别break和continue ,前者时退出,后者时结束本次循环后继续下一次。

    #测试break语句
    while True:#死循环
        a=input("请输入一个字符(输入q或Q时退出):")
        if a=="q"or a=="Q":
            print("循环结束,退出")
        else:
            print(a)
    

    在这里插入图片描述
    小练习:
    在这里插入图片描述

    empNum=0#员工人数的统计
    salarySum=0#薪水总额的统计
    salarys=[] #根据要求,输出的薪资不止一个,需要借助列表来存放
    while True:#根据录入的薪水数来计算工资总额及工人数,进入循环
        s=input("请输入员工的薪资(按q或Q结束)")#设置一个变量s代表员工的薪资,全部输入完按s结束
        if s.upper()=="Q": #Upper是大写的意思,输出s或S后即可结束。为了不去区分大小写,统一用upper将字符大写
            print("录入完成,退出")
            break#如果输入的是s,说明薪水数录入完毕
        if float(s)<0:#另一种情况就是,输入的是薪水数,通过浮点函数float()进行判断。<0的情况不存在
            continue#<0的不存在,因此到这一步结束,返回到while true 继续输入。
        empNum+=1#如果输入的数字>0,员工数记为1,进行累计
        salarys.append(float(s))#append是追加数据的意思,增加薪水数据
        salarySum+=float(s)
    print("员工数{0}".format(empNum))
    print("录入薪资:",salarys)
    print("平均薪资{0}".format (salarySum/empNum))
    
    

    在这里插入图片描述

    else语句

    在这里插入图片描述

    循环代码的优化

    在这里插入图片描述
    其他优化手段:
    1.连接多个字符串时,使用join(),而不使用+。后者会重复,耗内存。
    2.列表进行元素插入和删除,尽量在列表尾部操作。不要再中间,因为会重复中间之后的数据。耗内存

    names=("a","b","c","d")
    ages=(10,20,30,40)
    jobs=("laoshi","gongwuyuan","chengxuyuan")
    for name,age,job in zip(names,ages,jobs):#区分加不加s
         print("{0}--{1}--{2}".format(name,age,job))#纵向对比之后发现最少的jobs内部只含有三个元素,因此用0,1,2来表示 
    

    但是不用zip()也可以表达这个效果
    eg:

    `names=("a","b","c","d")
    ages=(10,20,30,40)
    jobs=("laoshi","gongwuyuan","chengxuyuan")
    for i in range(3):
         print("{0}--{1}--{2}".format(names[i],ages[i],jobs[i]))`
    

    在这里插入图片描述

    #测试列表推导式
    y=[x*2 for x in range(1,5)]
    print (y)
    
    #单纯使用循环,效果不如推导式
    y=[]#构建y的列表
    for x in range(1,5):#引入原始变量x
        y.append(x*2)#追加数据x*2
    print (y)
    

    添加if条件的

    #测试列表推导式
    y=[x*2 for x in range(1,50)if x%5==0]
    print (y)
    
    #单纯使用循环,效果不如推导式
    y=[]#构建y的列表
    for x in range(1,50):#引入原始变量x
        if x % 5 == 0: y.append(x*2)#追加数据x*2
    print (y)
    
    #cell代表元组的意思
    cells=[(row,col) for row in range(1,10) for col in range(1,10)]#此处的for可以使用两个循环
    print(cells)
    

    字典推导式

    字典的推导式生成字典对象,格式如下:{key_expression:value_expressionfor表达式in可迭代对象}类似于列表推导式,字典推导也可以增加if条件判断、多个for循环。

    #字典推导式
    my_text="i love you,i love sxt,i love gaoqi"
    char_count={c:my_text.count(c) for c in my_text} #c:my_text是键和值,c是其中的一个字符,for c in my_text遍历字符,c 也可以用别的字母代替,前后保持一致
    print(char_count)
    #character 文字,字母,符号;char_count 统计字符数量的函数
    

    集合推导式
    集合推导式生成集合,和列表推导式的语法格式类似:
    {表达式 for item in 可迭代对象}或者:{表达式 for item in 可迭代对象 if 条件判断}

    {x for x in range(1,100) if x%9==0}
    {99,36,72,9,45,81,18,54,90,27,63}#集合里的元素不可以重复,重复会导致覆盖

    在这里插入图片描述
    值得注意的是,一个生成器只能运行一次。第一次迭代可以得到数据,第二次迭代发现数据已经没有了。

    #生成器推导式(生成元组)
    gnt=(x for x in range(4))#gnt 是生成器的意思
    print (tuple(gnt))#生成器对应的元组内容
    print (tuple(gnt))#个生成器只能运行一次。第一次迭代可以得到数据,第二次迭代发现数据已经没有了
    #可以用循环去遍历生成器,因为循环可以遍历列表,生成器等可迭代对象。。。
    for x in gnt:#gnt是可迭代对象
        print (x,end=",")#end=","结尾用,
    

    **

    画多个⚪(顺序:开始-圆心-结束,颜色/半径)

    **

    import turtle
    t=turtle.Pen()#t是画笔
    t.goto(0,0)
    t.circle(100)#半径是100
    #如何利用循环语句实现上述操作?
    import turtle
    t=turtle.Pen()#t是画笔
    my_colors=("red","green","blue","pink")
    t.width(4)#宽度
    t.speed(0)#画图速度
    for i in range(50):#i=0,1,2,3,4
        t.penup()
        t.goto(0,-i*10)#-i*10=0,-10,-20,-30,-40,代表圆心坐标
        t.pendown()
        t.color(my_colors[i%len(my_colors)])
        t.circle(20+i*10)#原始半径是20,之后累次+10
    turtle.done()#done的意思是程序执行完,停留在窗口
    

    画棋盘格的作业:

    import turtle
    
    width=30#宽度
    num=18
    x1=[(-400,400),(-400+width*num,400)]#从左往右画
    y1=[(-400,400),(-400,400-width*num)]
    t=turtle.Pen()
    t.speed(10)
    for i in range(0,19):#i=0,1,2,3,4....18
        t.penup()
        t.goto(x1[0][0],x1[0][1]-30*i)#-i*10=0,-10,-20,-30,-40,代表圆心坐标
        t.pendown()
        t.goto(x1[1][0], x1[1][1]-30*i)#原始半径是20,之后累次+10
    for i in range(0, 19):  # i=0,1,2,3,4....18
        t.penup()
        t.goto(y1[0][0]+30*i, y1[0][1])  # -i*10=0,-10,-20,-30,-40,代表圆心坐标
        t.pendown()
        t.goto(y1[1][0]+30*i, y1[1][1])
    t.hideturtle()#隐藏画笔
    turtle.done()#保证运行窗口不被关闭
    
    展开全文
  • Python matplotlib读取excel数据并用for循环画多个子图subplot操作,英语,总分,平均,数据,语文Python matplotlib读取excel数据并用for循环画多个子图subplot操作易采站长站,站长之家为您整理了Python matplotlib读取...

    Python matplotlib读取excel数据并用for循环画多个子图subplot操作,英语,总分,平均,数据,语文

    Python matplotlib读取excel数据并用for循环画多个子图subplot操作

    易采站长站,站长之家为您整理了Python matplotlib读取excel数据并用for循环画多个子图subplot操作的相关内容。

    读取excel数据需要用到xlrd模块,在命令行运行下面命令进行安装pip install xlrd

    表格内容大致如下,有若干sheet,每个sheet记录了同一所学校的所有学生成绩,分为语文、数学、英语、综合、总分考号 姓名 班级 学校 语文 数学 英语 综合 总分

    ... ... ... ... 136 136 100 57 429

    ... ... ... ... 128 106 70 54 358

    ... ... ... ... 110.5 62 92 44 308.5

    画多张子图需要用到subplot函数subplot(nrows, ncols, index, **kwargs)

    想要在一张画布上按如下格式画多张子图

    语文 --- 数学

    英语 --- 综合

    ----- 总分 ----

    需要用的subplot参数分别为subplot(321) --- subplot(322)

    subplot(323) --- subplot(324)

    subplot(313)#!/usr/bin/env python# -*- coding:utf-8 -*-from xlrd import open_workbook as owbimport matplotlib.pyplot as plt#import matplotlib.colors as colors#from matplotlib.ticker import MultipleLocator, FormatStrFormatter, FuncFormatterimport numpy as np districts=[] # 存储各校名称--对应于excel表格的sheet名data_index = 0new_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']wb = owb('raw_data.xlsx') # 数据文件active_districts = ['二小','一小','四小'] ## 填写需要画哪些学校的,名字需要与表格内一致avg_yuwen = []avg_shuxue = []avg_yingyu = []avg_zonghe = []avg_total = []'按页数依次读取表格数据作为Y轴参数'for s in wb.sheets(): #以下两行用于控制是否全部绘图,还是只绘选择的区 #if s.name not in active_districts: # continue print('Sheet: ', s.name) districts.append(s.name) avg_score = 0 yuwen = 0 shuxue = 0 yingyu = 0 zonghe = 0 zongfen = 0 total_student = 0 for row in range(1,s.nrows): total_student += 1 #读取各科成绩并计算平均分 yuwen = yuwen + (s.cell(row, 4).value - yuwen)/total_student # 语文 shuxue = shuxue + (s.cell(row, 5).value - shuxue) / total_student # 数学 yingyu = yingyu + (s.cell(row, 6).value - yingyu) / total_student # 英语 zonghe = zonghe + (s.cell(row, 7).value - zonghe) / total_student # 综合 zongfen = zongfen + (s.cell(row, 8).value - zongfen) / total_student # 总分 avg_yuwen.append(yuwen) avg_shuxue.append(shuxue) avg_yingyu.append(yingyu) avg_zonghe.append(zonghe) avg_total.append(zongfen) data_index += 1 print('开始画图...')plt.rcParams['font.sans-serif']=['SimHei'] # 中文支持plt.rcParams['axes.unicode_minus']=False # 中文支持figsize = 11,14fig = plt.figure(figsize=figsize)fig.suptitle('各校各科成绩平均分统计',fontsize=18)my_x=np.arange(len(districts))width=0.5 ax1 = plt.subplot(321)#total_width=width*(len(districts))b = ax1.bar(my_x , avg_yuwen, width, tick_label=districts, align='center', color=new_colors)for i in range(0,len(avg_yuwen)): ax1.text(my_x[i], avg_yuwen[i], '%.2f' % (avg_yuwen[i]), ha='center', va='bottom',fontsize=10)ax1.set_title(u'语文')ax1.set_ylabel(u"平均分")ax1.set_ylim(60, 130) ax2 = plt.subplot(322)ax2.bar(my_x, avg_shuxue, width, tick_label=districts, align='center', color=new_colors)for i in range(0, len(avg_shuxue)): ax2.text(my_x[i], avg_shuxue[i], '%.2f' %(avg_shuxue[i]), ha='center', va='bottom', fontsize=10)ax2.set_title(u'数学')ax2.set_ylabel(u'平均分')ax2.set_ylim(50,120) ax3 = plt.subplot(323)b = ax3.bar(my_x , avg_yingyu, width, tick_label=districts, align='center', color=new_colors)for i in range(0,len(avg_yingyu)): ax3.text(my_x[i], avg_yingyu[i], '%.2f' % (avg_yingyu[i]), ha='center', va='bottom',fontsize=10)ax3.set_title(u'英语')ax3.set_ylabel(u"平均分")ax3.set_ylim(30, 100) ax4 = plt.subplot(324)b = ax4.bar(my_x , avg_zonghe, width, tick_label=districts, align='center', color=new_colors)for i in range(0,len(avg_zonghe)): ax4.text(my_x[i], avg_zonghe[i], '%.2f' % (avg_zonghe[i]), ha='center', va='bottom',fontsize=10)ax4.set_title(u'综合')ax4.set_ylabel(u"平均分")ax4.set_ylim(0, 60) ax5 = plt.subplot(313)total_width=width*(len(districts))b = ax5.bar(my_x , avg_total, width, tick_label=districts, align='center', color=new_colors)for i in range(0,len(avg_total)): ax5.text(my_x[i], avg_total[i], '%.2f' % (avg_total[i]), ha='center', va='bottom',fontsize=10)ax5.set_title(u'总分')ax5.set_ylabel(u"平均分")ax5.set_ylim(250, 400) plt.savefig('avg.png')plt.show()

    a2027ba8f709d18a492f5cbefc3c88d3.png

    这样虽然能画出来,但是需要手动写每个subplot的代码,代码重复量太大,能不能用for循环的方式呢?

    继续尝试,

    先整理出for循环需要的不同参数avg_scores = [] # 存储各科成绩,2维listsubjects = ['语文','数学','英语','综合','总分'] #每个子图的titleplot_pos = [321,322,323,324,313] # 每个子图的位置y_lims = [(60,130), (50,120), (30,100), (0,60), (200,400)] # 每个子图的ylim参数

    数据读取的修改比较简单,但是到画图时,如果还用 ax = plt.subplots(plot_pos[pos])方法的话,会报错Traceback (most recent call last): File "...xxx.py", line 66, in b = ax.bar(my_x , y_data, width, tick_label=districts, align='center', color=new_colors) # 画柱状图AttributeError: 'tuple' object has no attribute 'bar'

    搜索一番,没找到合适的答案,想到可以换fig.add_subplot(plot_pos[pos]) 试一试,结果成功了,整体代码如下#!/usr/bin/env python# -*- coding:utf-8 -*-from xlrd import open_workbook as owbimport matplotlib.pyplot as plt#import matplotlib.colors as colors#from matplotlib.ticker import MultipleLocator, FormatStrFormatter, FuncFormatterimport numpy as np districts=[] # 存储各校名称--对应于excel表格的sheet名total_stu=[] # 存储各区学生总数data_index = 0new_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']wb = owb('raw_data.xlsx') # 数据文件active_districts = ['BY','二小','一小','WR','四小'] ## 填写需要画哪些学校的,名字需要与表格内一致avg_scores = [] # 存储各科成绩,2维listsubjects = ['语文','数学','英语','综合','总分'] #每个子图的titleplot_pos = [321,322,323,324,313] # 每个子图的位置y_lims = [(60,130), (50,120), (30,100), (0,60), (200,400)] # 每个子图的ylim参数 '按页数依次读取表格数据作为Y轴参数'for s in wb.sheets(): #以下两行用于控制是否全部绘图,还是只绘选择的区 #if s.name not in active_districts: # continue print('Sheet: ', s.name) districts.append(s.name) avg_scores.append([]) yuwen = 0 shuxue = 0 yingyu = 0 zonghe = 0 zongfen = 0 total_student = 0 for row in range(1,s.nrows): total_student += 1 #tmp = s.cell(row,4).value yuwen = yuwen + (s.cell(row, 4).value - yuwen)/total_student # 语文 shuxue = shuxue + (s.cell(row, 5).value - shuxue) / total_student # 数学 yingyu = yingyu + (s.cell(row, 6).value - yingyu) / total_student # 英语 zonghe = zonghe + (s.cell(row, 7).value - zonghe) / total_student # 综合 zongfen = zongfen + (s.cell(row, 8).value - zongfen) / total_student # 总分 avg_scores[data_index].append(yuwen) avg_scores[data_index].append(shuxue) avg_scores[data_index].append(yingyu) avg_scores[data_index].append(zonghe) avg_scores[data_index].append(zongfen) data_index += 1 print('开始画图...')plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falsefigsize = 11,14fig = plt.figure(figsize=figsize)fig.suptitle('各校各科成绩平均分统计',fontsize=18)my_x=np.arange(len(districts))width=0.5 print(avg_scores)for pos in np.arange(len(plot_pos)): #ax = plt.subplots(plot_pos[pos]) ax = fig.add_subplot(plot_pos[pos]) # 如果用ax = plt.subplots会报错'tuple' object has no attribute 'bar' y_data = [x[pos] for x in avg_scores] # 按列取数据 print(y_data) b = ax.bar(my_x , y_data, width, tick_label=districts, align='center', color=new_colors) # 画柱状图 for i in np.arange(len(y_data)): ax.text(my_x[i], y_data[i], '%.2f' % (y_data[i]), ha='center', va='bottom',fontsize=10) # 添加文字 ax.set_title(subjects[pos]) ax.set_ylabel(u"平均分") ax.set_ylim(y_lims[pos]) plt.savefig('jh_avg_auto.png')plt.show()

    和之前的结果一样,能找到唯一一处细微差别嘛

    e9a9969254507bfbf6c90abeaec53c4a.png以上就是关于对Python matplotlib读取excel数据并用for循环画多个子图subplot操作的详细介绍。欢迎大家对Python matplotlib读取excel数据并用for循环画多个子图subplot操作内容提出宝贵意见

    展开全文
  • jmeter数据库,charles抓包,Python循环语句 一、Jemeter数据库 添加jar包数据库 jemeter=>浏览 添加JDBC Connection Configuration 配置数据 mysqlurl:jdbc:mysql://ip:port/db?useUnicode=true&...
  • 一般out of memenry存在以下几种情况:1、 变量需要的存储空间超过了可用的内存空间2、 数据需要的存储空间,超过内存中最大的可用连续存储空间3 、程序和问题求解方法的设计不周,导致内存溢出。解决方法如下:1、...
  • Oracle存储过程基本写法(组图)08-07栏目:技术TAG:oracle 存储过程oracle 存储过程oracle 存储过程的基本语法1.基本结构https://www.jhua.orgCREATE OR REPLACE PROCEDURE 存储过程名字copyright www.jhua.org( ...
  • 【软件工程导论题型大总结】画图题总结

    千次阅读 多人点赞 2022-03-10 13:44:12
    没有用红色字体标出的图,代表这类题目基本不会以画图的方式考察(我也不敢百分之百保证),着重会在选择、填空中考察概念 使用红色字体标出的图,是必须要掌握它的画法的 总的来说:E-R图、数据流图、状态转换图、...
  • 用JAVA做一个简单的画图软件

    千次阅读 2021-03-02 18:25:52
    #用JAVA做一个简单的画图软件 写在前面 第一次用Java写东西,未免有疏漏之处,请多多指正。 首先,建立画布。 这里利用JFrame窗体界面创建一个DrawerFrame类,在主函数中实例化DrawerFrame类,并调用showUI方法,画...
  • 软件工程-UML画图

    千次阅读 2021-12-19 11:27:10
    三种基本结构的特点: 一个入口,一个出口,不出现死循环和死语句。 4.2 数据流图 数据流图不是传统的流程图或框图,数据流也不是控制流。数据流图是从数据的角度来描述一个系统. 数据流图从数据传递和加工的角度...
  • 数据的存储前言 前言 我们在敲代码的时候总是会定义各种变量,对各种数据进行存储,比如int a = 10;就是将10这个数据存放进变量a中,而变量a,就是我们在内存中申请开辟的一块空间。 在内存中如何开辟空间给变量的...
  • 当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标准c语言实现 单链表不带头压缩c语言实现 约瑟夫环-(数组、循环链表、数学) 线性表表示集合 线性表实现一元多项式操作 链表环问题 ...
  • 操作系统课程设计实验报告-可变分区存储管理和多级队列调度算法模拟实现 (34页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分操作系统课程设计报告姓名学号...
  • 循环链表的合并

    千次阅读 2020-06-09 11:52:19
    所以写一个函数更方便的找到尾指针 node* findrear(node* L)//找到尾指针 { node* p = L->...1.先用指针p存储循环链表1的头结点,将链表1尾指针Ta指向链表2第一个结点即Ta->next=Tb->next-&g
  • 网页刷新的时候数据会被清空,这时候就需要用到存储技术。前端本地存储的方式有三种,分别是cookie、localStorage、sessionStorage。在前端面试过程中,经常会被问及这些存储技术和区别,优缺点,但是很少有人真正...
  • Python基础 | 控制语句

    2020-11-30 20:47:47
    语法if 条件表达式:语句/语句块其中:1) 条件表达式: 可以是逻辑表达式,关系表达式,算术表达式等等2) 语句/语句块: 可以是一条语句,也可以是多条语句. 注意: 多条语句缩进要保持一致.# 单分支选择结构# 输入一个数字...
  • 写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧...正好也好加深下对procedure和function的熟练操作吧...废话不多说,我就直接上表结构啦哈,如下:create table dept(id int unsigned ...
  • 画图一般我们都是通过颜色来区分对比算法,但是有些期刊需求是黑白印刷,颜色区分算法明显是的达不到要求的。本博客所以使用“线条形状”+“颜色”来区别对比算法。 1.Pysot加标注符 Pysot中的线条形状只有四种“-...
  • Windows GDI  在单任务环境如 MS-DOS 中,运行中的应用程序随时可自由地做它想做的事情,无论是在屏幕上画一条线,重新编写适配器的调色板,还是转换到... GDI 使用一简单的机制保证在窗口中画图的各程序遵循这...
  • 讲解一下调试for循环大法 使用IDE的好处是他的调试非常方便,但是遇到了for循环语句,一直不懂正确的调试方法,今天看到了一个帖子,解决了心里的疑惑,相信在调试bug的时候能够更近一步了 参看帖子:...
  • PYTHON基础元素和画图

    2020-09-01 16:13:52
    ") 对于位于for 语句后面且属于循环组成部分的代码行,一定要缩进。 删除 while 'cat' in pets: pets.remove('cat') 数值列表 for value in range(1,5): print(value) #1 2 3 4 range(2,11,2)#从2开始数,然后不断...
  • 数据结构--串,串的顺序存储,基本操作,模式匹配(BF算法 和 KMP算法)。
  • While 循环:当语句是 True 时,while 内部的代码块会执行。所以下面这段代码会打印出 1 到 10 。 num = 1while num (num) num += 1 while 循环需要循环条件,如果条件一直是 True ,它将会一直迭代,当 num 的值为...
  • matplotlib画图中的各种设置

    千次阅读 2020-07-27 16:03:26
    正常在matplotlib中画图这个过程其实是很简单的,往往就是调用一句plt.plot()或者plt.bar()然后将整理好的数据按照要求放进去就可以了,真正比较复杂的是对图表的各种设置,使图表明确、美观。这篇文章重点讲讲...
  • 强大的画图功能是Matlab的特点之中的一个,Matlab提供了一系列的画图函数,用户不须要过多的考虑画图的细节,仅仅须要给出一些基本參数就能得到所需图形,这类函数称为高层画图函数。此外,Matlab还提供了直接对图形...
  • 基本操作 细胞数组类型 内容 细胞数组对象 结构数组对象 基本元素 细胞 结构 基本索引 全下标方式、单下标方式 全下标方式、单下标方式 包含的数据类型 任何数据类型 任何数据类型 数据的存储 细胞 字段 访问元素的...
  • python 基础课程主要讲解了在项目实际开发过程中经常应用到的知识点,共15节视频,包括python和pycharm的安装,python基础语法、python常用数据类型、if语句、for语句、python函数、python类型和对象、python模块、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,730
精华内容 2,292
关键字:

循环语句存储画图