ম্যাটপ্লোটিলেব তারিখ টিক্স এবং ঘূর্ণন


175

আমার তারিখের টিক্সগুলি ম্যাটপ্লোটিলেব ঘোরানোর চেষ্টা করার সময় আমার একটি সমস্যা হচ্ছে। একটি ছোট নমুনা প্রোগ্রাম নীচে। আমি যদি শেষে টিক্সগুলি ঘোরানোর চেষ্টা করি তবে টিকগুলি ঘোরানো হবে না। আমি যদি 'ক্র্যাশ' মন্তব্যের আওতায় টিক্সগুলি ঘোরানোর চেষ্টা করি তবে ম্যাটপ্লট লাইব ক্র্যাশ।

এটি কেবল তখনই ঘটে যখন এক্স-মানগুলি তারিখ হয়। আমি পরিবর্তনশীল প্রতিস্থাপন তাহলে datesপরিবর্তনশীল সঙ্গে tথেকে কল মধ্যে avail_plot, xticks(rotation=70)কল শুধু জরিমানা ভিতরে কাজ করে avail_plot

কোন ধারনা?

import numpy as np
import matplotlib.pyplot as plt
import datetime as dt

def avail_plot(ax, x, y, label, lcolor):
    ax.plot(x,y,'b')
    ax.set_ylabel(label, rotation='horizontal', color=lcolor)
    ax.get_yaxis().set_ticks([])

    #crashes
    #plt.xticks(rotation=70)

    ax2 = ax.twinx()
    ax2.plot(x, [1 for a in y], 'b')
    ax2.get_yaxis().set_ticks([])
    ax2.set_ylabel('testing')

f, axs = plt.subplots(2, sharex=True, sharey=True)
t = np.arange(0.01, 5, 1)
s1 = np.exp(t)
start = dt.datetime.now()
dates=[]
for val in t:
    next_val = start + dt.timedelta(0,val)
    dates.append(next_val)
    start = next_val

avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
plt.subplots_adjust(hspace=0, bottom=0.3)
plt.yticks([0.5,],("",""))
#doesn't crash, but does not rotate the xticks
#plt.xticks(rotation=70)
plt.show()

3
এক্স-অ্যাক্সেসে খেজুর সহ একটি প্লট তৈরি করা এটি একটি সাধারণ কাজ - লজ্জার বিষয় এখানে আরও সম্পূর্ণ উদাহরণ নেই।
অ্যালেক্স

উত্তর:


249

আপনি যদি অ-অবজেক্ট-ভিত্তিক পদ্ধতির পছন্দ করেন তবে দুটি কলের আগেplt.xticks(rotation=70) ডানদিকে যানavail_plot , যেমন

plt.xticks(rotation=70)
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')

এটি লেবেলগুলি স্থাপনের আগে ঘূর্ণন সম্পত্তি সেট করে। যেহেতু আপনার এখানে দুটি অক্ষ রয়েছে, plt.xticksআপনি দুটি প্লট তৈরি করার পরে বিভ্রান্ত হন। এই মুহুর্তে যখন plt.xticksকিছু না করে, আপনি যে অক্ষগুলি সংশোধন করতে চান তাplt.gca() দেয় না এবং তাই plt.xticks, যা বর্তমান অক্ষগুলিতে কাজ করে, কাজ করছে না।

কোনও অবজেক্ট-ভিত্তিক পদ্ধতির ব্যবহার না করার জন্য plt.xticks, আপনি ব্যবহার করতে পারেন

plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )

দুটি avail_plotকল পরে । এটি বিশেষত সঠিক অক্ষের উপর ঘূর্ণন সেট করে।


11
অন্য একটি সহজ জিনিস: আপনি কল করার সময় আপনি plt.setpঅতিরিক্ত কীওয়ার্ড আর্গুমেন্ট হিসাবে নির্দিষ্ট করে একাধিক পরামিতি সেট করতে পারেন। horizontalalignmentযখন আপনি টিক লেবেল ঘোরাতে kwarg বিশেষভাবে উপকারী হল:plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70, horizontalalignment='right' )
8one6

