iT邦幫忙

2026 iThome 鐵人賽

DAY 6
0
Software Development

用 Python 打造最順手的良率統計工具:半導體工程師的模組化開發之道系列 第 6

Day 6: 有圖才有真相:如何預處理資料與使用 Matplotlib 畫出 wafer mapping

  • 分享至 

  • xImage
  •  

本篇目的:了解如何將 wafer 檢測資料轉換成二維格式,並使用 Matplotlib 的 pcolormesh 繪製出 wafer mapping

前言

我們從 wafer 的數據表格可以得知 wafer 有無失效,但觀看失效品在 wafer 上的分布才能推測失效模式。例如一條一條的刮痕、磊晶品質不均勻造成的區塊失效、某液體汙染產生的水痕等。且我們通常無法使用 excel 繪製 wafer mapping,需要用另外的程式作業。在此我會分享如何使用 Python 的 Matplotlib 模組繪製 wafer mapping ,讓大家的 wafer 產出監控更加自動化。

Tips: excel 的樞紐分析表 + 條件式格式設定可以做到類似 mapping 圖的效果,但超級吃記憶體...…

Mapping 圖繪製與資料預處理

通常我們拿到檢測資料都像下圖,一顆晶粒一列、座標標示於不同欄位。這樣的資料格式在觀測指定項目(如下圖的 Po)時很方便,只要確認對應的那一欄即可。但這樣子的格式沒有辦法表現晶粒之間的空間分布,且無法使用 Matplotlib 繪製 mapping 圖。Matplotlib 繪圖需要有X/Y軸以及二維資料,因此我們需要先將資料轉成橫軸與縱軸分別是為X/Y的二維資料,且還要取出X/Y軸的內容。

https://ithelp.ithome.com.tw/upload/images/20260919/201823192K28Y5NoLN.png

取出二維資料

在 excel 中,我們會若要取出二維資料,會使用樞紐分析表做這件事情;而在 Python 的 Pandas 模組中,我們可以使用 pivot 這個 function。pivot可以使用 columns=index= 指定二維資料的橫軸縱軸,並且將 values= 指定的欄位資料轉換成二維的分布。

# df_a_wafer 是已經讀取完成並存成 dataframe 之檢測資料

# 二維化
# 輸出資料也是 dataframe
df_po_2d = df_a_wafer.pivot(columns = 'X', index= 'Y', values= 'Wd2') 

Dataframe 是無法丟進pcolormesh 繪圖的,要是 array-like 的資料才行,這時需要使用 to_numpy 這個 function。Numpy 是一個支援陣列格式 (array) 的資料科學模組,而 to_numpy可以把 Dataframe 的 value 取出並轉成 array

Wafer 的檢測資料一定會有對位 key、缺失晶粒等沒有資料的地方。這些缺失資料在 array 會以 np.nan 的格式標示、且會影響後續繪製 mapping 圖的 colorbar,因此須將資料轉成 masked_arraymasked_array 是一個含有 data (資料本身) 與 mask (遮罩,需計算位置為 False,不計算位置為 True) 的資料集,在繪製圖像或是計算值時,標示為 True 的地方都不會納入計算,避免晶粒缺失造成的繪圖或統計異常。

# 轉成array
wafer_2d_array = df_po_2d.to_numpy() 

# 加上遮罩,讓空缺處在統計時會被 by pass
wafer_masked = np.ma.masked_invalid(wafer_2d_array)

取出X/ Y軸資料

根據 Matplotlib 的官方說明,要使用 pcolormesh 畫出一張 mapping 圖最少需要X軸、Y軸與需求 data (二維矩陣)。其中X軸與Y軸會對應到需求 data 的行與列,因此我們需要取出資料裡X 與 Y 的所有不重複元素。剛剛我們已經轉換出二維資料,因此只要擷取出 column (X) 與 row (Y) 即可。

實作方式如下:

# 取得x/y座標值
x_coords = df_po_2d.columns.to_numpy()
y_coords = df_po_2d.index.to_numpy()

不能使用 df_a_wafer['X']df_a_wafer['Y'] 的原因是作為 pcolormesh 的X與Y軸不可有重複元素

