2013-12-11 22 views
11

Tôi cần tạo bản đồ nhiệt MatplotLib (pcolormesh) bằng cột Thời gian Pandas DataFrame (df_all.ts) làm trục X của tôi.Tạo bản đồ nhiệt bằng cách sử dụng gấu trúc TimeSeries

Làm thế nào để chuyển đổi cột Pandas TimeSeries thành một thứ có thể dùng làm trục X trong hàm np.meshgrid (x, y) để tạo bản đồ nhiệt? Cách giải quyết là tạo Matplotlib drange bằng các tham số giống như trong cột gấu trúc, nhưng có cách đơn giản không?

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

Nếu không có một Defi rõ ràng nition của những gì bạn muốn, tôi giả sử heatmap của bạn là một biểu đồ 2D đơn giản. Vậy tại sao bạn không resample/pivot DF của bạn để điều này và âm mưu nó với 'plt.imshow (df_all.values)'? –

+0

Tôi chỉ cần 5-20 mục trên trục Y, vì tôi hiểu imshow() yêu cầu chỉ định mọi điểm của biểu đồ – szu

+0

Bạn luôn có thể gắn nhãn lại trục theo dữ liệu trong cột TimeSeries. Đừng căng thẳng về việc buộc các hàm matplotlib sử dụng chính xác dữ liệu đó như dữ liệu trục x nếu vẽ như một hình ảnh hoạt động và sau đó điều chỉnh các nhãn trục. – ely

Trả lời

20

Tôi không biết những gì bạn có nghĩa là bởi bản đồ nhiệt cho một chuỗi thời gian, nhưng đối với một dataframe bạn có thể làm như sau:

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() 

tùy chọn, in giá trị thực tế ở giữa mỗi vuông, với một số bóng để có thể đọc, bạn có thể làm:

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

Nhưng có cách nào với cách tiếp cận của bạn để định dạng ngày nếu tôi có hàng trăm điểm trên X với khoảng thời gian phút, nhưng tôi cần phải hiển thị bọ ve hàng ngày? – szu

+0

@szu nếu bạn muốn bản đồ nhiệt cũng được dựa trên khoảng thời gian hàng ngày, sau đó bạn cần sử dụng phương pháp 'resample' gấu trúc, nếu không chỉ cần sửa đổi' set_xticks' và 'set_xticklabels' gọi –

+0

@ behzad.nouri Khi tôi chạy bản in mã giá trị thực tế, tôi nhận được lỗi này: "ax.text (j, i, '{: .2f}'. định dạng (df.iget_value (i, j)), ValueError: tên trường có độ dài bằng 0 theo định dạng" Do u biết tại sao? Pandas phiên bản 0.14.1 và python 2.6.6 –

Các vấn đề liên quan