2012-07-20 17 views
8

Ich verwende Matplotlibs imshow() Funktion, um eine pandas.DataFrame anzuzeigen.pandas, matplotlib, benutze Dataframe-Index als Achsenstrichbezeichnungen

Ich möchte, dass die Labels und Ticks für X- und Y-Achsen aus den Listen DataFrame.Index und DataFrame.columns gezeichnet werden, aber ich kann nicht herausfinden, wie es geht.

dass data Angenommen ist ein pandas.DataFrame:

>>> print data 
<class 'pandas.core.frame.DataFrame'> 
Index: 201 entries, 1901 to 2101 
Data columns: 
jan 201 non-null values 
feb 201 non-null values 
mar 201 non-null values 
apr 201 non-null values 
may 201 non-null values 
jun 201 non-null values 
jul 201 non-null values 
aug 201 non-null values 
sep 201 non-null values 
oct 201 non-null values 
nov 201 non-null values 
dec 201 non-null values 

Wenn ich tun:

ax1 = fig.add_subplot(131, xticklabels=data.columns, yticklabels=data.index) 
ax1.set_title("A") 
ax1.tick_params(axis='both', direction='out') 
im1 = ax1.imshow(data, 
       interpolation='nearest', 
       aspect='auto', 
       cmap=cmap) 

I mit schön beabstandeten Strichbeschriftungen auf der y-Achse des Bildes enden, aber die Markierungen 1901-1906 anstelle von 1901 bis 2101. Ebenso sind die Tick-Bezeichnungen der x-Achse feb-jul anstelle von jan-dec.

Wenn I

verwenden
ax1 = fig.add_subplot(131) # without specifying tick labels 

dann am Ende I Etiketten mit der Achse tick up einfach die darunterliegende ndarray Indexwerte zu sein (das heißt 0 bis 201 und 0-12). Ich muss den Abstand oder die Anzahl der Ticks und Beschriftungen nicht ändern. Ich möchte nur, dass der Beschriftungstext aus den DataFrame-Index- und Spaltenlisten kommt. Nicht sicher, ob ich etwas leicht vermisse oder nicht?

Vielen Dank im Voraus.

Antwort

5

Als allgemeine Lösung, ich habe die folgende Methode gefunden eine einfache Möglichkeit, um zu bringen ein Pandas datetime64-Index in eine Matplotlib-Achsenbeschriftung.

Erstellen Sie zuerst eine neue Serie, indem Sie den pandas datetime64-Index in eine Python-datetime.datetime-Klasse konvertieren.

new_series = your_pandas_dataframe.index.to_pydatetime()

Jetzt haben Sie alle Funktionen von matplotlib.dates. Bevor Sie Plotten, importieren Sie Matplotlib.Termine als mdates und erklären die folgenden Variablen:

years = mdates.YearLocator() 
months = mdates.MonthLocator() 
days = mdates.DayLocator() 
hours = mdates.HourLocator(12) #if you want ticks every 12 hrs, you can pass 12 to this function 
minutes = mdates.MinuteLocator() 
daysFmt = mdates.DateFormatter('%m/%d') #or whatever format you want 

jetzt Ihre Plots machen, die new_series als die x-Achse mit:

fig1 = plt.figure() 
ax = fig1.add_subplot(111) 
ax.plot(new_series,your_pandas_dataframe) 

Sie können die mdates Funktionen oben angegebenen verwenden, um die Etiketten zu zwicken und ticks zu Ihrem gefälligen, wie:

ax.xaxis.set_major_locator(days) 
ax.xaxis.set_major_formatter(daysFmt) 
ax.xaxis.set_minor_locator(hours) 
6

Ich glaube, das Problem hat mit der Angabe der Tick-Etiketten für vorhandene Ticks zu tun. Standardmäßig gibt es weniger Ticks als Labels, daher werden nur die ersten Labels verwendet. Folgendes sollte funktionieren, indem zuerst die Anzahl der Ticks eingestellt wird.

ax1 = fig.add_subplot(131) 
ax1.set_title("A") 
ax1.tick_params(axis='both', direction='out') 
ax1.set_xticks(range(len(data.columns))) 
ax1.set_xticklabels(data.columns) 
ax1.set_yticks(range(len(data.index))) 
ax1.set_yticklabels(data.index) 
im1 = ax1.imshow(data, interpolation='nearest', aspect='auto', cmap=cmap) 

Dies erzeugt einen Tick für jedes Jahr auf der y-Achse, so dass Sie möglicherweise eine Teilmenge der Indexwerte verwenden möchten.

+0

Dies ist die allgemeinste Lösung - keine Notwendigkeit für DateTime Hacks usw. – FuzzyDuck

3

Ich habe festgestellt, dass der einfachste Weg, dies zu tun ist mit ImageGrid. Hier ist der Code dieses und die Handlung + here is an IPython notebook zu tun, dass es in einem mehr vorzeigbar Format zeigt:

mons = ['Jan', 
'Feb', 
'Mar', 
'Apr', 
'May', 
'Jun', 
'Jul', 
'Aug', 
'Sep', 
'Oct', 
'Nov', 
'Dec'] 

# just get the first 5 for illustration purposes 
df = DataFrame(randn(201, len(mons)), columns=mons, 
       index=arange(1901, 2102))[:5] 

from mpl_toolkits.axes_grid1 import ImageGrid 
fig = figure(figsize=(20, 100)) 
grid = ImageGrid(fig, 111, nrows_ncols=(1, 1), 
       direction='row', axes_pad=0.05, add_all=True, 
       label_mode='1', share_all=False, 
       cbar_location='right', cbar_mode='single', 
       cbar_size='10%', cbar_pad=0.05) 

ax = grid[0] 
ax.set_title('A', fontsize=40) 
ax.tick_params(axis='both', direction='out', labelsize=20) 
im = ax.imshow(df.values, interpolation='nearest', vmax=df.max().max(), 
       vmin=df.min().min()) 
ax.cax.colorbar(im) 
ax.cax.tick_params(labelsize=20) 
ax.set_xticks(arange(df.shape[1])) 
ax.set_xticklabels(mons) 
ax.set_yticks(arange(df.shape[0])) 
ax.set_yticklabels(df.index) 

enter image description here

Verwandte Themen