python 绘制拟合曲线并加指定点标识
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
import os
import numpy as np
from scipy import log
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import math
from sklearn.metrics import r2_score
# 字体
plt.rcParams[ 'font.sans-serif' ] = [ 'SimHei' ]
# 拟合函数
def func(x, a, b):
# y = a * log(x) + b
y = x / (a * x + b)
return y
# 拟合的坐标点
x0 = [ 2 , 4 , 8 , 10 , 24 , 28 , 32 , 48 ]
y0 = [ 6.66 , 8.35 , 10.81 , 11.55 , 13.63 , 13.68 , 13.69 , 13.67 ]
# 拟合,可选择不同的method
result = curve_fit(func, x0, y0,method = 'trf' )
a, b = result[ 0 ]
# 绘制拟合曲线用
x1 = np.arange( 2 , 48 , 0.1 )
#y1 = a * log(x1) + b
y1 = x1 / (a * x1 + b)
x0 = np.array(x0)
y0 = np.array(y0)
# 计算r2
y2 = x0 / (a * x0 + b)
#y2 = a * log(x0) + b
r2 = r2_score(y0, y2)
#plt.figure(figsize=(7.5, 5))
# 坐标字体大小
plt.tick_params(labelsize = 11 )
# 原数据散点
plt.scatter(x0,y0,s = 30 ,marker = 'o' )
# 横纵坐标起止
plt.xlim(( 0 , 50 ))
plt.ylim(( 0 , round ( max (y0)) + 2 ))
# 拟合曲线
plt.plot(x1, y1, "blue" )
plt.title( "标题" ,fontsize = 13 )
plt.xlabel( 'X(h)' ,fontsize = 12 )
plt.ylabel( 'Y(%)' ,fontsize = 12 )
# 指定点,y=9时求x
p = round ( 9 * b / ( 1 - 9 * a), 2 )
#p = b/(math.log(9/a))
p = round (p, 2 )
# 显示坐标点
plt.scatter(p, 9 ,s = 20 ,marker = 'x' )
# 显示坐标点横线、竖线
plt.vlines(p, 0 , 9 , colors = "c" , linestyles = "dashed" )
plt.hlines( 9 , 0 , p, colors = "c" , linestyles = "dashed" )
# 显示坐标点坐标值
plt.text(p, 9 , ( float ( '%.2f' % p), 9 ),ha = 'left' , va = 'top' , fontsize = 11 )
# 显示公式
m = round ( max (y0) / 10 , 1 )
print (m)
plt.text( 48 , m, 'y= x/(' + str ( round (a, 2 )) + '*x+' + str ( round (b, 2 )) + ')' , ha = 'right' ,fontsize = 12 )
plt.text( 48 , m, r '$R^2=$' + str ( round (r2, 3 )), ha = 'right' , va = 'top' ,fontsize = 12 )
# True 显示网格
# linestyle 设置线显示的类型(一共四种)
# color 设置网格的颜色
# linewidth 设置网格的宽度
plt.grid( True , linestyle = "--" , color = "g" , linewidth = "0.5" )
plt.show()
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/ukakasu/article/details/81502096