teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

2021/12/02 11:52

投稿

Nari9113
Nari9113

スコア3

title CHANGED
@@ -1,1 +1,1 @@
1
- 教えてください、、ピーク検出後その値を用いてピークフィッティングをしたいです
1
+ ピーク検出後その値を用いてピークフィッティングをしたいです
body CHANGED
@@ -2,246 +2,12 @@
2
2
 
3
3
  あるデータを用いて①ピーク検出②その検出した値からピークフィッティングを用いてピークを求めるのを一つにまとめたいです
4
4
  色々サイトを見て進めているのでごちゃごちゃしていると思うので省略できそうな部分があればそれも教えて頂きたいです
5
- ### ①ピーク検出
6
-
7
- ```Python
8
- import pandas as pd
9
- import numpy as np
10
- from scipy import signal
11
- import matplotlib.pyplot as plt
12
- import os
13
- from scipy.signal import find_peaks
14
-
15
-
16
-
17
- x, y = np.loadtxt("./2_BLT_powder_2th-ome.txt",skiprows=29, unpack=True)
18
-
19
- peaks, _ = find_peaks(x, height=200)
20
- #signal.find_peaks(x, height=高さ, distance=距離)
21
-
22
- maxid = signal.argrelmax(y, order=100) #極大値 orderを変えることでピークの検出が変わる(ピーク検出の閾値)
23
- #minid = signal.argrelmin(y, order=1) #極小値
24
-
25
-
26
-
27
- x_max = max(x)
28
- y_max = max(y)
29
- y_min = min(y)
30
- x_min = min(x)
31
- fig=plt.figure(figsize=(15,5))#図のアスペクト比を変更(横×縦)
32
- Map1 = fig.add_subplot(111)
33
- Map1.plot(x, y)
34
-
35
- #plt.plot((x, y), pltsize=(6,6))
36
- plt.tick_params(labelsize = 9)#目盛りの数字の大きさを変更
37
- plt.ylim(y_min, y_max*1.1) # y 軸の範囲の設定,
38
- plt.xlim(10,65) # x 軸の範囲の設定
39
- #plt.show()
40
-
41
- plt.plot(x[maxid],y[maxid],'ro',label='peak_max')
42
- #plt.plot(x[minid],y[minid],'bo',label='ピーク値(最小)')
43
-
44
-
45
-
46
- plt.legend()
47
- print(x[maxid])
48
- print(y[maxid])
49
- ```
50
- ###②ピークフィッティング
51
- ```Python
52
- from scipy.optimize import curve_fit
53
- import numpy as np
54
- import matplotlib.pyplot as plt
55
- import matplotlib.cm as cm
56
- import pandas as pd
57
-
58
- x, y = np.loadtxt("./2_BLT_powder_2th-ome.txt",skiprows=29, unpack=True)
59
-
60
-
61
- def func(x, *params):
62
-
63
- #paramsの長さでフィッティングする関数の数を判別。
64
- num_func = int(len(params)/3)
65
-
66
- #ガウス関数にそれぞれのパラメータを挿入してy_listに追加。
67
- y_list = []
68
- for i in range(num_func):
69
- y = np.zeros_like(x)
70
- param_range = list(range(3*i,3*(i+1),1))
71
- amp = params[int(param_range[0])]
72
- ctr = params[int(param_range[1])]
73
- wid = params[int(param_range[2])]
74
- y = y + amp * np.exp( -((x - ctr)/wid)**2)
75
- y_list.append(y)
76
-
77
- #y_listに入っているすべてのガウス関数を重ね合わせる。
78
- y_sum = np.zeros_like(x)
79
- for i in y_list:
80
- y_sum = y_sum + i
81
-
82
- #最後にバックグラウンドを追加。
83
- y_sum = y_sum + params[-1]
84
-
85
- return y_sum
86
-
87
- #プロットの定義
88
- def fit_plot(x, *params):
89
- num_func = int(len(params)/3)
90
- y_list = []
91
- for i in range(num_func):
92
- y = np.zeros_like(x)
93
- param_range = list(range(3*i,3*(i+1),1))
94
- amp = params[int(param_range[0])]
95
- ctr = params[int(param_range[1])]
96
- wid = params[int(param_range[2])]
97
- y = y + amp * np.exp( -((x - ctr)/wid)**2) + params[-1]
98
- y_list.append(y)
99
- return y_list
100
-
101
- #初期値のリストを作成
102
- #[amp,ctr,wid]
103
- x1=float(input("x1"))
104
- y1=float(input("y1"))
105
- x2=float(input("x2"))
106
- y2=float(input("y2"))
107
- guess = []
108
- guess.append([y1, x1, 1])
109
- guess.append([y2, x2, 1])
110
-
111
- #バックグラウンドの初期値
112
- background = 70
113
-
114
- #初期値リストの結合
115
- guess_total = []
116
- for i in guess:
117
- guess_total.extend(i)
118
- guess_total.append(background)
119
-
120
- popt, pcov = curve_fit(func, x, y, p0=guess_total)
121
-
122
-
123
-
124
- fit= func(x, *popt)
125
- plt.scatter(x, y, s=20)
126
- plt.plot(x, fit , ls='-', c='black', lw=1)
127
-
128
- y_list = fit_plot(x, *popt)
129
- baseline = np.zeros_like(x) + popt[-1]
130
- for n,i in enumerate(y_list):
131
- plt.fill_between(x, i, baseline, facecolor=cm.rainbow(n/len(y_list)), alpha=0.6)
132
-
133
- print(*popt)
134
- ```
135
5
  ### 実現したいこと
