Python读取excel文件和绘画饼图

读取一个.xlsx文件,获得其中一个sheet的数据,以此绘制一个饼图
在这里插入图片描述

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

def eq5d_index_change():
    data=xlrd.open_workbook("Raw Data MAKO v2.xlsx")  # 打开excel文件
    table=data.sheet_by_name('PHIN-22E_CR') # 通过excel里面的表名获取工作表
    row=table.row_values(0)#根据索引读取一行的数据,参数:行索引,开始列索引,结束列索引(不包含)
    print("标题行:",end=' ')
    print(row)
    #获得EQ5D_INDEX_CHANGE列的索引
    for i in range(len(row)):
        if row[i]=='EQ5D_INDEX_CHANGE':
            index=i
            break
    EQ5D_INDEX_CHANGE=table.col_values(index, 1) #获得EQ5D_INDEX_CHANGE列的数据
	
	#原始数列因为某些原因,存在空值,因此先使用剩余元素的平均值填充一下空值
    sum=0.0
    for i in range(len(EQ5D_INDEX_CHANGE)):
        if isinstance(EQ5D_INDEX_CHANGE[i], float): # 判断元素是否为float类型,即不是空值
        sum+=EQ5D_INDEX_CHANGE[i]
        average=sum/len(EQ5D_INDEX_CHANGE)
        
    for i in range(len(EQ5D_INDEX_CHANGE)):
        if not isinstance(EQ5D_INDEX_CHANGE[i], float): #元素不是float类型即空值时,使用剩余元素的平均值填充
        EQ5D_INDEX_CHANGE[i]=average
        
    print ("使用平均值填充后:",end=' ')
    print(EQ5D_INDEX_CHANGE)

    print ("EQ5D_INDEX_CHANGE平均值为:",end=' ')
    print(np.mean(EQ5D_INDEX_CHANGE))
	
	#统计高于平均值的个数,high予以计数
    high=0
    for i in range(len(EQ5D_INDEX_CHANGE)):
        if EQ5D_INDEX_CHANGE[i]>=np.mean(EQ5D_INDEX_CHANGE):high+=1

    print("**************************开始绘图**************************")
    plt.bar(range(len(EQ5D_INDEX_CHANGE)), EQ5D_INDEX_CHANGE)
    plt.title("Statistics")
    plt.axhline(y=np.mean(EQ5D_INDEX_CHANGE),color="red")
    plt.ylabel("EQ5D_INDEX_CHANGE")
    labels=['Above average','Below average']
    X=[]
    X.append(high)
    X.append(len(EQ5D_INDEX_CHANGE)-high)
    fig = plt.figure()
    plt.pie(X,labels=labels,autopct='%1.2f%%') #画饼图(数据,数据对应的标签,百分数保留两位小数点)
    plt.title("Proportional pie chart")
    plt.show()

if __name__ == '__main__':
    eq5d_index_change()
    

结果如下
在这里插入图片描述
Python初学,很多地方不熟悉,欢迎指教~

发布了11 篇原创文章 · 获赞 0 · 访问量 588

猜你喜欢

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