хочу заполнить белым несколько кривых сюжета одновременно imshow - PullRequest
0 голосов
/ 20 апреля 2020

Надеюсь, у вас все хорошо.

Я пытаюсь построить 4 кривые спектра, чтобы на области каждой кривой цвет, связанный с длиной волны, был показан с помощью imshow. Внешняя сторона кривых должна быть заполнена белым с помощью метода fill_between из matplotlib. Вот рабочий код для одной спектральной кривой:

import pandas as pd
import numpy as np
from plots import wavelength_to_rgb
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.transforms as transforms
from fwhm import FWHM,CWLs,FWHM_hlines
from scipy.signal import chirp, find_peaks, peak_widths
from scipy.optimize import curve_fit
from scipy import signal

wavel_df = pd.read_pickle("wavel_df.pkl")
wavel_df = wavel_df.iloc[0:]
wavel_dff = wavel_df[920:3500]
inten_df = pd.read_csv("C:/Users/juanr/Documents/data_mediciones/XZStage/27 de enero/intenten.dat",header=None)
light_df = pd.read_csv("C:/Users/juanr/Documents/data_mediciones/XZStage/27 de enero/inten_1.dat",header=None)
light_dff = light_df.iloc[54].values*0.32
inten_dff = inten_df.iloc[48].values
inten_dfff = inten_dff-abs(inten_df.iloc[-1].values)
lighta = light_dff[920:3500]
intena = inten_dfff[920:3500]
intend = intena/abs(lighta)
inten = intend.transpose()



from scipy.signal import savgol_filter
yhat = savgol_filter(inten, 55, 3)

plt.grid()
clim = (350, 780)
norm = plt.Normalize(*clim)
wl = np.arange(clim[0], clim[1] + 1, 2)
colorlist = list(zip(norm(wl), [wavelength_to_rgb(w) for w in wl]))
spectralmap = matplotlib.colors.LinearSegmentedColormap.from_list("spectrum", colorlist)
wavel_array = wavel_dff.iloc[:, 0].values
spectrum = yhat
plt.plot(wavel_dff, spectrum, color='darkred')
y = np.linspace(0, np.max(spectrum), 100)
X, Y = np.meshgrid(wavel_array, y)



extent = (np.min(wavel_array), np.max(wavel_array), np.min(y), np.max(y))

plt.imshow(X, clim=clim, extent=extent, cmap=spectralmap, aspect='auto')
plt.xlabel('Longitud de onda [nm]',fontsize=20)
plt.ylabel('Intensidad [u.a.]',fontsize=20)
plt.ylim([0,1])
plt.fill_between(wavel_array, spectrum ,np.max(spectrum), color='w')
plt.xlim([400, 950])
textstr = '\n'.join((
    r'Banda Verde',
    r'$CWL = (%.0f$ ± 2) nm' % (CWLs(wavel_array,spectrum), ),
    r'$FWHM = %.0f$ nm' % (FWHM(wavel_array,spectrum), )))
props = dict(boxstyle='round', facecolor='wheat')
plt.text(825, 0.8, textstr, fontsize=10,
        verticalalignment='top', bbox=props)
plt.hlines(FWHM_hlines(wavel_array,spectrum)[0],FWHM_hlines(wavel_array,spectrum)[1],FWHM_hlines(wavel_array,spectrum)[2],color="w",lw=2,linestyle='dashed')
plt.axvline(FWHM_hlines(wavel_array,spectrum)[1], 0, np.max(spectrum)/2, label=r'$\lambda_{i} = (%.0f\hspace{0.2} ±\hspace{0.2} 2)\hspace{0.2} nm$' % FWHM_hlines(wavel_array,spectrum)[1],color = 'b',lw=2)
plt.axvline(FWHM_hlines(wavel_array,spectrum)[2], 0, np.max(spectrum)/2, label=r'$\lambda_{s} = (%.0f\hspace{0.2} ±\hspace{0.2} 2)\hspace{0.2} nm$' % FWHM_hlines(wavel_array,spectrum)[2],color = 'r',lw=2)
plt.legend()
plt.show()

зеленая кривая работает, я хочу повторить это на 4 полосы одновременно

Я хочу построить график 4 кривых цвета, как у зеленого.

Я пробовал это:

import pandas as pd
import numpy as np
from plots import wavelength_to_rgb
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.transforms as transforms
from fwhm import FWHM,CWLs,FWHM_hlines
from scipy.signal import chirp, find_peaks, peak_widths
from scipy.optimize import curve_fit
from scipy import signal
from scipy.signal import savgol_filter