136
6
 
137
7
  ①で出たx[maxid],y[maxid]を②のx1,y1に一つずつ自動入力され値が得られるような自動解析ができるコードを作りたいです
138
8
 
139
- ###追記
140
- ```Python
141
- from scipy.optimize import curve_fit
142
- import matplotlib.pyplot as plt
143
- import matplotlib.cm as cm
144
- import pandas as pd
145
- import numpy as np
146
- from scipy import signal
147
- import os
148
- from scipy.signal import find_peaks
149
9
 
150
10
 
151
- x, y = np.loadtxt("./2_BLT_powder_2th-ome.txt", skiprows=29, unpack=True)
152
-
153
-
154
- def detect_peak():
155
- global x
156
- global y
157
- #signal.find_peaks(x, height=高さ, distance=距離)
158
-
159
- # 極大値 orderを変えることでピークの検出が変わる(ピーク検出の閾値)
160
- maxid = signal.argrelmax(y, order=100)
161
- # minid = signal.argrelmin(y, order=1) #極小値
162
-
163
-
164
- plt.plot(x[maxid], y[maxid], 'ro', label='peak_max')
165
- # plt.plot(x[minid],y[minid],'bo',label='ピーク値(最小)')
166
-
167
- return x[maxid], y[maxid]
168
-
169
- def func(x, *params):
170
-
171
- #paramsの長さでフィッティングする関数の数を判別。
172
- num_func = int(len(params)/3)
173
-
174
- #ガウス関数にそれぞれのパラメータを挿入してy_listに追加。
175
- y_list = []
176
- for i in range(num_func):
177
- y = np.zeros_like(x)
178
- param_range = list(range(3*i,3*(i+1),1))
179
- amp = params[int(param_range[0])]
180
- ctr = params[int(param_range[1])]
181
- wid = params[int(param_range[2])]
182
- y = y + amp * np.exp( -((x - ctr)/wid)**2)
183
- y_list.append(y)
184
-
185
- #y_listに入っているすべてのガウス関数を重ね合わせる。
186
- y_sum = np.zeros_like(x)
187
- for i in y_list:
188
- y_sum = y_sum + i
189
-
190
- #最後にバックグラウンドを追加。
191
- y_sum = y_sum + params[-1]
192
-
193
- return y_sum
194
-
195
- #プロットの定義
196
- def fit_plot(x, *params):
197
- num_func = int(len(params)/3)
198
- y_list = []
199
- for i in range(num_func):
200
- y = np.zeros_like(x)
201
- param_range = list(range(3*i,3*(i+1),1))
202
- amp = params[int(param_range[0])]
203
- ctr = params[int(param_range[1])]
204
- wid = params[int(param_range[2])]
205
- y = y + amp * np.exp( -((x - ctr)/wid)**2) + params[-1]
206
- y_list.append(y)
207
- return y_list
208
-
209
- #初期値のリストを作成
210
- #[amp,ctr,wid]
211
-
212
- # x1, y1 = detect_peak() ##
213
- np_x, np_y = detect_peak() ##
214
-
215
-
216
- # guess = [] ##
217
- guess = [[y1, x1, 1] for (x1, y1) in zip(np_x, np_y)] ##
218
- # guess.append([y1, x1, 1]) ##
219
-
220
-
221
- #バックグラウンドの初期値
222
- background = 70
223
-
224
- #初期値リストの結合
225
- guess_total = []
226
- for i in guess:
227
- guess_total.extend(i)
228
- guess_total.append(background)
229
-
230
- popt, pcov = curve_fit(func, x, y, p0=guess_total)
231
-
232
-
233
-
234
- fit= func(x, *popt)
235
- plt.scatter(x, y, s=20)
236
- plt.plot(x, fit , ls='-', c='black', lw=1)
237
-
238
- y_list = fit_plot(x, *popt)
239
- baseline = np.zeros_like(x) + popt[-1]
240
- for n,i in enumerate(y_list):
241
- plt.fill_between(x, i, baseline, facecolor=cm.rainbow(n/len(y_list)), alpha=0.6)
242
-
243
- print(*popt)
244
- ```
245
11
  ###追記部分エラーメッセージ
