Python读取excel生成正态分布图

Python读取excel生成正态分布图

需求背景:
在制造业工厂为了统计产品尺寸的分布程度,需要制作正态分布图,excel 中没有专门的概率分布图制作比较麻烦。使用python容易实现。
运行环境:
win10 win8 win7 64位操作系统
python 3.6 以上
第三方库:
numpy
matplotlib
xlrd
程序代码:

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


def get_excel_value(j,filename):  #j代表列0是第一列,j,filename 为文件名
        row_list =[] #建立空列表插入尺寸数据
        excel = xlrd.open_workbook(r"%s"%filename)
        #sheet = excel.sheet_by_index(0)  #根据下标获取对应的sheet表
        sheet = excel.sheet_by_name("report")  #根据表名获取对应的sheet表
        #for  j in range(0,sheet.ncols):
        for i in range(5, sheet.nrows):     #从表的第6行开始到
            if sheet.row_values(i, start_colx=j, end_colx=j+1):  #内循环
               row_list.append(sheet.row_values(i, start_colx=j, end_colx=j+1)[0]) #每次循环取一个单元格数据插入列表中
        arr_mean = np.mean(row_list)
        arr_std = np.std(row_list,ddof=1)
        return row_list,arr_mean,arr_std   #函数返回尺寸数据,尺寸均值,尺寸标准差


def get_tolerance(j,filename):  #读取公差函数,公差在工作表的3-5行
        excel = xlrd.open_workbook(r"%s"%filename)
        sheet = excel.sheet_by_index(0)  #根据下标获取对应的sheet表
        nominalvalue = sheet.row_values(2, start_colx=j, end_colx=j+1)[0]
        up=sheet.row_values(3, start_colx=j, end_colx=j+1)[0]
        low=sheet.row_values(4, start_colx=j, end_colx=j+1)[0]
        LSL=nominalvalue+low
        USL=nominalvalue+up
        return LSL,USL
        
def get_name(j,filename):   #获取尺寸名
        excel = xlrd.open_workbook(r"%s"%filename)
        sheet = excel.sheet_by_index(0)  #根据下标获取对应的sheet表
        name = sheet.row_values(1, start_colx=j, end_colx=j+1)[0]
        return name



class higram:
        
    def __init__(self,dimension,filename,mu,sigma,data,LSL,USL,num_bins ):

        self.dimension=dimension
        self.filename=filename
        self.mu=mu
        self.sigma=sigma
        self.data=data
        self.LSL=LSL
        self.USL=USL
        self.num_bins=num_bins


    def creatchart(self):
  
        # 设置matplotlib正常显示中文和负号
        matplotlib.rcParams['font.sans-serif']=['SimHei']   # 用黑体显示中文
        matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号
        
        def norm_pdf(x,mu,sigma):
            pdf = np.exp(-((x - mu)**2) / (2* sigma**2)) / (sigma * np.sqrt(2*np.pi)) #正态分布函数
            return pdf


        n, bins, patches = plt.hist(self.data, self.num_bins, density=1, facecolor="blue", edgecolor="black", alpha=0.5)#facecolor直方填充颜色edgecolor直方边框颜色
       
        #FFC0CB Pink 粉红 #E6E6FA Lavender 淡紫色/熏衣草淡紫
    
        y=norm_pdf(bins, mu, sigma)   #概率分布图
        #print(y)

        plt.plot(bins, y, 'r--',linestyle='-')   #概率分布图"_"代表实线,"r--"代表红色

        x = np.linspace(self.LSL, self.LSL, 100)    #等差数列
        y = np.linspace(0, 60, 100)
        plt.text(x[0],y[39],'LSL',size=13)    #text(x,y,str),x,y 文字的坐标
        plt.plot(x, y, 'g--', linewidth=1)
        
        x = np.linspace(self.USL, self.USL, 100)
        y = np.linspace(0, 60, 100)
        plt.text(x[0],y[39],'USL',size=13)
        plt.plot(x, y, 'g--', linewidth=1)
        
        plt.xlabel("区间")# 显示纵轴标签

        plt.ylabel("频数/频率") # 显示图标题

        plt.title(self.dimension+"_正态分布图")
        plt.subplots_adjust(left=0.15)   #把画的图从左边0.15(整个为1)处开始, 要不把y轴的label显示不出来
       
       

        plt.show()

if __name__ == "__main__":
    #s=time.time()
    data=get_excel_value(0,"检测报告.xls")[0]  #尺寸数据
    mu=get_excel_value(0,"检测报告.xls")[1]    #尺寸均值
    sigma=get_excel_value(0,"检测报告.xls")[2]     #尺寸标准差
    LSL=get_tolerance(0,"检测报告.xls")[0]       #下公差
    USL=get_tolerance(0,"检测报告.xls")[1]       #上公差
    Dimension=get_name(0,"检测报告.xls")
    #尺寸名
    #e=time.time()
    #t=e-s
    #print(t)
    '''print("result:",data)
    print("mean:",mu)
    print("std:",sigma)
    print("LSL:",LSL)
    print("USL:",USL)
    print("Dimension:",Dimension)'''
    h=higram(Dimension,"检测报告.xls",mu,sigma,data,LSL,USL,num_bins=60)
    h.creatchart()

运行效果:

在这里插入图片描述

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在Excel中绘制Python正态分布表格,你可以使用以下步骤: 1. 首先,导入所需的Python库,包括pandas、matplotlib.pyplot和numpy。 2. 然后,导入Excel数据。你可以使用pandas库中的read_excel函数来读取Excel文件。确保你已经安装了pandas库,并使用它来加载你的数据。例如,你可以使用以下代码读取名为"data.xlsx"的Excel文件,并将其存储在一个名为"df"的变量中: ```python df = pd.read_excel("data.xlsx") ``` 3. 接下来,使用scipy.stats库中的正态分布函数来生成正态分布数据。你可以使用numpy库的linspace函数来创建一组等间隔的值,作为横坐标。然后,使用scipy.stats库中的norm函数来生成对应的纵坐标上的正态分布值。例如,以下代码可以生成正态分布数据: ```python x = np.linspace(-4, 4, 100) # 创建横坐标上的等间隔值 y = stats.norm.pdf(x, loc=0, scale=1) # 生成对应的纵坐标上的正态分布值 ``` 其中,loc表示正态分布的均值,scale表示正态分布的标准差。 4. 最后,使用matplotlib.pyplot库中的plot函数将数据绘制成表格。你可以使用以下代码来绘制正态分布表格: ```python plt.plot(x, y) # 绘制正态分布曲线 plt.xlabel('X') # 设置横坐标标题 plt.ylabel('Y') # 设置纵坐标标题 plt.title('Normal Distribution') # 设置表标题 plt.show() # 显示表 ``` 这将在Excel中绘制一个正态分布的表格。请确保你已经安装了相应的Python库,并根据你的数据和需求进行适当的修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [c语言如何判断数据是否符合正态分布_如何判断数据是否符合正态分布?](https://blog.csdn.net/weixin_39907157/article/details/111042855)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [读入 .csv或 Excel 文件,基于 DataFrame 绘制每一列的正态分布像,以子的形式放入一个画布 figure 中...](https://blog.csdn.net/m0_60465807/article/details/128594264)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值