Python实现Matlab wblplot()风格威布尔概率图的方法问询
Python复现Matlab wblplot()威布尔概率图方案
一、现成库快速实现(推荐reliability库)
reliability是专注于可靠性工程的第三方库,直接支持生成和Matlab wblplot()一致的威布尔概率图,自动处理非均匀刻度、参数拟合问题,无需手动调整。
安装与使用
pip install reliability
from reliability.Fitters import Fit_Weibull_2P from reliability.Probability_plotting import plot_points import matplotlib.pyplot as plt # 替换为你的实际数据集 data = [12, 25, 30, 42, 55, 68, 72, 85, 90, 105] # 拟合2参数威布尔分布(固定位置参数为0) fit = Fit_Weibull_2P(failures=data) print(f"形状参数k: {fit.beta:.3f}, 尺度参数λ: {fit.alpha:.3f}") # 生成威布尔概率图,自动处理y轴非均匀刻度 plot_points(failures=data, dist='Weibull', show_plot=True) plt.show()
二、自定义实现(手动处理刻度与拟合)
如果不想依赖第三方库,可通过以下步骤手动实现:
1. 编程拟合形状与尺度参数
使用scipy.stats.weibull_min的fit()方法,固定位置参数为0(符合标准威布尔分布假设):
import numpy as np from scipy.stats import weibull_min data = np.array([12, 25, 30, 42, 55, 68, 72, 85, 90, 105]) # 拟合2参数威布尔分布 shape, loc, scale = weibull_min.fit(data, floc=0) print(f"形状参数k: {shape:.3f}, 尺度参数λ: {scale:.3f}")
2. 手动设置y轴非均匀刻度
威布尔概率图的y轴是双对数变换后的累积失效概率,直接用均匀刻度会导致低概率区域拥挤,需手动指定关键分位数作为刻度点:
import matplotlib.pyplot as plt # 排序数据并计算中位秩(与Matlab wblplot分位数计算逻辑一致) sorted_data = np.sort(data) n = len(sorted_data) p = (np.arange(n) + 0.3) / (n + 0.4) # 中位秩公式,比简单分位数更准确 # 坐标转换:x取自然对数,y取ln(-ln(1-p)) x_plot = np.log(sorted_data) y_plot = np.log(-np.log(1 - p)) # 拟合转换后的直线,斜率为形状参数k,截距推导尺度参数λ slope, intercept = np.polyfit(x_plot, y_plot, 1) fit_shape = slope fit_scale = np.exp(-intercept / slope) # 自定义y轴刻度:选择低概率区间隔更大的分位数 p_ticks = [0.01, 0.05, 0.1, 0.2, 0.3, 0.5, 0.7, 0.8, 0.9, 0.95, 0.99] y_ticks = np.log(-np.log(1 - np.array(p_ticks))) y_tick_labels = [f"{int(p*100)}%" for p in p_ticks] # 绘图 plt.figure(figsize=(8, 6)) plt.scatter(x_plot, y_plot, label='数据点') plt.plot(x_plot, slope*x_plot + intercept, 'r--', label=f'拟合直线 (k={fit_shape:.2f}, λ={fit_scale:.2f})') # 应用自定义y轴刻度 plt.yticks(y_ticks, y_tick_labels) plt.ylabel('累积失效概率') plt.xlabel('ln(寿命)') plt.title('威布尔概率图') plt.grid(True, linestyle='--', alpha=0.7) plt.legend() plt.show()
解决y轴拥挤问题的核心逻辑
威布尔概率图的y轴基于ln(-ln(1-p))变换,原始均匀分位数在变换后会在低概率区(p接近0)密集。通过手动指定0.01、0.05、0.1这类间隔更大的分位数作为刻度点,可直接拉开低数值区域的间距,匹配Matlab的显示效果。
内容的提问来源于stack exchange,提问作者jflyxd
相关产品推荐
相关产品推荐

