2015-07-06 4 views
7

नीचे मैं निम्न स्क्रिप्ट जो एक सरल समय श्रृंखला भूखंड बनाता है:Seaborn tsplot एक्स अक्ष में अच्छी तरह पर datetimes प्रदर्शित नहीं करता है

enter image description here

:

%matplotlib inline 
import datetime 
import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 

df = [] 
start_date = datetime.datetime(2015, 7, 1) 
for i in range(10): 
    for j in [1,2]: 
     unit = 'Ones' if j == 1 else 'Twos' 
     date = start_date + datetime.timedelta(days=i) 

     df.append({ 
       'Date': date.strftime('%Y%m%d'), 
       'Value': i * j, 
       'Unit': unit 
      }) 

df = pd.DataFrame(df) 

sns.tsplot(df, time='Date', value='Value', unit='Unit', ax=ax) 
fig.autofmt_xdate() 

और इसी का परिणाम निम्न है

जैसा कि आप देख सकते हैं कि x-axis में डेटाटाइम्स के लिए अजीब संख्याएं हैं, और सामान्य "अच्छे" प्रस्तुतियां नहीं हैं जो matplotlib और अन्य प्लॉटिंग उपयोगिताओं के साथ आती हैं। मैंने कई चीजों की कोशिश की है, डेटा को दोबारा स्वरूपित किया है लेकिन यह कभी भी साफ नहीं आता है। किसी को भी एक रास्ता पता है?

उत्तर

8

Matplotlib तारीखों को फ्लोटिंग पॉइंट नंबर (दिनों में) के रूप में दर्शाता है, इस प्रकार जब तक कि आप (या पांडा या समुद्री तट) नहीं देते हैं, यह बताएं कि आपके मान तिथियों का प्रतिनिधित्व कर रहे हैं, यह टिकों को तिथियों के रूप में प्रारूपित नहीं करेगा। मैं एक समुद्री विशेषज्ञ नहीं हूं, लेकिन ऐसा लगता है कि यह (या पांडा) datetime ऑब्जेक्ट्स को matplotlib तिथियों में परिवर्तित करता है, लेकिन फिर अक्षरों को उचित लोकेटर और स्वरूपक असाइन नहीं करता है। यही कारण है कि आप इन अजीब संख्या प्राप्त करते हैं, जो वास्तव में 0001.01.01 के बाद से ही दिन हैं। तो आपको मैन्युअल रूप से टिकों का ख्याल रखना होगा (जो, ज्यादातर मामलों में, वैसे भी बेहतर है क्योंकि यह आपको अधिक नियंत्रण देता है)।

तो आपको date locator असाइन करना होगा, जो तय करता है कि टिक कहां रखना है, और date formatter, जो तब टिक लेबल के लिए तारों को प्रारूपित करेगा।

import datetime 
import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 

# build up the data 
df = [] 
start_date = datetime.datetime(2015, 7, 1) 
for i in range(10): 
    for j in [1,2]: 
     unit = 'Ones' if j == 1 else 'Twos' 
     date = start_date + datetime.timedelta(days=i) 

     # I believe it makes more sense to directly convert the datetime to a 
     # "matplotlib"-date (float), instead of creating strings and then let 
     # pandas parse the string again 
     df.append({ 
       'Date': mdates.date2num(date), 
       'Value': i * j, 
       'Unit': unit 
      }) 
df = pd.DataFrame(df) 

# build the figure 
fig, ax = plt.subplots() 
sns.tsplot(df, time='Date', value='Value', unit='Unit', ax=ax) 

# assign locator and formatter for the xaxis ticks. 
ax.xaxis.set_major_locator(mdates.AutoDateLocator()) 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y.%m.%d')) 

# put the labels at 45deg since they tend to be too long 
fig.autofmt_xdate() 
plt.show() 

परिणाम:

enter image description here

+2

मैं इस त्रुटि मिलती है अजगर int भी मेरी तरफ सी लंबे – kurious

+0

वर्क्स में बदलने के लिए बड़े। क्या आप मेरे सटीक उदाहरण का उपयोग करते हैं? शायद आपको अपने डिस्ट्रो को अपडेट करना होगा। – hitzg

+2

@ क्रूर: मुझे कुछ समान मिल रहा है: 'ओवरफ्लो त्रुटि: _from_ordinalf (x, tz) में matplotlib/dates.pyc (line 214) से अधिकतम पूर्णांक हस्ताक्षर पूर्ण से अधिक है। पाइथन 2.7 के साथ लिनक्स पर बस पाइप स्थापित किया गया। –

7

मेरे लिए, में @ hitzg का जवाब परिणाम: DateFormatter की गहराई में "OverflowError पर हस्ताक्षर किए पूर्णांक अधिकतम से अधिक है"।

मेरे डेटाफ्रेम को देखते हुए, मेरे सूचकांक डेटाटाइम 64 हैं, समय-समय पर नहीं। हालांकि पांडस इन अच्छी तरह से बदलता है। निम्नलिखित काम करता है मेरे लिए महान: OverflowError:

import matplotlib as mpl 

def myFormatter(x, pos): 
    return pd.to_datetime(x) 

[ . . . ] 

ax.xaxis.set_major_formatter(mpl.ticker.FuncFormatter(myFormatter)) 
+0

और फिर हम इसे कैसे प्रारूपित कर सकते हैं? 'ax.xaxis.set_major_formatter (mdates.DateFormatter ('% Y.% m।% D')) 'काम नहीं करेगा। – MERose

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