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操作内容提出宝贵意见

python用for循环画多个图形_Python matplotlib读取excel数据并用for循环画多个子图subplot操作...相关推荐

  1. python接口自动化(三十七)-封装与调用--读取excel 数据(详解)

    简介 在进行软件接口测试或设计自动化测试框架时,一个不比可避免的过程就是: 参数化,在利用python进行自动化测试开发时,通常会使用excel来做数据管理,利用xlrd.xlwt开源包来读写exce ...

  2. python读excel中数据画图_python读取excel数据并且画图的实现示例

    一,要读取的数据的格式: 二,数据读取部分: b站视频参考:https://www.bilibili.com/video/BV14C4y1W7Nj?t=148 # 1930 workbook=xlrd ...

  3. Python读取excel数据且横轴是日期的图像绘制

    Python的matplotlib包含很多图表函数,其中plot()函数是绘制坐标图的. 通常情况下,横轴和纵轴都是数值型数据很好画图,直接带入数据,坐标轴会自动调节大小和显示密度.但是当横轴是日期时 ...

  4. python读取excelsheet-一文看懂用Python读取Excel数据

    原标题:一文看懂用Python读取Excel数据 导读:现有的Excel分为两种格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上). Python处理Excel文件主要 ...

  5. 一文看懂用Python读取Excel数据

    导读:现有的Excel分为两种格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上). Python处理Excel文件主要是第三方模块库xlrd.xlwt.pyexcel- ...

  6. python读取excel某一列内容-Python读取Excel数据并根据列名取值

    一直想将自己接触到的东西梳理一遍,可就是迈不出第一步,希望从这篇总结开始不要再做行动的矮人了. 最近测试过程中需要用到python读取excel用例数据,于是去了解和学习了下xlrd库,这里只记录使用 ...

  7. python如何读取excel数据-python怎么读取excel中的数值

    最近测试过程中需要用到python读取excel用例数据,于是去了解和学习了下xlrd库,这里只记录使用过程中读取excel数据相关操作. 安装xlrd库(推荐学习:Python视频教程) 可以下载x ...

  8. python读取表格数据_Python读取Excel数据并根据列名取值

    一直想将自己接触到的东西梳理一遍,可就是迈不出第一步,希望从这篇总结开始不要再做行动的矮人了. 最近测试过程中需要用到python读取excel用例数据,于是去了解和学习了下xlrd库,这里只记录使用 ...

  9. python读取串口数据保存到mysql数据库_Python3读取Excel数据存入MySQL的方法

    Python是数据分析的强大利器. 利用Python做数据分析,第一步就是学习如何读取日常工作中产生各种excel报表并存入数据中,方便后续数据处理. 这里向大家分享python3如何使用xlrd读取 ...

最新文章

  1. ICinsights:中国芯片难达成既定的2025目标
  2. 利用nginx搭建http和rtmp协议的流媒体服务器
  3. [JZOJ P1291] [DP]添加括号
  4. 简单深搜(poj 3009)
  5. 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试
  6. C++(STL):08---vector元素访问
  7. 论文浅尝 | 基于动态知识图谱向量表示的对称合作对话代理的学习
  8. Android:Activity统一堆栈管理(实现随时finish特定或是所有Activty)
  9. fastjson反序列化过滤字段属性_Fastjsonlt;=1.2.47反序列化漏洞源码分析及复现
  10. AndroidStudio安卓原生开发_Activity的启动模式部分singleTop启动模式和singleTask启动模式---Android原生开发工作笔记87
  11. 设计模式(五)Prototype Pattern
  12. Graylog日志管理系统---搜索查询方法使用简介
  13. phpstudy 2016 版本的安装缺少VC9的运行库如何下载,解决!
  14. 设计模式23模式介绍
  15. Android中免Root实现Hook的Dexposed框架实现原理解析以及如何实现应用的热修复
  16. 核桃编程Delta Lake实时数仓应用实践
  17. iOS-QQ音乐播放器的简单实现
  18. 机器视觉 · 工业光源
  19. c语言switch怎么画流程图,请各位大神帮个忙,画个NS流程图,,急!!!
  20. Tensorflow使用object_detetcion安装教程

热门文章

  1. Trapcode Particular 5 - Fast Physics
  2. 给日文网站所有汉字标上平假名----附《星》的歌词
  3. 2023 全球人工智能开发者先锋大会—AI 人才学习赛rank1方案分享
  4. Python深度学习实战:多类花朵分类
  5. CentOS下网页百度网盘下载资料
  6. “鑫胖”家的红星3.0系统被曝漏洞,可远程执行任意命令注入
  7. 员工满意度调查:微软排第二,第一竟然是?
  8. 目标检测算法——车辆牌照识别数据集汇总 2(附下载链接)
  9. STM32F103RET6
  10. 2022年高教社杯全国大学生数学建模国赛B题思路