Matplotlib 的使用方式

Matplotlib 的基礎架構

我們在使用 Matplotlib 繪圖時,主要會生成 figureaxes、並對它們做相關設定。其中 figure 就是一張圖的畫布,圖像大小、背景、存圖等都由此設定。而 axes 為實際控制圖表內容的物件 (object),坐標軸、圖表數據、樣式都由此控制。

使用 plt.subplots() 便可以一次生成 figureaxes ;還可以指定一張畫布內有多張數據圖,並且使用 ax1ax2 作個別的設定。

# 一個畫布內內有一個數據圖
fig, ax = plt.subplots() # (figure, axes)

# 一個畫布內有多個數據圖,且橫向排列
fig_2im, (ax1, ax2) = plt.subplots(nrows=1,ncols=2)

另外 figureaxes各項對應到的項目請參考下圖 。

https://ithelp.ithome.com.tw/upload/images/20260919/201823197qDxgYI9H3.png

來源:https://matplotlib.org/stable/users/explain/quick_start.html#parts-of-a-figure

使用 pcolormesh 繪製 wafer mapping

axes 是圖表內容的物件,因此繪製圖形自然是對 axespcolormesh 方法。我們依序將X/Y軸、二維資料等參數傳入 pcolormesh 即可得到 mapping 圖。另外我們可以傳入參數對圖形做更多的外觀設定,例如格線: linewidths、圖表顏色: cmap等。

Mapping 圖一定要有colorbar,使用 fig.colorbar 即可加入 colorbar。

im = ax.pcolormesh(
    x_coords, y_coords, wafer_masked, 
    cmap='jet', shading='nearest', edgecolors='black',linewidths=0.5
)

fig.colorbar(im, ax=ax)  # 加上 Colorbar 方便閱讀

繪製出的圖形如下

https://ithelp.ithome.com.tw/upload/images/20260919/20182319LS44xx11hl.png

關於 Matplotlib 的混亂指令

Matplotlib 的指令比起前面提到的 Pandas 混亂很多,我們可以在網路上找到至少3種不同寫法,但是畫出來卻是同一種圖。在這裡我建議使用 fig, ax = plt.subplots() 這個方法(Matplotlib 官方也建議此用法),原因是它容易寫且有明確的 figureaxes 可供操作。網路上常見的3種寫法比較如下:

比較項目 類似 MATLAB 的方式 figure 與 axes 分別建立 subplots 同時建立 figure 與 axes
寫法 plt.plot(x, y)plt.show() fig = plt.figure()ax = fig.add_subplot(111) fig, ax = plt.subplots()
特點 沒有明顯的物件出現,從頭到尾都是呼叫 plt 建立一個空畫布,並且在加入 ax 後順便布局 subplots 同時建立 fig, ax,並且可依需求在同一 figure 建立多個 axes
優點 程式碼最短、直覺,不用去管物件是誰,想到什麼就畫什麼 自由度最高,可以隨意控制每個子圖的精準位置與大小 物件導向概念清晰,語法工整好讀,也是 Matplotlib 官方最強烈推薦的標準寫法
缺點 只要子圖一多或是複雜度提升,就很容易搞混現在到底在畫哪一張圖,非常難維護 程式碼繁瑣且不夠直覺,為了畫一張圖要先手動寫好幾行準備工作 面對非常特殊、非對稱的複雜網格排列時,需要另外搭配 GridSpec 處理
適合用途 在 jupyter 上做簡單的測試 複雜自訂佈局(但你為什麼不用右邊的方法?) 正式專案、標準報表產出、模組化開發,以及嵌入到 PySide6 等 GUI 介面中

To be continued →

上面的圖還有很多可以修改的地方,下一章會說明各種繪製 wafer mapping 的常見設定


上一篇
Day 5: 資料處理的最後一哩路 - Pandas 的 csv/ xlsx 輸出設定
下一篇
Day 7: 為你的圖片加上醬汁:如何用 Matplotlib 畫出格式正確的 wafer mapping
系列文
用 Python 打造最順手的良率統計工具:半導體工程師的模組化開發之道7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言