plot_incon.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. plt.rcParams['font.sans-serif']=['SimHei']
  5. plt.rcParams['axes.unicode_minus']=False
  6. # 生成曲线数据
  7. x = np.linspace(-5, 20, 10000)
  8. y = -0.002 * x + 0.999
  9. # 生成散点数据
  10. data = pd.read_csv('/home/limingze/zlwl-algos/USER/limingze/Inconsistency/result/dis.csv')
  11. x_scatter = data['pca'].values
  12. y_scatter = data['cell_pack'].values
  13. y_pred = -0.002 * x_scatter + 0.999
  14. # 计算置信区间
  15. slope, intercept = np.polyfit(x_scatter, y_scatter, 1)
  16. y_pred = slope * x + intercept
  17. residuals = y_scatter - (slope * x_scatter + intercept)
  18. mse = np.mean(residuals**2)
  19. std_err = np.sqrt(mse)
  20. t_value = 2.093 # 自由度为 n-2,置信水平为95%,查表得到对应的t值
  21. ci_lower = slope - t_value * std_err
  22. ci_upper = slope + t_value * std_err
  23. # 绘制曲线和散点图
  24. plt.title('放电验证')
  25. plt.xlabel('pca')
  26. plt.ylabel('E_real/E_theo')
  27. plt.plot(x, y, label='True Line')
  28. plt.scatter(x_scatter, y_scatter, label='Scatter Points')
  29. # plt.plot(x, y_pred, label='Fitted Line')
  30. iii = 0
  31. diff_list = []
  32. for i in range(len(data['cell_pack'].values)):
  33. if (data['cell_pack'].values[i] > -0.002*data['pca'].values[i]+0.999+0.1) | (data['cell_pack'].values[i] < -0.002*data['pca'].values[i]+0.999-0.1):
  34. iii+=1
  35. if (data['cell_pack'].values[i] > -0.002*data['pca'].values[i]+0.999+0.1):
  36. diff_list.append((data['cell_pack'].values[i]) - (-0.002*data['pca'].values[i]+0.999+0.1))
  37. elif (data['cell_pack'].values[i] < -0.002*data['pca'].values[i]+0.999-0.1):
  38. diff_list.append((-0.002*data['pca'].values[i]+0.999+0.1) - (data['cell_pack'].values[i]))
  39. print(sum(diff_list)/len(diff_list))
  40. print(iii/len(data['cell_pack'].values))
  41. # 绘制置信区间
  42. # plt.fill_between(x, 0.011*x+1.008+t_value*std_err, 0.011*x+1.008-t_value*std_err, alpha=0.3, label='95%置信区间')
  43. plt.fill_between(x, -0.002*x+0.999+0.1, -0.002*x+0.999-0.1, alpha=0.3, label='10%误差区间')
  44. plt.legend()
  45. plt.show()