2012-07-20 14 views
8

मैं pandas.DataFrame दिखाने के लिए matplotlib के imshow() फ़ंक्शन का उपयोग कर रहा हूं।पांडा, matplotlib, डेटा फ्रेम इंडेक्स अक्ष अक्ष टिक लेबल के रूप में उपयोग करें

मैं डेटाफ्रेम.इंडेक्स और डेटाफ्रेम.columns सूचियों से एक्स और वाई अक्ष दोनों के लिए लेबल और टिकों को लेना चाहता हूं, लेकिन मैं यह नहीं समझ सकता कि इसे कैसे किया जाए।

कि data मान लिया जाये कि एक 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 

जब मैं यह कर:

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 अक्ष पर अच्छी तरह से स्थान दिया गया टिक लेबल के साथ खत्म हो, लेकिन लेबल हैं 2101 के माध्यम से 1 9 01 के बजाय 1 901-1906. इसी प्रकार, एक्स अक्ष टिक लेबल जन-डीक के बजाय फेब-जुल हैं।

अगर मैं

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

का उपयोग तब मैं अक्ष टिक लेबल बस अंतर्निहित ndarray सूचक मान (अर्थात 0-201 और 0-12) होने के साथ खत्म। मुझे रिक्तियों या टिकों और लेबलों की मात्रा को संशोधित करने की आवश्यकता नहीं है, मैं बस लेबल टेक्स्ट को डेटाफ्रेम इंडेक्स और कॉलम सूचियों से आना चाहता हूं। यकीन नहीं है कि अगर मुझे कुछ आसान याद आ रहा है या नहीं?

अग्रिम धन्यवाद।

उत्तर

5

एक सामान्य समाधान के रूप में, मैं लाने के लिए एक आसान तरीका होना करने के लिए निम्न विधि पाया है एक पांडस डेटाटाइम 64 इंडेक्स एक matplotlib धुरी लेबल में।

सबसे पहले, पांडा डेटाटाइम 64 इंडेक्स को पाइथन डेटाटाइम डॉटटाइम क्लास में परिवर्तित करके एक नई श्रृंखला बनाएं।

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

यह सबसे सामान्य समाधान है - डेटटाइम हैक्स इत्यादि की कोई आवश्यकता नहीं है। – 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

संबंधित मुद्दे