2012-07-20 23 views
8

matplotlibのimshow()関数を使用してpandas.DataFrameを表示しています。pandas、matplotlib、軸目盛ラベルとしてデータフレームインデックスを使用

x軸とy軸の両方のラベルとティックをDataFrame.indexとDataFrame.columnsリストから取得したいと思いますが、どのように行うのかわかりません。

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

をIは画像のy軸上にうまく離間目盛りラベルで終わるが、ラベルがあるdatapandas.DataFrameであると仮定すると

同様に、x軸目盛りのラベルは、jan-decではなくfeb-julです。

Iは

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

を使用する場合、私は軸目盛ラベルは、単に基礎となるndarray指標値(すなわち、0から201及び0-12)であることで終わります。ダニとラベルの間隔や数量を変更する必要はありません。ラベルテキストをDataFrameインデックスと列リストから取得するだけです。私は何かが簡単かどうか分からないかどうか分からない?

ありがとうございます。

答えて

5

は、私が持参する簡単な方法であることを、次の方法を発見しましたパンダの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 

、x軸としてnew_seriesを使用して、あなたのプロットを作る:

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

これは最も一般的な解決策です。これは、DateTimeハッキングなどが不要です。 – FuzzyDuck

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

関連する問題