2012-07-20 81 views
8

我正在使用matplotlib的imshow()函數來顯示pandas.DataFramepandas,matplotlib,使用數據幀索引作爲軸刻度標籤

我想爲x和y軸的標籤和刻度線從DataFrame.index和DataFrame.columns列表中繪製,但我無法弄清楚如何去做。

假設datapandas.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 

當我這樣做:

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) 

我結束了對圖像的y軸很好地間隔開的刻度標記,但是標記物是1901-1906而不是1901到2101.同樣,x軸刻度標籤是feb-jul而不是jan-dec。

如果我使用

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

然後我結束與軸刻度標記標籤簡單地是底層ndarray索引值(即0-201和0-12)。我不需要修改刻度和標籤的間距或數量,我只是希望標籤文本來自DataFrame索引和列列表。不知道我是否失去了一些容易或不容易?

在此先感謝。

回答

5

作爲一個通用的解決方案,我發現下面的方法是一種簡單的方法,使一個Pandas datetime64索引放入一個matplotlib軸標籤中。

首先,通過將pandas datetime64索引轉換爲Python datetime.datetime類來創建一個新系列。

new_series = your_pandas_dataframe.index.to_pydatetime()

現在你有matplotlib.dates的所有功能。繪圖之前,導入matplotlib。日期爲mdates並宣佈下列變量:

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 

現在,讓你的曲線,使用new_series爲x軸:

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

您可以使用上述聲明的mdates功能來調整標籤並打勾你的喜歡,如:

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

我認爲這個問題與指定現有刻度的刻度標籤有關。默認情況下,標記的數量少於標籤,因此只使用前幾個標籤。通過首先設置滴答數量,以下應該工作。

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) 

這會在y軸上產生每年的勾號,因此您可能需要使用索引值的子集。

+0

這是最一般的解決方案 - 不需要日期時間黑客等。 – FuzzyDuck 2016-11-01 12:14:24

3

我發現最簡單的方法是使用ImageGrid。下面是它顯示在一個更像樣的格式代碼來做到這一點,情節+ here is an IPython notebook

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

相關問題