①を関数にしてx1,x2を使うときに呼び出したらよいのではないですか?
理解が間違っていたらすみません。
python
1 from scipy . optimize import curve_fit
2 import matplotlib . pyplot as plt
3 import matplotlib . cm as cm
4 import pandas as pd
5 import numpy as np
6 from scipy import signal
7 import os
8 from scipy . signal import find_peaks
9
10
11 x , y = np . loadtxt ( "./2_BLT_powder_2th-ome.txt" , skiprows = 29 , unpack = True )
12
13
14 def detect_peak ( ) :
15 global x
16 global y
17 peaks , _ = find_peaks ( x , height = 200 )
18 #signal.find_peaks(x, height=高さ, distance=距離)
19
20 # 極大値 orderを変えることでピークの検出が変わる(ピーク検出の閾値)
21 maxid = signal . argrelmax ( y , order = 100 )
22 # minid = signal.argrelmin(y, order=1) #極小値
23
24 x_max = max ( x )
25 y_max = max ( y )
26 y_min = min ( y )
27 x_min = min ( x )
28 fig = plt . figure ( figsize = ( 15 , 5 ) ) # 図のアスペクト比を変更(横×縦)
29 Map1 = fig . add_subplot ( 111 )
30 Map1 . plot ( x , y )
31
32 #plt.plot((x, y), pltsize=(6,6))
33 plt . tick_params ( labelsize = 9 ) # 目盛りの数字の大きさを変更
34 plt . ylim ( y_min , y_max * 1.1 ) # y 軸の範囲の設定,
35 plt . xlim ( 10 , 65 ) # x 軸の範囲の設定
36 # plt.show()
37
38 plt . plot ( x [ maxid ] , y [ maxid ] , 'ro' , label = 'peak_max' )
39 # plt.plot(x[minid],y[minid],'bo',label='ピーク値(最小)')
40
41 plt . legend ( )
42 return x [ maxid ] , y [ maxid ]
43
44 def func ( x , * params ) :
45
46 #paramsの長さでフィッティングする関数の数を判別。
47 num_func = int ( len ( params ) / 3 )
48
49 #ガウス関数にそれぞれのパラメータを挿入してy_listに追加。
50 y_list = [ ]
51 for i in range ( num_func ) :
52 y = np . zeros_like ( x )
53 param_range = list ( range ( 3 * i , 3 * ( i + 1 ) , 1 ) )
54 amp = params [ int ( param_range [ 0 ] ) ]
55 ctr = params [ int ( param_range [ 1 ] ) ]
56 wid = params [ int ( param_range [ 2 ] ) ]
57 y = y + amp * np . exp ( - ( ( x - ctr ) / wid ) ** 2 )
58 y_list . append ( y )
59
60 #y_listに入っているすべてのガウス関数を重ね合わせる。
61 y_sum = np . zeros_like ( x )
62 for i in y_list :
63 y_sum = y_sum + i
64
65 #最後にバックグラウンドを追加。
66 y_sum = y_sum + params [ - 1 ]
67
68 return y_sum
69
70 #プロットの定義
71 def fit_plot ( x , * params ) :
72 num_func = int ( len ( params ) / 3 )
73 y_list = [ ]
74 for i in range ( num_func ) :
75 y = np . zeros_like ( x )
76 param_range = list ( range ( 3 * i , 3 * ( i + 1 ) , 1 ) )
77 amp = params [ int ( param_range [ 0 ] ) ]
78 ctr = params [ int ( param_range [ 1 ] ) ]
79 wid = params [ int ( param_range [ 2 ] ) ]
80 y = y + amp * np . exp ( - ( ( x - ctr ) / wid ) ** 2 ) + params [ - 1 ]
81 y_list . append ( y )
82 return y_list
83
84 #初期値のリストを作成
85 #[amp,ctr,wid]
86
87 # x1, y1 = detect_peak() ##
88 np_x , np_y = detect_peak ( ) ##
89
90 x2 = float ( input ( "x2" ) )
91 y2 = float ( input ( "y2" ) )
92 # guess = [] ##
93 guess = [ [ y1 , x1 , 1 ] for ( x1 , y1 ) in zip ( np_x , np_y ) ] ##
94 # guess.append([y1, x1, 1]) ##
95 guess . append ( [ y2 , x2 , 1 ] )
96
97 #バックグラウンドの初期値
98 background = 70
99
100 #初期値リストの結合
101 guess_total = [ ]
102 for i in guess :
103 guess_total . extend ( i )
104 guess_total . append ( background )
105
106 popt , pcov = curve_fit ( func , x , y , p0 = guess_total )
107
108
109
110 fit = func ( x , * popt )
111 plt . scatter ( x , y , s = 20 )
112 plt . plot ( x , fit , ls = '-' , c = 'black' , lw = 1 )
113
114 y_list = fit_plot ( x , * popt )
115 baseline = np . zeros_like ( x ) + popt [ - 1 ]
116 for n , i in enumerate ( y_list ) :
117 plt . fill_between ( x , i , baseline , facecolor = cm . rainbow ( n / len ( y_list ) ) , alpha = 0.6 )
118
119 print ( * popt )
編集(12/01 17:35) ##が変更点です
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/01 05:59
2021/12/01 08:35
2021/12/01 09:08
2021/12/01 10:39
2021/12/01 17:36
2021/12/02 01:45
2021/12/02 04:43
2021/12/02 05:21
2021/12/02 05:37
2021/12/02 06:25 編集
2021/12/02 06:41
2021/12/02 06:46
2021/12/02 06:53
2021/12/02 07:26 編集
2021/12/02 07:34
2021/12/02 07:39
2021/12/02 08:04
2021/12/02 08:06
2021/12/02 08:16
2021/12/02 08:20
2021/12/02 08:31
2021/12/02 08:55
2021/12/02 09:29