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初学者,欢迎指教~

发布了2 篇原创文章 · 获赞 0 · 访问量 52

猜你喜欢

转载自blog.csdn.net/ajc_zh/article/details/104260020