电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python matplotlib讀取excel數據并用for循環畫多個子圖subplot操作

瀏覽:127日期:2022-07-17 15:01:25

讀取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()

Python matplotlib讀取excel數據并用for循環畫多個子圖subplot操作

這樣雖然能畫出來,但是需要手動寫每個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 <module> 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
相關文章:
主站蜘蛛池模板: 防火板_饰面耐火板价格、厂家_品牌认准格林雅 | 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 | 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china | 健康管理师报考条件,考试时间,报名入口—首页 | 河南彩印编织袋,郑州饲料编织袋定制,肥料编织袋加工厂-盛军塑业 河南凯邦机械制造有限公司 | 工业制氮机_psa制氮机厂家-宏骁智能装备科技江苏有限公司 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 净化工程_无尘车间_无尘车间装修-广州科凌净化工程有限公司 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 飞利浦LED体育场灯具-吸顶式油站灯-飞利浦LED罩棚灯-佛山嘉耀照明有限公司 | 在线PH计-氧化锆分析仪-在线浊度仪-在线溶氧仪- 无锡朝达 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | 净化板-洁净板-净化板价格-净化板生产厂家-山东鸿星新材料科技股份有限公司 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 逗网红-抖音网红-快手网红-各大平台网红物品导航 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 517瓜水果特产网|一个专注特产好物的网站 | 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 冷热冲击试验箱_温度冲击试验箱价格_冷热冲击箱排名_林频厂家 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 联系我们老街华纳娱乐公司官网19989979996(客服) | 转向助力泵/水泵/发电机皮带轮生产厂家-锦州华一精工有限公司 | 喷漆房_废气处理设备-湖北天地鑫环保设备有限公司 | 工业铝型材生产厂家_铝合金型材配件批发精加工定制厂商 - 上海岐易铝业 | 别墅图纸超市|别墅设计图纸|农村房屋设计图|农村自建房|别墅设计图纸及效果图大全 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 旗帜网络笔记-免费领取《旗帜网络笔记》电子书 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 深圳市万色印象美业有限公司 | 小学教案模板_中学教师优秀教案_高中教学设计模板_教育巴巴 | 石油/泥浆/不锈钢防腐/砂泵/抽砂泵/砂砾泵/吸砂泵/压滤机泵 - 专业石油环保专用泵厂家 |