पंडों समयसीमाएँ x- अक्ष के प्रमुख और लघु टिक्स और लेबल की स्थापना करती हैं


87

मैं एक पांडस समय श्रृंखला ऑब्जेक्ट से प्लॉट किए गए समय श्रृंखला ग्राफ के लिए प्रमुख और मामूली ऑक्सिक्स और उनके लेबल सेट करने में सक्षम होना चाहता हूं।

पंडों 0.9 "नया क्या है" पृष्ठ कहता है:

"आप या तो_पेडटाइम का उपयोग कर सकते हैं या टाइमस्टैम्प प्रकार के लिए एक कनवर्टर रजिस्टर कर सकते हैं"

लेकिन मैं यह नहीं कर सकता कि ऐसा कैसे करूं ताकि मैं matplotlib ax.xaxis.set_major_locatorऔर ax.xaxis.set_major_formatter(और मामूली) कमांड का उपयोग कर सकूं ।

यदि मैं पंडों के समय को परिवर्तित किए बिना उनका उपयोग करता हूं, तो एक्स-अक्ष टिक और लेबल गलत हो जाते हैं।

'Xticks' पैरामीटर का उपयोग करके मैं प्रमुख टिकों को pandas.plot में पास कर सकता हूं, और फिर प्रमुख टिक लेबल सेट कर सकता हूं। मैं इस दृष्टिकोण का उपयोग करके मामूली टिक करने के लिए कैसे काम नहीं कर सकता। (मैं pandas.plot द्वारा निर्धारित डिफ़ॉल्ट मामूली टिक्स पर लेबल सेट कर सकता हूं)

यहाँ मेरा परीक्षण कोड है:

import pandas
print 'pandas.__version__ is ', pandas.__version__
print 'matplotlib.__version__ is ', matplotlib.__version__    

dStart = datetime.datetime(2011,5,1) # 1 May
dEnd = datetime.datetime(2011,7,1) # 1 July    

dateIndex = pandas.date_range(start=dStart, end=dEnd, freq='D')
print "1 May to 1 July 2011", dateIndex      

testSeries = pandas.Series(data=np.random.randn(len(dateIndex)),
                           index=dateIndex)    

ax = plt.figure(figsize=(7,4), dpi=300).add_subplot(111)
testSeries.plot(ax=ax, style='v-', label='first line')    

# using MatPlotLib date time locators and formatters doesn't work with new
# pandas datetime index
ax.xaxis.set_minor_locator(matplotlib.dates.WeekdayLocator(byweekday=(1),
                                                           interval=1))
ax.xaxis.set_minor_formatter(matplotlib.dates.DateFormatter('%d\n%a'))
ax.xaxis.grid(True, which="minor")
ax.xaxis.grid(False, which="major")
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('\n\n\n%b%Y'))
plt.show()    

# set the major xticks and labels through pandas
ax2 = plt.figure(figsize=(7,4), dpi=300).add_subplot(111)
xticks = pandas.date_range(start=dStart, end=dEnd, freq='W-Tue')
print "xticks: ", xticks
testSeries.plot(ax=ax2, style='-v', label='second line',
                xticks=xticks.to_pydatetime())
ax2.set_xticklabels([x.strftime('%a\n%d\n%h\n%Y') for x in xticks]);
# set the text of the first few minor ticks created by pandas.plot
#    ax2.set_xticklabels(['a','b','c','d','e'], minor=True)
# remove the minor xtick labels set by pandas.plot 
ax2.set_xticklabels([], minor=True)
# turn the minor ticks created by pandas.plot off 
# plt.minorticks_off()
plt.show()
print testSeries['6/4/2011':'6/7/2011']

और इसका उत्पादन:

pandas.__version__ is  0.9.1.dev-3de54ae
matplotlib.__version__ is  1.1.1
1 May to 1 July 2011 <class 'pandas.tseries.index.DatetimeIndex'>
[2011-05-01 00:00:00, ..., 2011-07-01 00:00:00]
Length: 62, Freq: D, Timezone: None

Xaxis पर अजीब तारीखों के साथ ग्राफ़

