2013-12-11 58 views
11

我需要使用Pandas DataFrame TimeSeries列(df_all.ts)作爲我的X軸創建MatplotLib熱圖(pcolormesh)。使用熊貓創建熱圖TimeSeries

如何將Pandas TimeSeries列轉換爲可以在np.meshgrid(x,y)函數中用作X軸的東西來創建熱圖?解決方法是使用與pandas列中相同的參數創建Matplotlib drange,但有沒有簡單的方法?

x = pd.date_range(df_all.ts.min(),df_all.ts.max(),freq='H') 
xt = mdates.drange(df_all.ts.min(), df_all.ts.max(), dt.timedelta(hours=1)) 
y = arange(ylen) 
X,Y = np.meshgrid(xt, y) 
+0

沒有一個明確的DEFI你想要什麼,我假設你的熱圖是一個簡單的二維直方圖。那麼爲什麼你不重新採樣/旋轉你的DF到這裏,並用'plt.imshow(df_all.values)'來繪製呢? –

+0

我只需要Y軸上的5-20個項目,因爲我知道imshow()需要指定直方圖的每個點。 – szu

+0

您可以根據TimeSeries列中的數據隨時重新標記軸。不要強調強制matplotlib函數精確地使用該數據作爲x軸數據,如果繪圖作爲圖像工作,然後調整軸標籤。 – ely

回答

20

我不知道你的熱圖的時間序列的意思,但是對於一個數據幀你,可以按以下操作:

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

from itertools import product 
from string import ascii_uppercase 
from matplotlib import patheffects 

m, n = 4, 7 # 4 rows, 7 columns 
df = pd.DataFrame(np.random.randn(m, n), 
        columns=list(ascii_uppercase[:n]), 
        index=list(ascii_uppercase[-m:])) 


ax = plt.imshow(df, interpolation='nearest', cmap='Oranges').axes 

_ = ax.set_xticks(np.linspace(0, n-1, n)) 
_ = ax.set_xticklabels(df.columns) 
_ = ax.set_yticks(np.linspace(0, m-1, m)) 
_ = ax.set_yticklabels(df.index) 

ax.grid('off') 
ax.xaxis.tick_top() 

可選,在每個中間打印實際值廣場上,一些陰影的可讀性,你可以這樣做:

path_effects = [patheffects.withSimplePatchShadow(shadow_rgbFace=(1,1,1))] 

for i, j in product(range(m), range(n)): 
    _ = ax.text(j, i, '{0:.2f}'.format(df.iloc[i, j]), 
       size='medium', ha='center', va='center', 
       path_effects=path_effects) 

heat-map

+1

但是,如果我在X上有數百個點,並且需要每隔一段時間纔有格式化日期的方法,但是我需要僅顯示每日滴答? – szu

+0

@szu如果你想要熱圖也是基於每天的時間間隔,那麼你需要先使用熊貓'resample'方法,否則只需修改'set_xticks'和'set_xticklabels'調用 –

+0

@ behzad.nouri當我運行打印實際值代碼,我得到這個錯誤:「ax.text(j,i,'{:.2f}'.format(df.iget_value(i,j)), ValueError:長度爲零的字段名稱格式爲」Do u知道爲什麼?Pandas版本0.14.1和python 2.6.6 –