Python繪制條形熱圖的示例代碼
為什么選擇條形熱圖
在科研數(shù)據(jù)分析和工程信號處理領域,當我們需要同時展示多個樣本的連續(xù)變量波形時,傳統(tǒng)的折線圖往往顯得雜亂無章 —— 想象一下,15 條波形曲線在同一個坐標系里交織,是不是瞬間讓人眼花繚亂?這時候,條形熱圖(Strip Heatmap) 就像一位魔法設計師,用色彩編碼和有序排列讓復雜數(shù)據(jù)變得清爽直觀!
今天我們要分享的案例是:通過模擬帶噪聲的高斯峰值信號,用 Seaborn 繪制高顏值條形熱圖,展示不同樣本的波形差異。這種可視化方法廣泛應用于光譜分析、傳感器信號處理、生物醫(yī)學數(shù)據(jù)(如心電圖波形)等場景,能讓你一眼捕捉到數(shù)據(jù)的峰值位置、強度差異和噪聲分布~
代碼全景
先來看一段充滿 “數(shù)學美感” 的代碼,它模擬了 15 個帶隨機峰值的信號,并將它們優(yōu)雅地排列成熱圖:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 生成隨機數(shù)據(jù)(核心可替換區(qū)域①) np.random.seed(0) # 固定隨機種子,確保結(jié)果可復現(xiàn) x = np.arange(0, 91) # X軸范圍:0到90(代表信號的連續(xù)變量,如波長、時間等) n_samples = 15 # 樣本數(shù)量,可改為你的實際樣本數(shù) data = [] # 生成每個樣本的峰值位置(35-55之間的隨機值,可替換為真實峰值數(shù)據(jù)②) peaks = np.random.uniform(35, 55, size=n_samples) for p in peaks: # 高斯函數(shù)生成峰值波形(可替換為自定義函數(shù)③,如正弦波、指數(shù)衰減等) profile = np.exp(-(x - p)**2 / (2 * 8**2)) # 標準差8控制峰寬 noise = np.random.randn(len(x)) * 2 # 高斯噪聲,可調(diào)整噪聲強度④ # 信號疊加:基線10 + 峰值信號*40 + 噪聲(可修改基線和縮放因子⑤) row = 10 + profile * 40 + noise data.append(row) # 創(chuàng)建數(shù)據(jù)框(核心可替換區(qū)域⑥:替換為你的真實數(shù)據(jù)) df = pd.DataFrame(data, columns=x) # columns對應X軸變量,如波長、時間點 labels = [f"Samp {chr(ord('A')+i)}" for i in range(n_samples)] # 樣本標簽 df.index = labels # 設置行名為樣本標簽 # 繪制條形熱圖(可視化參數(shù)可靈活調(diào)整⑦) plt.figure(figsize=(12, 6)) # 調(diào)整畫布大小 sns.heatmap( df.iloc[::-1], # 反轉(zhuǎn)行順序,讓第一個樣本顯示在頂部 cmap="coolwarm", # 藍-紅發(fā)散色階,適合顯示有基線的信號 vmin=0, vmax=50, # 固定顏色范圍,確保不同數(shù)據(jù)對比一致 cbar=True, # 顯示顏色條 linewidths=0.5, # 樣本間添加白色分隔線 linecolor='white' # 分隔線顏色 ) plt.title("條形熱圖:帶噪聲的高斯峰值信號", fontsize=16, pad=20) plt.xlabel("K (w) (可替換為實際變量名,如波長/nm、時間/ms)", fontsize=14) plt.ylabel("樣本", fontsize=14) # 定制X軸刻度:每10個單位顯示一個刻度 plt.xticks(np.arange(0, len(x), 10), np.arange(0, len(x), 10)) # 定制Y軸標簽:反轉(zhuǎn)順序并取消旋轉(zhuǎn),讓標簽水平顯示 plt.yticks(np.arange(len(labels)) + 0.5, labels[::-1], rotation=0) plt.tight_layout() # 自動調(diào)整布局,避免標簽重疊 plt.show()
效果如下
代碼逐行解析
1.數(shù)據(jù)生成:打造帶峰值的模擬信號(核心可替換區(qū))
① X 軸范圍與樣本數(shù)量:
x = np.arange(0, 91)定義了信號的連續(xù)變量,比如這里模擬的是 0-90 的 “K (w)” 變量(實際可替換為波長、時間、溫度等)。n_samples是樣本數(shù)量,直接改為你的實際樣本數(shù),比如 30 個傳感器數(shù)據(jù)。
② 峰值位置定制:
peaks = np.random.uniform(35, 55, size=n_samples)生成 35-55 之間的隨機峰值位置。如果有真實峰值數(shù)據(jù),直接替換為列表或數(shù)組,例如:
peaks = [40.2, 52.1, 38.5, ...] # 你的真實峰值位置
③ 波形函數(shù)替換:
目前用高斯函數(shù)np.exp(-(x - p)**2 / (2 * 8**2))生成鐘形曲線,你可以換成任何自定義函數(shù)!比如:
正弦波:np.sin(x * 0.1 + p)(模擬周期性信號)
指數(shù)衰減:np.exp(-(x - p)/10)(模擬衰減信號)
階梯函數(shù):np.where(x > p, 1, 0)(模擬開關信號)
④ 噪聲調(diào)整:
np.random.randn(len(x)) * 2控制噪聲強度,*2是標準差。想讓信號更 “干凈”?改成*1;想突出噪聲?試試*5~
⑤ 信號縮放與基線:
10 + profile * 40 + noise中,10是基線(信號最小值),*40是峰值縮放因子。根據(jù)真實數(shù)據(jù)范圍調(diào)整這兩個值,比如基線改為 20,縮放因子改為 30。
2.數(shù)據(jù)結(jié)構化:用 Pandas 構建表格(零代碼替換區(qū))
⑥ 替換真實數(shù)據(jù):
如果你有現(xiàn)成的 CSV 數(shù)據(jù),直接用pd.read_csv('你的數(shù)據(jù).csv')讀取,確保列是 X 軸變量(如波長點),行是樣本,然后跳過data生成步驟。例如:
df = pd.read_csv('sensor_data.csv', index_col=0) # index_col=0假設第一列為樣本標簽
3.可視化魔法:Seaborn 熱圖的 “美顏秘籍”
⑦ 熱圖參數(shù)調(diào)優(yōu):
cmap="coolwarm":藍 - 紅配色適合顯示有基線的信號,冷色代表低值,暖色代表高值。換成"viridis"(綠 - 黃 - 紅)或"magma"(黑 - 紅 - 黃)會有不同效果~
vmin=0, vmax=50:固定顏色映射范圍,避免不同數(shù)據(jù)導致色階變化,確??鐖D對比一致。如果數(shù)據(jù)范圍是 10-60,就改為vmin=10, vmax=60。
linewidths=0.5, linecolor='white':在樣本間添加細白分隔線,讓每個條形更清晰,就像給數(shù)據(jù) “穿上整齊的格子衫”~
df.iloc[::-1]:反轉(zhuǎn)行順序,讓第一個樣本顯示在熱圖頂部(默認是底部),符合從 “上到下” 的閱讀習慣。
個性化改造
場景一:我的數(shù)據(jù)不是高斯峰值,是真實傳感器波形怎么辦
直接替換信號生成部分!假設你有一批心電圖(ECG)數(shù)據(jù),每個樣本是 500 個時間點的電壓值:
- 刪除peaks和循環(huán)生成profile的代碼
- 用pd.read_csv讀取 CSV 文件,確保每行是一個樣本,每列是時間點
- 跳過噪聲生成(如果數(shù)據(jù)已含噪聲)或添加自定義噪聲
場景二:想換一種更專業(yè)的配色方案
Seaborn 提供了超多色階,試試這些組合:
- 科研論文常用:cmap="rocket"(藍 - 黃 - 紅,適合單峰數(shù)據(jù))、cmap="bwr"(藍 - 白 - 紅,突出基線對稱數(shù)據(jù))
- 高對比度模式:cmap="coolwarm_r"(反轉(zhuǎn)色階,讓高值顯示為藍色)
- 漸變色推薦:搭配vmin和vmax使用,比如光譜數(shù)據(jù)用cmap="hsv",呈現(xiàn)彩虹色漸變~
場景三:樣本標簽太多,Y 軸標簽擠在一起
三大解決方案來襲:
縮小字體:plt.yticks(..., fontsize=10)
截斷標簽:用縮寫(如 “Samp A”→“A”),或生成標簽時用簡寫:
labels = [f"A{i}" for i in range(n_samples)] # 生成A0, A1, ..., A14
旋轉(zhuǎn)標簽:如果必須顯示全稱,嘗試輕微旋轉(zhuǎn):
plt.yticks(..., rotation=15) # 15度傾斜,更易閱讀
擴展應用
生物醫(yī)學:心電圖波形對比
X 軸:時間(ms),Y 軸:不同患者,顏色:電壓(μV)
應用:快速識別異常波形(如峰值偏移、節(jié)律異常),比單獨看折線圖清晰 10 倍!
材料科學:光譜吸收曲線
X 軸:波長(nm),Y 軸:不同薄膜樣品,顏色:吸光度
應用:對比材料的特征吸收峰位置和強度,一鍵定位最佳制備工藝~
工程信號:傳感器陣列數(shù)據(jù)
X 軸:頻率(Hz),Y 軸:不同傳感器節(jié)點,顏色:信號強度
應用:監(jiān)測設備振動信號,快速定位異常頻率的傳感器節(jié)點~
關鍵可替換點總結(jié)
替換場景 | 代碼位置 | 示例操作 |
X 軸變量名稱 | x = np.arange(0, 91) | 改為x = np.linspace(200, 800, 301)(波長 200-800nm,301 個點) |
樣本數(shù)量 | n_samples = 15 | 改為n_samples = 30(30 個樣本) |
峰值位置(真實數(shù)據(jù)) | peaks = np.random... | 改為peaks = [45.2, 50.1, 38.7](手動輸入峰值) |
波形函數(shù) | profile = np.exp(...) | 改為profile = np.sin(x*0.05)(正弦波) |
導入真實數(shù)據(jù) | df = pd.DataFrame(data...) | 改為df = pd.read_excel('你的數(shù)據(jù).xlsx', index_col=0) |
顏色映射 | cmap="coolwarm" | 改為cmap="viridis"(綠 - 黃 - 紅漸變) |
總結(jié)
通過這篇攻略,我們掌握了從信號生成到熱圖繪制的全流程,更重要的是學會了如何將代碼適配到真實場景。條形熱圖的核心優(yōu)勢在于:
- 有序排列:樣本按行排列,避免折線圖的重疊混亂
- 色彩編碼:用顏色深淺直觀展示數(shù)值大小,比數(shù)字表格更易捕捉規(guī)律
- 細節(jié)可控:從色階到分隔線,每個像素都能定制,滿足論文、報告、PPT 的不同需求
現(xiàn)在,你只需替換代碼中的6 處核心區(qū)域(數(shù)據(jù)生成、數(shù)據(jù)框、可視化參數(shù)),就能將這段代碼變成你的專屬可視化工具~
到此這篇關于Python繪制條形熱圖的示例代碼的文章就介紹到這了,更多相關Python條形熱圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python實現(xiàn)快速文件格式批量轉(zhuǎn)換的方法
這篇文章主要介紹了python實現(xiàn)快速文件格式批量轉(zhuǎn)換的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10python射線法判斷一個點在圖形區(qū)域內(nèi)外
這篇文章主要為大家詳細介紹了python射線法判斷一個點在圖形區(qū)域內(nèi)外,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06Python利用pynimate實現(xiàn)制作動態(tài)排序圖
這篇文章主要為大家詳細介紹了Python如何利用pynimate實現(xiàn)制作動態(tài)排序圖,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-02-02python實現(xiàn)整數(shù)的二進制循環(huán)移位
這篇文章主要為大家詳細介紹了python實現(xiàn)整數(shù)的二進制循環(huán)移位,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03