Python获取excel的数据并绘制直方图

Python刚入门,欢迎大家多多交流~
最近做个小项目,获取医疗数据文件Raw Data MAKO v2.xlsx中的一个名为PHIN-22E_KR的sheet ,获取其指定几列的数据并绘制直方图。excel文件如下
在这里插入图片描述

import xlrd
import numpy as np
import matplotlib.pyplot as plt

def plotavganalyse():
    data=xlrd.open_workbook("Raw Data MAKO v2.xlsx")  #打开excel文件
    #table1=data.sheet_by_name('PHIN-22E_CR')#通过excel里面的表名获取工作表
    #table1 = data.sheet_by_name('PHIN-22E_HR')
    table1 = data.sheet_by_name('PHIN-22E_KR')

    row1 = table1.row_values(0)  # 根据索引读取一行的数据,参数:行索引,开始列索引,结束列索引(不包含)
    for i in range(len(row1)):
        if row1[i] == 'KR_SCORE_CHANGE':
            oneindex1 = i
        elif row1[i] == 'CONSULTANT':
            oneindex2 = i
        elif row1[i] == 'Robotic':
            oneindex3 = i
            
	#获取KR_SCORE_CHANGE、CONSULTANT、Robotic三列的数据
    score_change=table1.col_values(oneindex1, 1)
    consultant=table1.col_values(oneindex2, 1)
    robotic=table1.col_values(oneindex3, 1)
    
	# 剔除CONSULTANT列表中重复元素,并按首字母顺序重新排列
    docter=list(sorted(set(consultant)))
    
    # docavglist存放各docter的手术得分的平均值
    docavglist=[]
     for i in range(len(docter)):
        templist=[]
        for m in range(len(consultant)):
            if consultant[m]==docter[i]:
                templist.append(score_change[m])
        docavglist.append(np.mean(templist))
        
    # docavglist1将docavglist中的数据保留三位小数(四舍五入)
    docavglist1=[]
    for i in range(len(docavglist))    :
        docavglist1.append(float('%.3f'%docavglist[i]))
	# docnameplot 获取docter中各医生的姓氏,便于画图
    docnameplot=[]
    for i in range(len(docter)):
        docnameplot.append((docter[i].split(' ',1))[1])
    #str.split(' ', 1 ); # 以空格为分隔符,分隔成两个
    # 例如 str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
    # print str.split();  # 以空格为分隔符,包含 \n
    # print str.split(' ', 1);  # 以空格为分隔符,分隔成两个

    print("**************************开始绘图**************************")
    plt.bar(docnameplot, docavglist1)
    plt.axhline(y=np.mean(score_change),color="red") #在直方图上画一条平均值线
    plt.text(-2.6, np.mean(score_change), "Average", color = "r",size=14, alpha=0.7) #对平均值线添加文字信息,alpha为透明度
    plt.xlabel('Docter')
    plt.ylabel('Avg_SCORE_CHANGE')
    #在直方图中各柱的头上标注其值 
    for a, b in zip(docnameplot, docavglist1):
        plt.text(a, b + 1, b, ha='center', va='bottom')
    plt.show()

if __name__=='__main__':
    plotavganalyse()

结果如下
在这里插入图片描述
代码参考了许多博主的文章,涉及的博主较多没详细记录,在此表示感谢;Python初学者,欢迎指教~

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值