246
12
  ```Python
247
13
  RuntimeError Traceback (most recent call last)

2

エラーコード追加

2021/12/02 11:52

投稿

Nari9113
Nari9113

スコア3

title CHANGED
File without changes
body CHANGED
@@ -242,8 +242,26 @@
242
242
 
243
243
  print(*popt)
244
244
  ```
245
+ ###追記部分エラーメッセージ
246
+ ```Python
247
+ RuntimeError Traceback (most recent call last)
248
+ C:\Users\Public\Documents\Wondershare\CreatorTemp/ipykernel_9180/2660802360.py in <module>
249
+ 88 guess_total.append(background)
250
+ 89
251
+ ---> 90 popt, pcov = curve_fit(func, x, y, p0=guess_total)
252
+ 91
253
+ 92
245
254
 
255
+ ~\AppData\Local\Programs\Python\Python39\lib\site-packages\scipy\optimize\minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
256
+ 792 cost = np.sum(infodict['fvec'] ** 2)
257
+ 793 if ier not in [1, 2, 3, 4]:
258
+ --> 794 raise RuntimeError("Optimal parameters not found: " + errmsg)
259
+ 795 else:
260
+ 796 # Rename maxfev (leastsq) to max_nfev (least_squares), if specified.
246
261
 
262
+ RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 14200.
263
+ ```
264
+
247
265
  ### 補足情報
248
266
 
249
267
  もし必要な情報があればコメントお願いします。助けてください泣

1

コードの修正

2021/12/01 17:35

投稿

Nari9113
Nari9113

スコア3

title CHANGED
File without changes
body CHANGED
@@ -136,7 +136,114 @@
136
136
 
137
137
  ①で出たx[maxid],y[maxid]を②のx1,y1に一つずつ自動入力され値が得られるような自動解析ができるコードを作りたいです
138
138
 