32
এটি পাইপ্লট এবং অবজেক্ট-ভিত্তিক পদ্ধতির সাথে মিশ্রিত হওয়ায় আমি এই সমাধানটি পছন্দ করি না। আপনি ax.tick_params(axis='x', rotation=70)যে কোনও জায়গায় কল করতে পারেন ।
টেড পেট্রো

3
@ টেডপেট্রো এখানে "মিক্সিং" বলতে আপনার অর্থ কী? plt.setpসমাধান সম্পূর্ণরূপে ভিত্তিক অবজেক্ট। pltএটিতে কিছু আছে তা যদি আপনি পছন্দ না করেন তবে তার from matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)পরিবর্তে ব্যবহার করুন।
ImportanceOfBeingEnnest

@ImportanceOfBeingErnest কোডের প্রথম লাইনটি পাইপ্লট ব্যবহার করে plt.xticks। ডকুমেন্টেশন নিজেই শৈলীর মিশ্রণ না বলে। plt.setpআরও ভার্জোজ তবে সাধারণ বস্তু-কেন্দ্রিক স্টাইলটি নয়। আপনার উত্তর অবশ্যই এখানে সেরা। মূলত, একটি ফাংশন সহ যে কোনও কিছুই বস্তু-ভিত্তিক নয়। আপনি আমদানি করেন setpবা না করেন তা বিবেচ্য নয়।
টেড পেট্রো

প্রশ্নের কোডের বেশিরভাগ অংশ পাইপলট ব্যবহার করে yticks, এবং avail_plot
কোডটির

113

সমাধান ম্যাটপ্ল্লোব 2.1+ এর জন্য কাজ করে

একটি অক্ষ পদ্ধতি রয়েছে tick_paramsযা টিক বৈশিষ্ট্যগুলি পরিবর্তন করতে পারে। এটি অক্ষ অক্ষ হিসাবেও বিদ্যমানset_tick_params

ax.tick_params(axis='x', rotation=45)

অথবা

ax.xaxis.set_tick_params(rotation=45)

পার্শ্ব নোট হিসাবে, বর্তমান সমাধান কমান্ডটি ব্যবহার করে অবজেক্ট-ভিত্তিক ইন্টারফেসের সাথে স্টেটফুল ইন্টারফেস (পাইপলট ব্যবহার করে) মিশ্রিত করে plt.xticks(rotation=70)। যেহেতু প্রশ্নের কোডটি অবজেক্ট-ভিত্তিক পদ্ধতির ব্যবহার করে, তাই এই পদ্ধতির সর্বত্র স্থির থাকা ভাল। সমাধানটি একটি ভাল সুস্পষ্ট সমাধান দেয়plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )


সমস্ত প্লটের জন্য ডিফল্ট রোটেশন পরিবর্তন করা সম্ভব? আমি মনে করি আমার তৈরি প্রতিটি প্লটটিতে এটি পরিবর্তন করা দরকার।
চৌগ

42

একটি সহজ সমাধান যা টিক্লেবগুলিতে লুপিং এড়ায় তা কেবল ব্যবহার করা

fig.autofmt_xdate()

এই কমান্ডটি স্বয়ংক্রিয়ভাবে xaxis লেবেলগুলি ঘোরান এবং তাদের অবস্থান সামঞ্জস্য করে। ডিফল্ট মানগুলি একটি ঘূর্ণন কোণ 30 ° এবং অনুভূমিক প্রান্তিককরণ "ডান" হয়। তবে তাদের ফাংশন কলে পরিবর্তন করা যেতে পারে

fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right')

অতিরিক্ত bottomযুক্তিটি সেটিংসের সমতুল্য plt.subplots_adjust(bottom=bottom), যা ঘোরানো টিক্যালবেলগুলি হোস্ট করার জন্য নীচের অক্ষগুলির প্যাডিংকে আরও বড় মান নির্ধারণ করতে দেয়।

সুতরাং মূলত এখানে আপনার সমস্ত সেটিংস একটি একক কমান্ডে একটি সুন্দর তারিখ অক্ষ থাকতে হবে।

ম্যাটপ্ল্লিটিব পৃষ্ঠায় একটি ভাল উদাহরণ পাওয়া যাবে।


দুর্দান্ত উত্তর! ধন্যবাদ!
আব্রামোদজ

