【畫圖】Python繪製熱力圖方法以及保存不全問題(seaborn.heatmap)

0 前言

鑑於Matlab畫圖已經被封,自此畫圖戰線全部轉移到Python上來,這篇博客描述了Python畫熱力圖的方法以及我踩到的坑。

1 程序

1.1 導入包

這裏使用seaborn的heatmap函數繪製

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

1.2 載入CSV文件

這裏替換自己要畫的矩陣,選擇好index_col。及矩陣的每一行每一列是什麼,要考慮好。

df_2 = pd.read_csv('HeatMap.csv',index_col='Model')

1.3 繪製熱力圖

fig = plt.figure()
ax  = fig.add_subplot(1,1,1)
p1 = sns.heatmap(df_2,annot=True,ax=ax)
ax.set_title('Heat Map')
ax.set_xlabel('')
ax.set_ylabel('')

1.4 保存

先獲取活動圖,再用savefig保存

s1 = p1.get_figure()
s1.savefig('HeatMap.jpg',dpi=300,bbox_inches='tight')

2 踩到的坑

2.1 CSV文件格式問題

首先是CSV文件編碼,最好不要直接把excel重命名成csv,而是另存爲csv,因爲excel的編碼方式與CSV不同,如果直接重命名可能導致read_csv函數爆編碼錯誤。

CSV文件內容問題,尤其是矩陣各行各列的標題,可以不保留標題,後續再使用函數添加,也可以在CSV文件中定義好,讀取的時候選擇好index_col。

2.2 畫圖問題

變量ax的目的是確定好座標軸,使用sns.heatmap指定好座標軸,各參數的作用再後文參考文獻中。

2.3 保存圖像不完整問題

我遇到了保存圖像不完整的問題,一開始以爲是版本問題,後來發現,直接在jupyter notebook中顯示時一切正常,但是保存後發現左邊不完整,才知道是保存的問題。

s1.savefig('HeatMap.jpg',dpi=300,bbox_inches='tight')

在這裏指定 bbox_inches='tight’後,Bug修復,一切結束。

3 參考

關於seaborn.heatmap函數的詳細解讀
參考:
[1]、函數解讀:看這裏
[2]、保存不完整,看這裏

seaborn.heatmap(data, vmin=None, vmax=None,cmap=None, center=None, robust=False, annot=None, fmt=.2g’, annot_kws=None,linewidths=0, linecolor=’white’, cbar=True, cbar_kws=None,cbar_ax=None,square=False, xticklabels=’auto’, yticklabels=’auto’,mask=None, ax=None,**kwargs)

(1)熱力圖輸入數據參數:
data:矩陣數據集,可以是numpy的數組(array),也可以是pandas的DataFrame。如果是DataFrame,則df的index/column信息會分別對應到heatmap的columns和rows,即pt.index是熱力圖的行標,pt.columns是熱力圖的列標

(2)熱力圖矩陣塊顏色參數: vmax,vmin:分別是熱力圖的顏色取值最大和最小範圍,默認是根據data數據表裏的取值確定
cmap:從數字到色彩空間的映射,取值是matplotlib包裏的colormap名稱或顏色對象,或者表示顏色的列表;改參數默認值:根據center參數設定
center:數據表取值有差異時,設置熱力圖的色彩中心對齊值;通過設置center值,可以調整生成的圖像顏色的整體深淺;設置center數據時,如果有數據溢出,則手動設置的vmax、vmin會自動改變
robust:默認取值False;如果是False,且沒設定vmin和vmax的值,熱力圖的顏色映射範圍根據具有魯棒性的分位數設定,而不是用極值設定

(3)熱力圖矩陣塊註釋參數:
annot(annotate的縮寫):默認取值False;如果是True,在熱力圖每個方格寫入數據;如果是矩陣,在熱力圖每個方格寫入該矩陣對應位置數據
fmt:字符串格式代碼,矩陣上標識數字的數據格式,比如保留小數點後幾位數字
annot_kws:默認取值False;如果是True,設置熱力圖矩陣上數字的大小顏色字體,matplotlib包text類下的字體設置;官方文檔:

(4)熱力圖矩陣塊之間間隔及間隔線參數: linewidths:定義熱力圖裏“表示兩兩特徵關係的矩陣小塊”之間的間隔大小
linecolor:切分熱力圖上每個矩陣小塊的線的顏色,默認值是’white’

(5)熱力圖顏色刻度條參數: cbar:是否在熱力圖側邊繪製顏色刻度條,默認值是True
cbar_kws:熱力圖側邊繪製顏色刻度條時,相關字體設置,默認值是None
cbar_ax:熱力圖側邊繪製顏色刻度條時,刻度條位置設置,默認值是None

(6)square:設置熱力圖矩陣小塊形狀,默認值是False xticklabels,
yticklabels:xticklabels控制每列標籤名的輸出;yticklabels控制每行標籤名的輸出。默認值是auto。如果是True,則以DataFrame的列名作爲標籤名。如果是False,則不添加行標籤名。如果是列表,則標籤名改爲列表中給的內容。如果是整數K,則在圖上每隔K個標籤進行一次標註。
如果是auto,則自動選擇標籤的標註間距,將標籤名不重疊的部分(或全部)輸出

mask:控制某個矩陣塊是否顯示出來。默認值是None。如果是布爾型的DataFrame,則將DataFrame裏True的位置用白色覆蓋掉
ax:設置作圖的座標軸,一般畫多個子圖時需要修改不同的子圖的該值
**kwargs:All other keyword arguments are passed to ax.pcolormesh

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章