wavel_df = pd.read_pickle("wavel_df.pkl")
wavel_df = wavel_df.iloc[0:]
wavel_dff = wavel_df[920:3500]
back_df = pd.read_csv("C:/Users/juanr/Documents/data_mediciones/XZStage/27 de enero/inten_blancoverdemedio.dat",header=None)
inten_df = pd.read_csv("C:/Users/juanr/Documents/data_mediciones/simultaneidad/defectoColorinche/intenxmuyporabajo.dat",header=None)
light_df = pd.read_csv("C:/Users/juanr/Documents/data_mediciones/XZStage/27 de enero/inten_1.dat",header=None)
light_dff = light_df.iloc[54].values*1.2
inten_dff = inten_df.iloc[0].values
inten_dfff = inten_dff - abs(back_df.iloc[689].values)
lighta = light_dff[920:3500]
intena = inten_dfff[920:3500]
intend = intena/abs(lighta)
inten = intend.transpose()
yhat = savgol_filter(inten, 55, 3)
plt.grid()
clim = (350, 780)
norm = plt.Normalize(*clim)
wl = np.arange(clim[0], clim[1] + 1, 2)
colorlist = list(zip(norm(wl), [wavelength_to_rgb(w) for w in wl]))
spectralmap = matplotlib.colors.LinearSegmentedColormap.from_list("spectrum", colorlist)
wavel_array = wavel_dff.iloc[:, 0].values
spectrum = yhat
plt.plot(wavel_dff, spectrum, color='black')

plt.xlabel('Longitud de onda [nm]',fontsize=20)
plt.ylabel('Intensidad [u.a.]',fontsize=20)
plt.ylim([0,1])
plt.fill_between(wavel_array,spectrum,np.max(spectrum),color='w')
plt.xlim([400, 950])



inten2_df = pd.read_csv("C:/Users/juanr/Documents/data_mediciones/simultaneidad/defectoHUECO/intentrial.dat",header=None)
light2_dff = light_df.iloc[54].values*0.9
inten2_dff = inten2_df.iloc[52].values
inten2_dfff = inten2_dff - abs(inten2_df.iloc[269].values)
lighta2 = light2_dff[920:3500]
intena2 = inten2_dfff[920:3500]
intend2 = intena2/abs(lighta2)
inten2 = intend2.transpose()

yhat2 = savgol_filter(inten2, 55, 3)
spectrum2 = yhat2
plt.plot(wavel_dff, spectrum2, color='black')
y2 = np.linspace(0, np.max(spectrum2), 100)
X2, Y2 = np.meshgrid(wavel_array, y2)
plt.fill_between(wavel_array,spectrum2,np.max(spectrum2),color='w')


inten3_df = pd.read_csv("C:/Users/juanr/Documents/data_mediciones/XZStage/27 de enero/intenten.dat",header=None)
light3_dff = light_df.iloc[54].values*0.32
inten3_dff = inten3_df.iloc[48].values
inten3_dfff = inten3_dff-abs(inten3_df.iloc[-1].values)
lighta3 = light3_dff[920:3500]
intena3 = inten3_dfff[920:3500]
intend3 = intena3/abs(lighta3)
inten3 = intend3.transpose()

yhat3 = savgol_filter(inten3, 55, 3)
spectrum3 = yhat3
plt.plot(wavel_dff, spectrum3, color='black')
plt.fill_between(wavel_array,spectrum3,np.max(spectrum3),color='w')


inten4_df = pd.read_csv("C:/Users/juanr/Documents/data_mediciones/XZStage/27 de enero/inten.dat",header=None)
light4_dff = light_df.iloc[54].values*0.33
inten4_dff = inten4_df.iloc[-1].values
inten4_dfff = inten4_dff - abs(inten4_df.iloc[82].values)

lighta4 = light4_dff[920:3500]
intena4 = inten4_dfff[920:3500]
intend4 = intena4/abs(lighta4)
inten4 = intend4.transpose()

yhat4 = savgol_filter(inten4, 55, 3)
spectrum4 = yhat4
plt.plot(wavel_dff, spectrum4, color='black')
plt.fill_between(wavel_array,spectrum4,np.max(spectrum4),color='w')

plt.show () это выход для кода, который пытается построить 4 кривых спектра одновременно я хочу, чтобы каждый из них был окрашен, как зеленый в приведенном выше примере.

Заранее спасибо.

...