আপনি কি এই ফাংশনটির মাধ্যমে 'রোটেশন_মোড' পরামিতিটি নিয়ন্ত্রণ করতে পারবেন?
থিওরিএক্স

1
@ থিওরিএক্স নং আপনার যদি রোটেশন_মোডের প্রয়োজন হয়, আপনাকে হয় plt.setpপদ্ধতির ব্যবহার করতে হবে, বা টিকগুলি লুপ করতে হবে (যা মূলত একই)।
ImportanceOfBeing

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

@ Hamভাম সঠিক এটি সাধারণভাবে সবচেয়ে সাধারণ ক্ষেত্রে অন্যান্য সমস্ত সমাধানের শর্টকাট।
ImportanceOfBeingEnnest

18

প্রয়োগ করার horizontalalignmentএবং rotationপ্রতিটি টিক লেবেলের অন্য উপায় আপনি forযে টিক লেবেলগুলি পরিবর্তন করতে চান তার উপর একটি লুপ করছে :

import numpy as np
import matplotlib.pyplot as plt
import datetime as dt

now = dt.datetime.now()
hours = [now + dt.timedelta(minutes=x) for x in range(0,24*60,10)]
days = [now + dt.timedelta(days=x) for x in np.arange(0,30,1/4.)]
hours_value = np.random.random(len(hours))
days_value = np.random.random(len(days))

fig, axs = plt.subplots(2)
fig.subplots_adjust(hspace=0.75)
axs[0].plot(hours,hours_value)
axs[1].plot(days,days_value)

for label in axs[0].get_xmajorticklabels() + axs[1].get_xmajorticklabels():
    label.set_rotation(30)
    label.set_horizontalalignment("right")

এখানে চিত্র বর্ণনা লিখুন

আপনি যদি বড় এবং ছোটখাটো টিক্সগুলির অবস্থান নিয়ন্ত্রণ করতে চান তবে এখানে একটি উদাহরণ রয়েছে:

import numpy as np
import matplotlib.pyplot as plt
import datetime as dt

fig, axs = plt.subplots(2)
fig.subplots_adjust(hspace=0.75)
now = dt.datetime.now()
hours = [now + dt.timedelta(minutes=x) for x in range(0,24*60,10)]
days = [now + dt.timedelta(days=x) for x in np.arange(0,30,1/4.)]

axs[0].plot(hours,np.random.random(len(hours)))
x_major_lct = mpl.dates.AutoDateLocator(minticks=2,maxticks=10, interval_multiples=True)
x_minor_lct = matplotlib.dates.HourLocator(byhour = range(0,25,1))
x_fmt = matplotlib.dates.AutoDateFormatter(x_major_lct)
axs[0].xaxis.set_major_locator(x_major_lct)
axs[0].xaxis.set_minor_locator(x_minor_lct)
axs[0].xaxis.set_major_formatter(x_fmt)
axs[0].set_xlabel("minor ticks set to every hour, major ticks start with 00:00")

axs[1].plot(days,np.random.random(len(days)))
x_major_lct = mpl.dates.AutoDateLocator(minticks=2,maxticks=10, interval_multiples=True)
x_minor_lct = matplotlib.dates.DayLocator(bymonthday = range(0,32,1))
x_fmt = matplotlib.dates.AutoDateFormatter(x_major_lct)
axs[1].xaxis.set_major_locator(x_major_lct)
axs[1].xaxis.set_minor_locator(x_minor_lct)
axs[1].xaxis.set_major_formatter(x_fmt)
axs[1].set_xlabel("minor ticks set to every day, major ticks show first day of month")
for label in axs[0].get_xmajorticklabels() + axs[1].get_xmajorticklabels():
    label.set_rotation(30)
    label.set_horizontalalignment("right")

এখানে চিত্র বর্ণনা লিখুন


1
এটি আমার জন্য ম্যাটপ্ল্লোব v1.5.1 এ কাজ করেছে (আমি ম্যাটপ্ল্লোলিবের উত্তরাধিকার সংস্করণে আটকেছি, কেন জিজ্ঞাসা করবেন না)
এডি

আমি কেবল পাইথন ৩..6 এবং ম্যাটপ্ল্লিটিব ভি ২.২.২ দিয়ে পরীক্ষা করেছি এবং এটিও কার্যকর হয়।
পাবলো রেয়েস

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