2013-12-11 10 views
11

Ich muss MatplotLib heatmap (pcolormesh) mit Pandas DataFrame TimeSeries Spalte (df_all.ts) als meine X-Achse erstellen.Erstellen Sie Heatmap mit Pandas TimeSeries

Wie konvertiert man die Pandas TimeSeries-Spalte in etwas, das als X-Achse in der Funktion np.meshgrid (x, y) verwendet werden kann, um eine Heatmap zu erstellen? Die Problemumgehung besteht darin, Matplotlib drange mit den gleichen Parametern wie in der Pandas-Spalte zu erstellen, aber gibt es einen einfachen Weg?

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

Ohne eine klare defi Was Sie wollen, nehme ich an, dass Ihre Heatmap ein einfaches 2D-Histogramm ist. Warum resample/piviere du deinen DF nicht und zeichne ihn mit 'plt.imshow (df_all.values)'? –

+0

Ich brauche nur 5-20 Elemente auf Achse Y, wie ich verstehe die Imshow() erfordert, jeden Punkt des Histogramms anzugeben – szu

+0

Sie können die Achse immer entsprechend den Daten neu zuordnen, die in der TimeSeries-Spalte enthalten sind. Betonen Sie nicht, dass Sie die Matplotlib-Funktionen zwingen, genau diese Daten als X-Achsen-Daten zu verwenden, wenn das Plotten als Bild funktioniert, und passen Sie dann die Achsenbeschriftungen an. – ely

Antwort

20

Ich weiß nicht, was Sie mit Heatmap für eine Zeitreihe bedeuten, aber für einen Datenrahmen können Sie wie unten tun:

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

, optional Istwerten in der Mitte jeder drucken Platz, mit einigem Schatten Lesbarkeit zu verbessern, können Sie tun:

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

Aber gibt es mit Ihrem Ansatz, Daten zu formatieren, wenn ich Hunderte Punkte auf X mit Minutenintervall habe, aber ich muss nur tägliche Ticks zeigen? – szu

+0

@szu, wenn Sie wollen, dass die Heat Map auch auf täglichen Intervallen basiert, dann müssen Sie zuerst pandas 'resample' Methode verwenden, ansonsten nur' set_xticks' und 'set_xticklabels' Aufrufe ändern –

+0

@ Behzad.Nouri Wenn ich den Druck ausführen Istwertcode, ich habe diesen Fehler: "ax.text (j, i, '{: .2f}'. Format (df.iget_value (i, j)), ValueError: Null Länge Feldname im Format" Do u Warum Pandas Version 0.14.1 und Python 2.6.6 –

Verwandte Themen