Python繪制條形熱圖的示例代碼
為什么選擇條形熱圖
在科研數(shù)據(jù)分析和工程信號(hào)處理領(lǐng)域,當(dāng)我們需要同時(shí)展示多個(gè)樣本的連續(xù)變量波形時(shí),傳統(tǒng)的折線圖往往顯得雜亂無(wú)章 —— 想象一下,15 條波形曲線在同一個(gè)坐標(biāo)系里交織,是不是瞬間讓人眼花繚亂?這時(shí)候,條形熱圖(Strip Heatmap) 就像一位魔法設(shè)計(jì)師,用色彩編碼和有序排列讓復(fù)雜數(shù)據(jù)變得清爽直觀!
今天我們要分享的案例是:通過(guò)模擬帶噪聲的高斯峰值信號(hào),用 Seaborn 繪制高顏值條形熱圖,展示不同樣本的波形差異。這種可視化方法廣泛應(yīng)用于光譜分析、傳感器信號(hào)處理、生物醫(yī)學(xué)數(shù)據(jù)(如心電圖波形)等場(chǎng)景,能讓你一眼捕捉到數(shù)據(jù)的峰值位置、強(qiáng)度差異和噪聲分布~
代碼全景
先來(lái)看一段充滿(mǎn) “數(shù)學(xué)美感” 的代碼,它模擬了 15 個(gè)帶隨機(jī)峰值的信號(hào),并將它們優(yōu)雅地排列成熱圖:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 生成隨機(jī)數(shù)據(jù)(核心可替換區(qū)域①)
np.random.seed(0) # 固定隨機(jī)種子,確保結(jié)果可復(fù)現(xiàn)
x = np.arange(0, 91) # X軸范圍:0到90(代表信號(hào)的連續(xù)變量,如波長(zhǎng)、時(shí)間等)
n_samples = 15 # 樣本數(shù)量,可改為你的實(shí)際樣本數(shù)
data = []
# 生成每個(gè)樣本的峰值位置(35-55之間的隨機(jī)值,可替換為真實(shí)峰值數(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)) # 標(biāo)準(zhǔn)差8控制峰寬
noise = np.random.randn(len(x)) * 2 # 高斯噪聲,可調(diào)整噪聲強(qiáng)度④
# 信號(hào)疊加:基線10 + 峰值信號(hào)*40 + 噪聲(可修改基線和縮放因子⑤)
row = 10 + profile * 40 + noise
data.append(row)
# 創(chuàng)建數(shù)據(jù)框(核心可替換區(qū)域⑥:替換為你的真實(shí)數(shù)據(jù))
df = pd.DataFrame(data, columns=x) # columns對(duì)應(yīng)X軸變量,如波長(zhǎng)、時(shí)間點(diǎn)
labels = [f"Samp {chr(ord('A')+i)}" for i in range(n_samples)] # 樣本標(biāo)簽
df.index = labels # 設(shè)置行名為樣本標(biāo)簽
# 繪制條形熱圖(可視化參數(shù)可靈活調(diào)整⑦)
plt.figure(figsize=(12, 6)) # 調(diào)整畫(huà)布大小
sns.heatmap(
df.iloc[::-1], # 反轉(zhuǎn)行順序,讓第一個(gè)樣本顯示在頂部
cmap="coolwarm", # 藍(lán)-紅發(fā)散色階,適合顯示有基線的信號(hào)
vmin=0, vmax=50, # 固定顏色范圍,確保不同數(shù)據(jù)對(duì)比一致
cbar=True, # 顯示顏色條
linewidths=0.5, # 樣本間添加白色分隔線
linecolor='white' # 分隔線顏色
)
plt.title("條形熱圖:帶噪聲的高斯峰值信號(hào)", fontsize=16, pad=20)
plt.xlabel("K (w) (可替換為實(shí)際變量名,如波長(zhǎng)/nm、時(shí)間/ms)", fontsize=14)
plt.ylabel("樣本", fontsize=14)
# 定制X軸刻度:每10個(gè)單位顯示一個(gè)刻度
plt.xticks(np.arange(0, len(x), 10), np.arange(0, len(x), 10))
# 定制Y軸標(biāo)簽:反轉(zhuǎn)順序并取消旋轉(zhuǎn),讓標(biāo)簽水平顯示
plt.yticks(np.arange(len(labels)) + 0.5, labels[::-1], rotation=0)
plt.tight_layout() # 自動(dòng)調(diào)整布局,避免標(biāo)簽重疊
plt.show()效果如下

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