xticks:  <class 'pandas.tseries.index.DatetimeIndex'>
[2011-05-03 00:00:00, ..., 2011-06-28 00:00:00]
Length: 9, Freq: W-TUE, Timezone: None

सही तिथियों के साथ ग्राफ

2011-06-04   -0.199393
2011-06-05   -0.043118
2011-06-06    0.477771
2011-06-07   -0.033207
Freq: D

अपडेट: मैं उस लेआउट के करीब पहुंचने में सक्षम हूं जिसे मैं प्रमुख xtick लेबल बनाने के लिए एक लूप का उपयोग करके चाहता था:

# only show month for first label in month
month = dStart.month - 1
xticklabels = []
for x in xticks:
    if  month != x.month :
        xticklabels.append(x.strftime('%d\n%a\n%h'))
        month = x.month
    else:
        xticklabels.append(x.strftime('%d\n%a'))

हालांकि, यह एक्स-एक्सिस का उपयोग करके थोड़ा सा है ax.annotate: संभव है लेकिन आदर्श नहीं।


1
मुझे पता है कि यह वास्तव में सवाल का जवाब नहीं देता है, लेकिन एक सामान्य दृष्टिकोण के रूप में जब मैं वास्तव में इस बात की परवाह करता हूं कि एक प्लॉट कैसा दिखता है, तो मैं आमतौर पर केवल इसका एक वेक्टर संस्करण प्राप्त करने की कोशिश करता हूं और इलस्ट्रेटर या इंकस्केप में अच्छा दिखता हूं। मुझे लगता है मुझे पता है कि मैं ऐसा करने के लिए सबसे अधिक अन्य लोगों को मिल गया है।
जॉन मैकडॉनेल

2
क्या आप केवल पंडों के plotकार्य के तर्कों को अनदेखा कर सकते हैं और प्लॉटिंग के बाद सभी टिकों को सेट कर सकते हैं, लौटे हुए axऑब्जेक्ट (जैसे, ax.set_xticks) के matplotlib विधियों का उपयोग करके ?
ब्रेनबार

@BrenBarn मैं यह पता नहीं लगा सका कि मैटलपोटलिब विधियों के लिए पंडों के डेटटाइम के बजाय डेट को डेट के रूप में कैसे प्राप्त किया जाए। Bmu द्वारा उत्तर को ठीक करता है कि साजिश रचने से पहले दिनांक परिवर्तित करके।
ब्रेंडा

जवाबों:


89

दोनों pandasऔर matplotlib.datesउपयोग matplotlib.unitsटिक पता लगाने के लिए।

जबकि matplotlib.datesमैन्युअल रूप से टिक्स सेट करने के लिए सुविधाजनक तरीके हैं, पंडों को अब तक ऑटो स्वरूपण पर ध्यान केंद्रित करना लगता है (आप पंडों में दिनांक रूपांतरण और प्रारूपण के लिए कोड पर एक नज़र डाल सकते हैं )।

तो फिलहाल इसका उपयोग करना अधिक उचित लगता है matplotlib.dates(जैसा कि @BrenBarn ने अपनी टिप्पणी में उल्लेख किया है)।

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import matplotlib.dates as dates

idx = pd.date_range('2011-05-01', '2011-07-01')
s = pd.Series(np.random.randn(len(idx)), index=idx)

fig, ax = plt.subplots()
ax.plot_date(idx.to_pydatetime(), s, 'v-')
ax.xaxis.set_minor_locator(dates.WeekdayLocator(byweekday=(1),
                                                interval=1))
ax.xaxis.set_minor_formatter(dates.DateFormatter('%d\n%a'))
ax.xaxis.grid(True, which="minor")
ax.yaxis.grid()
ax.xaxis.set_major_locator(dates.MonthLocator())
ax.xaxis.set_major_formatter(dates.DateFormatter('\n\n\n%b\n%Y'))
plt.tight_layout()
plt.show()

pandas_like_date_fomatting

(मेरा लोकेल जर्मन है, ताकि मंगलवार [मंगल] दीनेस्टैग [Di] बन जाए)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.