-
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语言基础学习笔记】二、分支与循环语句(1)
2021-04-14 09:54:41说明:我是一个初学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(表达式) 语句1; else 语句2;
eg :
#include<stdio.h> int main() { int age = 10; if (age >= 18) printf("adult\n");//成年 else printf("nonage\n");//未成年 }
③if(表达式1) 语句1; else if(表达式2) 语句2; else 语句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,所以进入死循环了!
-
第五天的学习内容--循环语句
2022-02-21 14:47:01for循环 遍历数字 #测试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操作
2021-02-10 19:28:29Python 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()
这样虽然能画出来,但是需要手动写每个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()
和之前的结果一样,能找到唯一一处细微差别嘛
以上就是关于对Python matplotlib读取excel数据并用for循环画多个子图subplot操作的详细介绍。欢迎大家对Python matplotlib读取excel数据并用for循环画多个子图subplot操作内容提出宝贵意见
-
jmeter数据库,charles抓包,Python循环语句
2018-11-17 21:06:00jmeter数据库,charles抓包,Python循环语句 一、Jemeter数据库 添加jar包数据库 jemeter=>浏览 添加JDBC Connection Configuration 配置数据 mysqlurl:jdbc:mysql://ip:port/db?useUnicode=true&... -
用matlab画图时好不好使图形窗口不出现
2020-12-20 20:50:44一般out of memenry存在以下几种情况:1、 变量需要的存储空间超过了可用的内存空间2、 数据需要的存储空间,超过内存中最大的可用连续存储空间3 、程序和问题求解方法的设计不周,导致内存溢出。解决方法如下:1、... -
Oracle存储过程基本写法(组图)
2020-12-18 21:11:38Oracle存储过程基本写法(组图)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 数据流图 数据流图不是传统的流程图或框图,数据流也不是控制流。数据流图是从数据的角度来描述一个系统. 数据流图从数据传递和加工的角度... -
【数据类型存储原理】数据的存储 - 深度剖析数据在内存中的存储
2021-10-06 09:08:59数据的存储前言 前言 我们在敲代码的时候总是会定义各种变量,对各种数据进行存储,比如int a = 10;就是将10这个数据存放进变量a中,而变量a,就是我们在内存中申请开辟的一块空间。 在内存中如何开辟空间给变量的... -
超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的
2021-04-11 01:11:23当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标准c语言实现 单链表不带头压缩c语言实现 约瑟夫环-(数组、循环链表、数学) 线性表表示集合 线性表实现一元多项式操作 链表环问题 ... -
操作系统课程设计实验报告-可变分区存储管理和多级队列调度算法模拟实现
2020-12-19 17:04:50操作系统课程设计实验报告-可变分区存储管理和多级队列调度算法模拟实现 (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的详细介绍
2022-04-04 23:49:53网页刷新的时候数据会被清空,这时候就需要用到存储技术。前端本地存储的方式有三种,分别是cookie、localStorage、sessionStorage。在前端面试过程中,经常会被问及这些存储技术和区别,优缺点,但是很少有人真正... -
Python基础 | 控制语句
2020-11-30 20:47:47语法if 条件表达式:语句/语句块其中:1) 条件表达式: 可以是逻辑表达式,关系表达式,算术表达式等等2) 语句/语句块: 可以是一条语句,也可以是多条语句. 注意: 多条语句缩进要保持一致.# 单分支选择结构# 输入一个数字... -
mysql使用存储过程&函数实现批量插入
2021-01-19 07:52:42写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧...正好也好加深下对procedure和function的熟练操作吧...废话不多说,我就直接上表结构啦哈,如下:create table dept(id int unsigned ... -
Pysot和MATLAB画图给线条加标注符区分对比算法
2021-05-15 21:03:21画图一般我们都是通过颜色来区分对比算法,但是有些期刊需求是黑白印刷,颜色区分算法明显是的达不到要求的。本博客所以使用“线条形状”+“颜色”来区别对比算法。 1.Pysot加标注符 Pysot中的线条形状只有四种“-... -
【转】MFC在窗口中画图
2019-10-12 09:10:20Windows GDI 在单任务环境如 MS-DOS 中,运行中的应用程序随时可自由地做它想做的事情,无论是在屏幕上画一条线,重新编写适配器的调色板,还是转换到... GDI 使用一简单的机制保证在窗口中画图的各程序遵循这... -
python 循环添加array_Python实践(1)
2020-11-21 09:41:15讲解一下调试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开始数,然后不断... -
串的顺序存储,基本操作,及KMP模式匹配算法实现
2022-05-11 12:49:08数据结构--串,串的顺序存储,基本操作,模式匹配(BF算法 和 KMP算法)。 -
python画图代码-Python为啥这么牛?一行Python代码除了画图竟然还有这些功能!
2020-10-28 22:18:22While 循环:当语句是 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画图-非常具体,非常全面
2019-10-01 07:14:18强大的画图功能是Matlab的特点之中的一个,Matlab提供了一系列的画图函数,用户不须要过多的考虑画图的细节,仅仅须要给出一些基本參数就能得到所需图形,这类函数称为高层画图函数。此外,Matlab还提供了直接对图形... -
MATLAB建模与仿真(第一章基础--第四章画图)
2022-03-15 18:01:21基本操作 细胞数组类型 内容 细胞数组对象 结构数组对象 基本元素 细胞 结构 基本索引 全下标方式、单下标方式 全下标方式、单下标方式 包含的数据类型 任何数据类型 任何数据类型 数据的存储 细胞 字段 访问元素的... -
python+django+mysql实现pdf转word项目实战
2022-03-25 20:49:26python 基础课程主要讲解了在项目实际开发过程中经常应用到的知识点,共15节视频,包括python和pycharm的安装,python基础语法、python常用数据类型、if语句、for语句、python函数、python类型和对象、python模块、...