如何在数据转换后基于原始数据设置坐标轴范围(禁用twinx)
概率分布绘图的需求实现方案
需求回顾
现有一段概率分布绘图的Python代码,需调整为:
- X轴保留原始
failure数据的数值范围 - Y轴范围固定为0到1(对应0%到99.9999%的概率)
- 不使用双坐标轴(
twinx)
当前代码通过对数和极值分布转换实现线性拟合,但绘图时用的是转换后的坐标,不符合需求。
修改后的代码
import numpy as np import matplotlib.pyplot as plt # 原始失效数据 failure = np.array([168, 202, 190, 197, 169, 214, 201, 219, 206, 198, 190, 183, 206, 218, 214, 206, 213, 202, 209, 206]) # 计算概率分布绘图位置(原始概率值) def plottingPositionOriginal(failure, a=0.3): x = np.sort(failure) n = len(x) F = [(i - a) / (n + 1 - 2 * a) for i in range(1, len(failure)+1)] return x, np.array(F) # 拟合极值分布并返回原始坐标下的拟合值 def plottingPositionFit(failure): t, F = plottingPositionOriginal(failure) # 转换变量用于线性拟合 x_log = np.log(t) y_transformed = np.log(-np.log(1 - F)) # 拟合线性模型 beta, c = np.polyfit(x_log, y_transformed, 1) # 反向转换得到拟合的概率值 y_fit_transformed = beta * x_log + c F_fit = 1 - np.exp(-np.exp(y_fit_transformed)) return t, F, F_fit # 获取原始坐标下的数据和拟合值 X_original, Y_original, Y_fit = plottingPositionFit(failure) # 绘图 fig, ax = plt.subplots() ax.scatter(X_original, Y_original, label='原始数据点') ax.plot(X_original, Y_fit, label='拟合线') # 设置坐标轴范围 ax.set_xlim(np.min(failure), np.max(failure)) ax.set_ylim(0, 1) # 添加标签和图例 ax.set_xlabel('失效数据') ax.set_ylabel('累积概率') ax.legend() plt.show()
关键修改说明
- 保留原始X轴:直接使用
plottingPositionOriginal返回的排序后原始失效数据作为X轴坐标,不再用对数转换后的值 - Y轴回归0-1范围:通过反向转换拟合后的极值分布值,得到0到1之间的累积概率值
F_fit,替代原转换后的Y坐标 - 强制坐标轴范围:用
set_xlim和set_ylim分别固定X轴为原始失效数据的最小到最大值,Y轴为0到1 - 移除双坐标轴依赖:所有绘图都基于同一坐标轴,完全符合需求
内容的提问来源于stack exchange,提问作者A.E
相关产品推荐
相关产品推荐

