2017-07-27 92 views
0

我正在嘗試使用seaborn庫創建一個來自熊貓數據框的熱圖。在這裏,代碼是:在seaborn熱圖上顯示日期

test_df = pd.DataFrame(np.random.randn(367, 5), 
       index = pd.DatetimeIndex(start='01-01-2000', end='01-01-2001', freq='1D')) 

ax = sns.heatmap(test_df.T) 
ax.xaxis.set_major_locator(mdates.MonthLocator()) 
ax.xaxis.set_minor_locator(mdates.DayLocator()) 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b')) 
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%d')) 

但是,我得到一個沒有印在X軸上的數字。

enter image description here

回答

4

Seaborn heatmap是一個明確的情節。它從0number of columns - 1,在這種情況下從0366。日期時間定位器和格式化程序將值作爲日期(或更確切地說,是與日期對應的數字)。對於所涉及的年份,這將是730120(= 01-01-2000)和730486(= 01-01-2001)之間的數字。

因此,爲了能夠使用matplotlib.dates格式化程序和定位器,您需要首先將數據幀索引轉換爲datetime對象。然後,您可以不使用熱圖,而是允許數字軸的圖,例如一個imshow情節。然後,您可以將該imshow圖的範圍設置爲與要顯示的日期範圍相對應。

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 

df = pd.DataFrame(np.random.randn(367, 5), 
       index = pd.DatetimeIndex(start='01-01-2000', end='01-01-2001', freq='1D')) 

dates = df.index.to_pydatetime() 
dnum = mdates.date2num(dates) 
start = dnum[0] - (dnum[1]-dnum[0])/2. 
stop = dnum[-1] + (dnum[1]-dnum[0])/2. 
extent = [start, stop, -0.5, len(df.columns)-0.5] 

fig, ax = plt.subplots() 
im = ax.imshow(df.T.values, extent=extent, aspect="auto") 

ax.xaxis.set_major_locator(mdates.MonthLocator()) 
ax.xaxis.set_minor_locator(mdates.DayLocator()) 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b')) 

fig.colorbar(im) 
plt.show() 

enter image description here

+0

感謝等的詳細說明。這確實有幫助。 –