139
+ ###追記
140
+ ```Python
141
+ from scipy.optimize import curve_fit
142
+ import matplotlib.pyplot as plt
143
+ import matplotlib.cm as cm
144
+ import pandas as pd
145
+ import numpy as np
146
+ from scipy import signal
147
+ import os
148
+ from scipy.signal import find_peaks
139
149
 
150
+
151
+ x, y = np.loadtxt("./2_BLT_powder_2th-ome.txt", skiprows=29, unpack=True)
152
+
153
+
154
+ def detect_peak():
155
+ global x
156
+ global y
157
+ #signal.find_peaks(x, height=高さ, distance=距離)
158
+
159
+ # 極大値 orderを変えることでピークの検出が変わる(ピーク検出の閾値)
160
+ maxid = signal.argrelmax(y, order=100)
161
+ # minid = signal.argrelmin(y, order=1) #極小値
162
+
163
+
164
+ plt.plot(x[maxid], y[maxid], 'ro', label='peak_max')
165
+ # plt.plot(x[minid],y[minid],'bo',label='ピーク値(最小)')
166
+
167
+ return x[maxid], y[maxid]
168
+
169
+ def func(x, *params):
170
+
171
+ #paramsの長さでフィッティングする関数の数を判別。
172
+ num_func = int(len(params)/3)
173
+
174
+ #ガウス関数にそれぞれのパラメータを挿入してy_listに追加。
175
+ y_list = []
176
+ for i in range(num_func):
177
+ y = np.zeros_like(x)
178
+ param_range = list(range(3*i,3*(i+1),1))
179
+ amp = params[int(param_range[0])]
180
+ ctr = params[int(param_range[1])]
181
+ wid = params[int(param_range[2])]
182
+ y = y + amp * np.exp( -((x - ctr)/wid)**2)
183
+ y_list.append(y)
184
+
185
+ #y_listに入っているすべてのガウス関数を重ね合わせる。
186
+ y_sum = np.zeros_like(x)
187
+ for i in y_list:
188
+ y_sum = y_sum + i
189
+
190
+ #最後にバックグラウンドを追加。
191
+ y_sum = y_sum + params[-1]
192
+
193
+ return y_sum
194
+
195
+ #プロットの定義
196
+ def fit_plot(x, *params):
197
+ num_func = int(len(params)/3)
198
+ y_list = []
199
+ for i in range(num_func):
200
+ y = np.zeros_like(x)
201
+ param_range = list(range(3*i,3*(i+1),1))
202
+ amp = params[int(param_range[0])]
203
+ ctr = params[int(param_range[1])]
204
+ wid = params[int(param_range[2])]
205
+ y = y + amp * np.exp( -((x - ctr)/wid)**2) + params[-1]
206
+ y_list.append(y)
207
+ return y_list
208
+
209
+ #初期値のリストを作成
210
+ #[amp,ctr,wid]
211
+
212
+ # x1, y1 = detect_peak() ##
213
+ np_x, np_y = detect_peak() ##
214
+
215
+
216
+ # guess = [] ##
217
+ guess = [[y1, x1, 1] for (x1, y1) in zip(np_x, np_y)] ##
218
+ # guess.append([y1, x1, 1]) ##
219
+
220
+
221
+ #バックグラウンドの初期値
222
+ background = 70
223
+
224
+ #初期値リストの結合
225
+ guess_total = []
226
+ for i in guess:
227
+ guess_total.extend(i)
228
+ guess_total.append(background)
229
+
230
+ popt, pcov = curve_fit(func, x, y, p0=guess_total)
231
+
232
+
233
+
234
+ fit= func(x, *popt)
235
+ plt.scatter(x, y, s=20)
236
+ plt.plot(x, fit , ls='-', c='black', lw=1)
237
+
238
+ y_list = fit_plot(x, *popt)
239
+ baseline = np.zeros_like(x) + popt[-1]
240
+ for n,i in enumerate(y_list):
241
+ plt.fill_between(x, i, baseline, facecolor=cm.rainbow(n/len(y_list)), alpha=0.6)
242
+
243
+ print(*popt)
244
+ ```
245
+
246
+
140
247
  ### 補足情報
141
248
 
142
249
  もし必要な情報があればコメントお願いします。助けてください泣