如下 Python 代码主要用于处理和分析数据,并使用 Matplotlib 库绘制出数据的拟合曲线。它的主要步骤包括数据预处理、进行线性回归分析,并根据结果绘图展示。下面是对代码及其所引用库的详细解释:
引用的库
-
numpy (
np
):- 用于进行数值计算。这里主要用于处理数组数据,如进行数学运算和变换。
-
scipy.stats:
- 提供统计工具,这里使用了
linregress
函数来进行线性回归分析,从而找出数据间的数学关系。
- 提供统计工具,这里使用了
-
matplotlib.pyplot (
plt
):- 用于绘制图形,这里用来展示原始数据点和拟合的曲线。
-
matplotlib:
- 用来配置绘图样式,这里特别设置了字体以支持中文显示,并调整了其他样式如字体大小和正确显示负号。
-
math:
- 提供基本的数学运算函数,这里用来计算对数和指数运算。
代码功能
-
配置 Matplotlib 支持中文显示:
- 设置字体为微软雅黑,确保图表中的中文可以正确显示。
-
数据定义:
- 定义了两个数组,
x_values
和Pdbm_values
,分别存储 ADC 值和对应的功率值(dBm)。
- 定义了两个数组,
-
数据转换:
- 将 ADC 值转换为对数尺度(
left_side
),这对应物理测量中常见的对数响应。 - 将 dBm 值转换为适合进行线性回归的形式(
right_side
),方法是将 dBm 值除以 10。
- 将 ADC 值转换为对数尺度(
-
线性回归分析:
- 使用
linregress
函数对转换后的数据进行线性回归,计算数据的斜率和截距,以及回归的统计参数如决定系数 (R²)。
- 使用
-
拟合值计算:
- 根据回归结果和计算出的 R 值估计 (Re)。
-
绘制结果:
- 使用 Matplotlib 绘制原始数据点和拟合曲线。
- 添加图例、标题、坐标轴标签和文本框显示计算出的 (Re) 值和 R²。
-
显示图形:
- 最后通过
plt.show()
显示图形界面。
- 最后通过
import numpy as np
from scipy.stats import linregress
import matplotlib.pyplot as plt
import matplotlib
import math
# 设置 Matplotlib 支持中文
matplotlib.rcParams['font.family'] = 'Microsoft YaHei' # 设置字体为微软雅黑
matplotlib.rcParams['font.size'] = 16 # 设置字体大小
matplotlib.rcParams['axes.unicode_minus'] = False # 正确显示负号
TitleStr='PD3拟合曲线'
R_Values = 8.2 # 根据之前的设置,这里使用了0.249的系数
# 新的给定数据
x_values = np.array([3118, 2963, 2447, 2097, 1861, 1448, 1143, 856, 612, 508, 399, 338, 266, 201, 175, 130, 118, 98, 87, 85, 80, 70, 55])
Pdbm_values = np.array([-3.7, -4.01, -4.85, -5.52, -6.04, -7.13, -8.16, -9.42, -10.87, -11.69, -12.73, -13.46, -14.52, -15.73, -16.35, -17.64, -18.07, -18.9, -19.41, -19.52, -19.88, -20.43, -21.51])
# 计算转换后的 x 值的对数
left_side =np.log10(x_values * 5.0 / (4096))
# 转换 Pdbm 值为线性回归可用的线性尺度
right_side = Pdbm_values / (10)
# 进行线性回归得到斜率和截距
slope, intercept, r_value, p_value, std_err = linregress(left_side, right_side)
# 根据截距计算估计的 Re
estimated_log_Re = -intercept
estimated_Re = math.pow(10,estimated_log_Re)/R_Values
# 生成拟合线的点
x_fit = np.linspace(min(x_values), max(x_values), 100)
y_fit = 10 * np.log10( ((x_fit * 5.0) / 4096 ) /(estimated_Re*R_Values) )
# 绘制结果
plt.figure(figsize=(10, 6))
plt.scatter(x_values, Pdbm_values, color='blue', label='实际数据') # 实际数据
plt.plot(x_fit, y_fit, 'r-', label='拟合曲线')
plt.xlabel('ADC 值 (x)')
plt.ylabel('光功率 (dBm)')
plt.title(TitleStr)
# # Display Re and R^2 values
plt.text(min(x_values), min(Pdbm_values), f' 拟合 Re: {estimated_Re:.5f} \n'
f' 决定系数 (R^2): {r_value**2:.5f}', fontsize=12, color='red')
plt.legend()
plt.grid(True)
plt.show()
# 输出结果
print(f'Estimated Re: {estimated_Re:.5f}')
print(f'Coefficient of determination (R^2): {r_value**2:.5f}')