五個 Widgets,一條龍的光譜鑑定流程
安裝後 Orange 工具箱會多一個 Spectra 分類。輸出的資料表採 Orange-Spectroscopy 慣例 (每一欄=一個波數、每一列=一條光譜),可直接接 PCA、PLS、階層式分群等 Orange 原生流程。
Import Spectrum URL
貼上 IRUG 編號(如 4119)、IRUG/SOPRANO 頁面網址,或 JCAMP-DX / CSV 直接網址——下載、畫圖、輸出資料表,一鍵完成。可連抓多條累積成一組。
Spectra Similarity
兩組光譜的逐對相似度:Pearson correlation、cosine、光譜角 SAM、Euclidean 距離。自動對齊重疊波段再比較。
Spectral Library
把參考譜收進光譜庫、存成 .speclib 檔(與 SpectraView 桌面版完全互通),未知譜對庫搜尋、輸出排名命中表與最佳匹配。
Mixture Analysis
混合光譜 ≈ Σ cᵢ·參考譜ᵢ 的非負最小平方(NNLS)分解:回報每個成分的係數、百分比與擬合 R²,並疊出擬合曲線與殘差。
Aquagram(水光譜學)
Aquaphotomics 分析:在水的 12 個特徵吸收帶(WAMACs)取正規化吸光度,畫成 12 軸雷達圖,比較不同樣品/擾動下水的氫鍵結構差異。
安裝
▸ 桌面版 App(從 orangedatamining.com 下載的獨立程式,點圖示開)→ 走 方式 A。
▸ pip 版 Orange(自己
pip install orange3、用 python -m Orange.canvas 開)→ 走 方式 B。兩者的 Python 環境不同,裝錯環境 widgets 不會出現。
方式 A ── 桌面版 App(最推薦)
用 App 內建的 Add-ons 對話框,從 PyPI 依名稱安裝:
開 Add-ons
Orange 選單 Options ▸ Add-ons…
Add more… 輸入名稱
按右上 Add more…,輸入 orange-spectra(不是 git 網址——這個框只吃 PyPI 名稱),打勾後按 OK。
重啟 Orange
工具箱出現 Spectra 分類的 5 個 widgets。
orange-spectra?代表尚未發佈到 PyPI。發佈方式見
PUBLISHING.md;
在那之前,桌面版可改用「命令列安裝進 App 環境」:找到 App 的 Python(如
…\Orange\python.exe)執行
python.exe -m pip install "git+https://github.com/Tai-ShengYeh/spectraview.git#subdirectory=orange-spectra"。方式 B ── pip 版 Orange
# 1) Orange 與 Qt 綁定(缺 PyQt5 會出現 "PyQt5 ... not available" 而開不了) pip install orange3 PyQt5 PyQtWebEngine # 2) orange-spectra widgets(直接從 GitHub 裝) pip install "git+https://github.com/Tai-ShengYeh/spectraview.git#subdirectory=orange-spectra" # 3) 啟動(用這個指令,不要點桌面 App 圖示——那是另一個環境) python -m Orange.canvas
▸
ImportError: PyQt5 … not available → 少裝 Qt,補
pip install PyQt5 PyQtWebEngine。▸ Add-ons 的 Add more… 貼 git 網址得到「packages were not found」→ 那個框只接受 PyPI 名稱,git 網址請走方式 B 的
pip install。▸ 只有要「更新」到新版時才需要重裝:
pip install --upgrade --force-reinstall --no-deps "git+https://github.com/Tai-ShengYeh/spectraview.git#subdirectory=orange-spectra",
然後完全關掉 Orange 再重開。▸ 每個 widget 左上角都有 「ℹ 說明 How to use」盒子與 「📖 開啟線上教學」按鈕, 不會用時點一下就能學。
Widget 逐一教學
Import Spectrum URL — 從網址匯入光譜
- 在輸入框貼上來源,按 Fetch & add:
- IRUG 編號:
4119(=http://www.irug.org/jcamp-details?id=4119,PB15 酞菁藍 Raman 譜) - SOPRANO 頁面網址(比利時 KIK-IRPA 顏料 Raman 資料庫)
- JCAMP-DX(AFFN)或兩欄 CSV 的直接網址
- IRUG 編號:
- 右側即時畫出光譜(IR/Raman 慣例:波數由高至低)。
- 重複 Fetch 可累積多條光譜;清單可移除單條或全部清空。多條光譜會自動重採樣到共同波段。
<script> 裡("波數:強度" 配對);SOPRANO 則藏在 Dygraph 的資料陣列。widget 直接解析網頁原始碼還原數據。Spectra Similarity — 光譜相似度
- 接上 Data 與 References:輸出 Data × References 每一對的四個指標。
- 只接 Data:改為 Data 內部兩兩互比(適合看一批樣品彼此像不像)。
- 排序依據可選 correlation / cosine(越大越像)或 SAM / Euclidean(越小越像)。
| 指標 | 意義 | 特性 |
|---|---|---|
| correlation | Pearson 相關係數 | 對位移與縮放都不敏感,鑑定最常用 |
| cosine | 向量夾角餘弦 | 對縮放不敏感 |
| SAM | 光譜角(弧度) | 遙測/高光譜常用,越小越像 |
| euclid | 單位化後歐氏距離 | 直觀的「形狀差多少」 |
Spectral Library — 光譜庫建立與比對
- 把參考譜接到 Spectra 輸入,按 Add input spectra to library 入庫。
- Save… 存成
.speclib;Load… 載入既有庫——檔案格式與 SpectraView 桌面版相同,例如可直接載入 repo 附的examples/sugars_nir.speclib(9 種糖類 NIR 庫)。 - 未知譜接 Query:Hits 輸出每個 query 對每筆庫藏的排名與四個相似度指標,接 Data Table widget 即可檢視。
- Library 輸出把整個庫變成資料表——可以直接接 Mixture Analysis 當參考譜,或接 Spectra 檢視。
Mixture Analysis — 混合光譜成分分析
- 混合譜接 Mixture、一組純物質參考譜接 References。
- 用非負最小平方(NNLS)解
mixture ≈ Σ cᵢ·refᵢ (+ offset);係數強制 ≥ 0,符合物理意義。 - widget 內直接顯示成分表(係數、百分比)與 R²;圖上疊出混合譜、擬合線與殘差。
- Composition 輸出接 Data Table 或 Bar Plot 畫成分比例;Fit 輸出含 mixture / NNLS fit / residual 三列。
Aquagram — 水光譜學(aquaphotomics)雷達圖
Aquaphotomics(Tsenkova)用水在近紅外的 12 個特徵吸收帶(WAMACs,water matrix coordinates,約 1336–1522 nm)當「水的指紋」,把樣品在這 12 個座標的正規化吸光度畫成雷達圖,比較不同狀態(溫度、濃度、品種…擾動)下水的氫鍵結構變化。做法參考 NIRPY Research 的 aquagram 教學。
- 接上 NIR 光譜(可先用 Import Spectrum URL / File 載入,或接 Orange-Spectroscopy 的前處理)。
- 選正規化方式:
- raw:直接取 12 個波段的吸光度。
- snv:先對每條光譜做 SNV(標準常態變量),再取值。
- aquagram(預設,經典正規化):SNV 後,對整組樣品在每個波段做標準化 (值−均值)/標準差——0 就是這組的平均水譜,往外 = 該波段吸光度高於平均、往內 = 低於平均。
- 右側即時畫出 12 軸雷達圖,每條光譜一條線;WAMACs 波段可在輸入框自訂(預設標準 12 帶)。
- Aquagram Coordinates 輸出是 n×12 的資料表,可再接 PCA、分群或 Data Table 做量化比較。
用內建範例資料實際跑一遍
下面所有圖與數字都是用 repo 內的真實範例資料(examples/sugars_nir.speclib
——9 種糖類/添加物的 NIR 光譜、3 個未知樣品)與真實玉米 NIR,實際用這些 widgets 的演算法跑出來的,
不是示意圖。你在自己電腦照做會得到一樣的結果。
① Import Spectrum URL → 一次載入一組光譜
把 9 條糖類 NIR 參考譜載進來、疊在同一張圖(每列一條光譜的 Table)。
② Spectra Similarity → 9×9 相關係數熱圖
對 9 條糖譜兩兩算 correlation。化學上合理:蔗糖 vs 果糖 ≈ 0.99(蔗糖=葡萄糖+果糖), 糖類 vs 咖啡因 ≈ 0.71 明顯拉開。
③ Spectral Library → 未知糖比對排名
拿 unknown_glucose.csv 對 9 種糖的庫搜尋,第一名正確命中 glucose(correlation = 1.0000)。
| 排名 | 命中 | correlation |
|---|---|---|
| 1 | glucose ✅ | 1.0000 |
| 2 | sucrose | 0.9562 |
| 3 | fructose | 0.9533 |
| … | … | … |
| 9 | caffeine | 0.7078 |
④ Mixture Analysis → NNLS 拆解混合譜
把 65% glucose + 35% sucrose 混成一條譜餵進去,NNLS 準確還原比例 (glucose 65.0%、sucrose 35.0%、其餘成分 ≈ 0),R² = 1.0000。
| 成分 | NNLS 係數 | 比例 | 真值 |
|---|---|---|---|
| glucose | 0.650 | 65.0% | 65% |
| sucrose | 0.350 | 35.0% | 35% |
| 其他 7 種 | ≈ 0 | ≈ 0% | 0% |
⑤ Aquagram → 真實玉米 NIR 水光譜雷達圖
用真實玉米近紅外光譜,在 12 個 WAMACs 取正規化吸光度畫成 aquagram(雷達圖)。
三個課堂範例工作流
① 看譜:貼網址 → 光譜 → 資料表
最短路徑:一個 widget 就能「貼上網址看光譜」;再接 Orange-Spectroscopy 的 Spectra widget 或 Line Plot 可另行檢視。
② 鑑定:建庫 → 未知譜比對
未知譜從第二個來源(File widget 讀 CSV,或再開一個 Import URL)接到 Library 的
Query。.speclib 檔和 SpectraView 桌面版、教學範例庫完全互通。
③ 定量:混合譜成分分析
參考譜可以來自光譜庫的 Library 輸出——「建庫」與「拆混合物」自然銜接成一條流程。
與 SpectraView、Orange-Spectroscopy 的整合
| 互通點 | 說明 |
|---|---|
| .speclib 光譜庫 | Orange 裡存的庫,SpectraView 桌面版直接 Library ▸ Load library… 開啟;反之亦然(如 examples/sugars_nir.speclib)。 |
| 資料表格式 | 欄名=波數、每列一條光譜——與 Orange-Spectroscopy 及 SpectraView 的「合併匯出 X-matrix」相同,匯出 CSV 可雙向載入。 |
| 演算法 | 相似度四指標與 NNLS 的定義和 SpectraView 完全一致,桌面版與 Orange 版結果可互相驗證。 |
| 下游分析 | Spectra 輸出可直接接 Orange 的 PCA、PLS(化學計量學)、距離矩陣、階層式分群等 widgets。 |
常見問題
要每次用都重新 pip 安裝嗎?
不用。安裝是一次性的——裝完之後每次開 Orange,Spectra 分類的 5 個 widgets 都在,直接用。
只有要更新到新版時才重裝(pip install --upgrade --force-reinstall --no-deps …),
且重裝後要完全關掉 Orange 再重開才會生效。桌面版 App 若日後上了 PyPI,用 Add-ons 對話框安裝更會自動記住、可線上更新。
不會用某個 widget,怎麼學?
每個 widget 左上角都有 「ℹ 說明 How to use」盒子(簡短中英說明)和 「📖 開啟線上教學」按鈕, 點按鈕就會開這頁對應段落。也可先看上面的 真實數據 Demo 看每個 widget 實際跑出什麼。
抓 IRUG 失敗(連線錯誤)怎麼辦?
先確認瀏覽器打得開該頁;校內網路有時擋外部站台。仍失敗時,可在瀏覽器用 SpectraView 桌面版的 File ▸ Import from URL / IRUG… 匯入後存成 CSV,再用 Orange 的 File widget 載入。
JCAMP-DX 檔抓下來是亂碼/解析失敗?
URL 匯入支援 AFFN(純數字)JCAMP;壓縮格式(SQZ/DIF/DUP)請用 SpectraView 開啟(它有完整解碼器)後匯出 CSV。
兩條光譜波段不同能比較嗎?
可以。相似度與 NNLS 都會先取重疊波段、內插到共同格點再計算;完全沒有重疊才會回報錯誤。
可以先做基線校正/平滑再比對嗎?
建議可以:接 Orange-Spectroscopy 的 Preprocess Spectra widget(含基線、SNV、Savitzky-Golay 等)在比對之前處理;或先在 SpectraView 做 airPLS 再匯出。