পান্ডাস টাইমরিজ প্লট সেট করে এক্স-অক্ষ মেজর এবং মাইনর টিক্স এবং লেবেল


87

আমি পান্ডাস সময় সিরিজ অবজেক্ট থেকে প্লট করা টাইম সিরিজের গ্রাফের জন্য প্রধান এবং গৌণ xticks এবং তাদের লেবেল সেট করতে সক্ষম হতে চাই।

পান্ডারা 0.9 "নতুন কী" পৃষ্ঠাটি বলেছেন:

"আপনি হয় টুপিডেটটাইম ব্যবহার করতে পারেন বা টাইমস্ট্যাম্প ধরণের জন্য একটি রূপান্তরকারী নিবন্ধন করতে পারেন"

তবে আমি কীভাবে এটি করব তা নিয়ে কাজ করতে পারি না যাতে আমি ম্যাটপ্ল্লিটিব ax.xaxis.set_major_locatorএবং ax.xaxis.set_major_formatter(এবং নাবালিক ) কমান্ড ব্যবহার করতে পারি ।

যদি আমি তাদেরকে পান্ডাস বার রূপান্তর না করে ব্যবহার করি তবে এক্স-অক্ষের টিক্স এবং লেবেলগুলি ভুল হয়ে যায়।

'অস্টিক্স' প্যারামিটার ব্যবহার করে আমি বড় টিকগুলি প্যান্ডাস.প্লোতে পাস করতে পারি এবং তারপরে বড় টিক লেবেল সেট করতে পারি। এই পদ্ধতির সাহায্যে ছোটখাটো টিক্স কীভাবে করব তা আমি কাজ করতে পারি না। (আমি পান্ডাস.প্লট দ্বারা সেট করা ডিফল্ট গৌণ টিকগুলিতে লেবেলগুলি সেট করতে পারি)

আমার পরীক্ষার কোডটি এখানে:

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

জ্যাক্সিসে অদ্ভুত তারিখ সহ গ্রাফ

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সম্ভব: সম্ভব তবে আদর্শ নয়।


4
আমি জানি এটি সত্যই প্রশ্নের উত্তর দেয় না, তবে একটি সাধারণ পদ্ধতির হিসাবে যখন আমি সত্যিই প্লটটি কেমন দেখায় সে সম্পর্কে যত্নশীল থাকি, আমি সাধারণত কেবল এটির একটি ভেক্টর সংস্করণ পাওয়ার চেষ্টা করি এবং এটি ইলাস্ট্রেটর বা ইনসকেপে সুন্দর দেখায়। আমি জানি এমন বেশিরভাগ লোককে আমি খুঁজে পেয়েছি যা তারা একই কাজ করে বলে মনে হচ্ছে।
জন ম্যাকডোনেল

4
আপনি কী পুরোপুরি plotপান্ডাস ফাংশনটিতে যুক্তিগুলি উপেক্ষা করতে পারেন এবং প্রত্যাবর্তিত axবস্তুর (যেমন, ax.set_xticks) ম্যাটপ্ল্লোব পদ্ধতি ব্যবহার করে প্লট করার পরে সমস্ত টিক্স সেট করতে পারেন ?
ব্রেইনবার্ন

@ ব্রেনবার্ন আমি ম্যাটপ্ল্লোলিব পদ্ধতির জন্য পান্ডার ডেটটাইমের পরিবর্তে অজগর তারিখ হিসাবে কীভাবে তারিখটি পাব তা আমি বুঝতে পারি না। বমু দ্বারা উত্তর স্থির করে যে প্লট করার আগে তারিখগুলি রূপান্তর করে।
ব্রেন্ডা

উত্তর:


89

উভয় pandasএবং টিকগুলি সনাক্ত করার জন্য matplotlib.datesব্যবহার করুন matplotlib.units

তবে matplotlib.datesটিক্সগুলি ম্যানুয়ালি সেট করার সুবিধামত উপায় থাকা সত্ত্বেও, পান্ডাসের মনে হচ্ছে এখন পর্যন্ত অটো ফর্ম্যাটিংয়ে ফোকাস রয়েছে ( প্যানডে তারিখ রূপান্তরকরণ এবং ফর্ম্যাটিংয়ের কোডটি আপনি দেখতে পারেন )।

এই মুহুর্তে এটি ব্যবহার করা আরও যুক্তিসঙ্গত বলে মনে হয় matplotlib.dates(যেমনটি তার মন্তব্যে @ ব্রেনবার্ন উল্লেখ করেছেন)।

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

পান্ডাস_ লাইক_ডেট_ফম্যাটটিং

(আমার স্থানীয় অবস্থান জার্মান, যাতে মঙ্গলবার [মঙ্গল] ডিনস্ট্যাগে পরিণত হয় [ডিআই])

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.