অজগর matplotlib অক্ষ অক্ষকে ঘোরান


313

এক্স অক্ষটিতে লেখাটি কীভাবে ঘোরানো যায় তা আমি বুঝতে পারি না। এটি একটি সময়ের স্ট্যাম্প, যাতে নমুনাগুলির সংখ্যা বাড়ার সাথে সাথে তারা ওভারল্যাপ না করা অবধি আরও কাছাকাছি চলে যায়। আমি 90 ডিগ্রিটি পাঠ্যটি ঘোরানো চাই যাতে নমুনাগুলি একত্রে আরও কাছে যায়, সেগুলি ওভারল্যাপিং হয় না।

নীচে আমার কাছে যা আছে, এটি ব্যতিক্রমের সাথে ঠিকঠাক কাজ করে যে এক্স অক্ষের পাঠ্যটি কীভাবে ঘোরানো যায় তা আমি বুঝতে পারি না।

import sys

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import datetime

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 8}

matplotlib.rc('font', **font)

values = open('stats.csv', 'r').readlines()

time = [datetime.datetime.fromtimestamp(float(i.split(',')[0].strip())) for i in values[1:]]
delay = [float(i.split(',')[1].strip()) for i in values[1:]]

plt.plot(time, delay)
plt.grid(b='on')

plt.savefig('test.png')

3
(অনুভূমিক প্রান্তিককরণ) দিয়ে ঘোরানো লেবেলগুলি সারিবদ্ধ করার বিষয়ে গুরুত্বপূর্ণ ha
সামগ্রীর

উত্তর:


510

এটি আমার পক্ষে কাজ করে:

plt.xticks(rotation=90)

8
যদি অন্য কেউ এমপিএলডি 3 ব্যবহার করে এবং এই সমাধানগুলির কোনওটিই কাজ না করে হতাশ। এমপিএলডি 3 এ আবর্তন সমর্থিত নয়
বিট্রি

4
এগুলি চিত্র / উইন্ডোর অভ্যন্তরে থাকার জন্য অতিরিক্ত পয়েন্ট। আমার বাইরে অর্ধেক।
গৌথির

1
ষড়যন্ত্রের পরে এই কল করুন । অর্থাত, প্রথম ax.plot(...)তারপরplt.xticks(rotation=90)
CGFoX

161

সহজ পথ

এখানে বর্ণিত হিসাবে , এখানে একটি বিদ্যমান পদ্ধতি রয়েছেmatplotlib.pyplot figure শ্রেণিতে যা স্বয়ংক্রিয়ভাবে তারিখগুলি আপনার চিত্রের জন্য যথাযথভাবে ঘোরে।

আপনি আপনার ডেটা প্লট করার পরে এটি কল করতে পারেন (যেমন ax.plot(dates,ydata):

fig.autofmt_xdate()

আপনার যদি আরও লেবেলগুলি ফর্ম্যাট করতে হয় তবে উপরের লিঙ্কটি চেকআউট করুন।

তারিখবিহীন অবজেক্টস

অনুযায়ী languitar এর মন্তব্যে, পদ্ধতি আমি জন্য প্রস্তাবিত অ DATETIME xticksসঠিকভাবে, যখন জুম ইত্যাদি যদি একটি নয় আপডেট হতে হবে datetimeআপনার x- অক্ষ তথ্য হিসাবে ব্যবহৃত বস্তু, আপনি অনুসরণ করা উচিত টমি এর উত্তর :

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

3
এটি সর্বোত্তম উপায় কারণ এটি সংক্ষিপ্ত, এটি বিদ্যমান স্বয়ংক্রিয়ভাবে উত্পন্ন টিকগুলির উপর পরিচালিত হয় এবং এটি প্লট মার্জিনগুলিকে সামঞ্জস্য করে যাতে এটি পাঠযোগ্য। অন্যান্য পদ্ধতিগুলি টিক্সকে পৃষ্ঠাটি সরিয়ে দেয়, তাদের সামঞ্জস্য করার জন্য আরও ক্রিয়া (যেমন plt.tight_layouts ()) প্রয়োজন।
EL_DON

আপনি যদি কোনও লকেটার এবং ফর্ম্যাটর ব্যবহার করেছেন তবে পরে প্রয়োগ করা হলে "অন্যান্য" পদ্ধতিটি তাদের প্রভাবটি ভেঙে দিতে পারে।
লঙ্গুইটার

73

অনেকগুলি এখানে "সঠিক" উত্তর দেয় তবে আমি আরও একটি যুক্ত করব যেহেতু আমি মনে করি যে কয়েকটি বিবরণীর মধ্যে কিছু বিবরণ বাকি রয়েছে। ওপি 90 ডিগ্রি ঘোরার জন্য জিজ্ঞাসা করেছিল তবে আমি 45 ডিগ্রিতে পরিবর্তন করব কারণ আপনি যখন কোনও কোণ ব্যবহার করেন যা শূন্য বা 90 নয়, আপনার অনুভূমিক প্রান্তিককরণটিও পরিবর্তন করা উচিত; অন্যথায় আপনার লেবেলগুলি অফ-সেন্টার এবং কিছুটা বিভ্রান্তিকর হবে (এবং আমি অনুমান করছি যে এখানে আসা অনেক লোক 90 এর বাইরে অন্য কিছুতে কুড়াল ঘোরতে চান)।

সবচেয়ে সহজ / সর্বনিম্ন কোড

বিকল্প 1

plt.xticks(rotation=45, ha='right')

পূর্বে উল্লিখিত হিসাবে, আপনি বরং অবজেক্ট ওরিয়েন্টেড পন্থা অবলম্বন করতে চাইলে এটি কাম্য হবে না।

বিকল্প 2

আর একটি দ্রুত উপায় (এটি তারিখের অবজেক্টগুলির জন্য লক্ষ্যযুক্ত তবে কোনও লেবেলে কাজ করে বলে মনে হচ্ছে; সন্দেহ এটির প্রস্তাবিত যদিও):

fig.autofmt_xdate(rotation=45)

fig আপনি সাধারণত থেকে পাবেন:

  • fig = plt.figure()
  • fig, ax = plt.subplots()
  • fig = ax.figure

অবজেক্ট-ওরিয়েন্টেড / ডিলিং সরাসরি সাথে ax

বিকল্প 3 এ

আপনার যদি লেবেলের তালিকা থাকে:

labels = ['One', 'Two', 'Three']
ax.set_xticklabels(labels, rotation=45, ha='right')

বিকল্প 3 বি

আপনি যদি বর্তমান প্লট থেকে লেবেলের তালিকা পেতে চান:

# Unfortunately you need to draw your figure first to assign the labels,
# otherwise get_xticklabels() will return empty strings.
plt.draw()
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')

বিকল্প 4

উপরের মতো, তবে পরিবর্তে ম্যানুয়ালি লুপ করুন।

for label in ax.get_xticklabels():
  label.set_rotation(45)
  label.set_ha('right')

বিকল্প 5

আমরা এখনও এখানে pyplot(যেমন plt) ব্যবহার করি তবে এটি অবজেক্ট-ওরিয়েন্টেড কারণ আমরা একটি নির্দিষ্ট axঅবজেক্টের সম্পত্তি পরিবর্তন করছি ।

plt.setp(ax.get_xticklabels(), rotation=45, ha='right')

বিকল্প 6

এই বিকল্পটি সহজ, কিন্তু আফাইক আপনি এইভাবে লেবেল অনুভূমিক সারিবদ্ধ সেট করতে পারবেন না যাতে আপনার কোণটি 90 না হলে অন্য বিকল্পটি আরও ভাল হতে পারে।

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

সম্পাদনা করুন: এই সঠিক "বাগ" নিয়ে আলোচনা আছে এবং এর জন্য একটি সমাধানের সম্ভাব্যতা রয়েছে v3.2.0: https://github.com/matplotlib/matplotlib/issues/13774


65

Pyplot.setp ব্যবহার করে দেখুন। আমি মনে করি আপনি এরকম কিছু করতে পারেন:

x = range(len(time))
plt.xticks(x,  time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)

2
Traceback (most recent call last): File "plotter.py", line 23, in <module> plt.setp(time, rotation=90) File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 183, in setp ret = _setp(*args, **kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", line 1199, in setp func = getattr(o, funcName) AttributeError: 'datetime.datetime' object has no attribute 'set_rotation'
টিএমসি

আমি মনে করি আমি এক ধাপ আগে মিস করেছি। সম্পাদিত উদাহরণ সাহায্য করে? যদিও আমি ম্যাটপ্ল্লিটিব বিশেষজ্ঞের থেকে অনেক দূরে আছি তবে এর চেয়ে ভাল উপায় আর হতে পারে।
opiethehokie

1
এটি মোটেও কাজ করে না বলে মনে হচ্ছে- চিত্রটি (আমার মেশিনে) পুরোপুরি গোলযোগ পেয়েছে। আউটপুট চিত্রের পুরো কালো রেখা ... প্রায় বার কোডের মতো দেখাচ্ছে looks এটি খুব বিজোড়
টিএমসি

এটি ম্যাটপ্ললিবের কোন সংস্করণ ছিল? 1.2.0 setp(subplot(111).get_xticklabels(), rotation=90)দিয়ে, Qt4Agg ব্যাকএন্ডের সাথে দুর্দান্ত কাজ করে। আমার ক্ষেত্রে এটি রিসেট হয়ে যায় plt.hist(), তাই আমি এটির পরে ফোন দিই, যদিও plt.plot()এটি পুনরায় সেট করা হয় না, তাই আপনার ঠিক থাকা উচিত।
ড্রিভিকো

1
@tmC এমপিএল ২.০.০ এর সাহায্যে আমি আপনার কোডটি (কিছু ডামি ডেটা সহ) অনুলিপি করেছি, locs, labels = plt.xticks() plt.setp(labels, rotation=90)ঠিক আগে যুক্ত করেছি plt.plot(time, delay)এবং এটি দুর্দান্ত কাজ করেছে।
drevicko

54

থেকে প্রস্তুত

plt.xticks(rotation=90)

এটিও সম্ভব:

plt.xticks(rotation='vertical')

এই থ্রেডের সেরা উত্তর
ওডেড বেন ডভ ২

এটি কাজ করে, তবে প্লটের উচ্চতাতে কিছু সমস্যা আছে
রবার্তো মারজোচিচি

plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
রবার্তো মার্জোচি

49

আমি একটি অনুরূপ উদাহরণ নিয়ে এসেছি। আবার, ঘূর্ণন মূলশব্দটি হ'ল .. ভাল, এটি কী।

from pylab import *
fig = figure()
ax = fig.add_subplot(111)
ax.bar( [0,1,2], [1,3,5] )
ax.set_xticks( [ 0.5, 1.5, 2.5 ] )
ax.set_xticklabels( ['tom','dick','harry'], rotation=45 ) ;

দেখে মনে হচ্ছে এটি কাজ করে তবে এটি datetime
মহাকাব্যকাল

32

আমার উত্তর cjohnson318 এর উত্তর দ্বারা অনুপ্রাণিত, কিন্তু আমি হার্ডবেডযুক্ত লেবেলের তালিকা সরবরাহ করতে চাইনি; আমি বিদ্যমান লেবেলগুলি ঘোরানো চেয়েছিলাম:

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

2
এটি আর কাজ করবে বলে মনে হয় না। এর কোনও প্রভাব নেই।
zbyszek

31

যদি ব্যবহার করা হয় plt:

plt.xticks(rotation=90)

প্লটের জন্য পান্ডা বা সমুদ্র সৈকত ব্যবহারের ক্ষেত্রে প্লটের axজন্য অক্ষ হিসাবে ধরে নেওয়া :

ax.set_xticklabels(ax.get_xticklabels(), rotation=90)

উপরোক্ত কাজ করার আরেকটি উপায়:

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

এই সমস্ত পদ্ধতি ইতিমধ্যে অন্যান্য উত্তরে প্রদর্শিত হয়েছে। এই উত্তরটি এখানে কী যুক্ত করছে?
ImportanceOfBeingEnnest

@ ইমপোর্টান্সঅফবিজিং আর্নেস্ট এটি ষড়যন্ত্রের জন্য যারা সরাসরি পান্ডা বা সমুদ্র সৈকত ব্যবহার করে এবং ম্যাটপ্ল্লোব নয় তাদের সহায়তা করা meant
মানাওয়ালান গাজাপাতি

for tick in ax.get_xticklabels(): tick.set_rotation(45)আমার জন্য কৌশলটি।
এপি

30

আপনি যদি axes অবজেক্টে রোটেশন প্রয়োগ করতে চান তবে সবচেয়ে সহজ উপায়টি ব্যবহার করা হচ্ছে tick_params। উদাহরণ স্বরূপ.

ax.tick_params(axis='x', labelrotation=90)

Matplotlib ডকুমেন্টেশন রেফারেন্স এখানে

এটি যখন আপনার কাছে ফিরে এসে অক্ষগুলির একটি অ্যারে থাকে তখন plt.subplotsএটি কার্যকর হয় এবং এটি ব্যবহারের চেয়ে আরও সুবিধাজনক set_xticksকারণ সেই ক্ষেত্রে আপনাকে টিক লেবেলগুলিও সেট করতে হবে এবং আরও বেশি সুবিধাজনক যে টিকগুলি দিয়ে পুনরাবৃত্তি হবে (স্পষ্ট কারণে)


1
এটি ছাড়াও, এই দ্রবণটি পান্ডাস ডেটাফ্রেমের প্লট ফাংশনেও কাজ করে যেহেতু এটি অক্ষ অক্ষকেও ফিরে আসে। এখানে চেক করুন । বেশ কার্যকর কাজ। pd_dataframe.plot().tick_params(axis='x', labelrotation=90)
metinsenturk

কেবল এটির সাথে ইস্যুটি হ'ল আমি বুঝতে পারি না যে এরকম কিছু ব্যবহার করা হলে কীভাবে অনুভূমিকভাবে সঠিকভাবে লেবেলগুলি সারিবদ্ধ করবেন labelrotation=30
getup8


3

এটি আপনি কী ষড়যন্ত্র করছেন তার উপর নির্ভর করবে।

import matplotlib.pyplot as plt

 x=['long_text_for_a_label_a',
    'long_text_for_a_label_b',
    'long_text_for_a_label_c']
y=[1,2,3]
myplot = plt.plot(x,y)
for item in myplot.axes.get_xticklabels():
    item.set_rotation(90)

পান্ডা এবং সমুদ্র সৈকতের জন্য যা আপনাকে অক্ষের অবজেক্ট দেয়:

df = pd.DataFrame(x,y)
#pandas
myplot = df.plot.bar()
#seaborn 
myplotsns =sns.barplot(y='0',  x=df.index, data=df)
# you can get xticklabels without .axes cause the object are already a 
# isntance of it
for item in myplot.get_xticklabels():
    item.set_rotation(90)

আপনার যদি লেবেলগুলি ঘোরানোর দরকার হয় তবে আপনার ফন্টের আকারও পরিবর্তন হতে পারে, আপনি এটি করতে ব্যবহার করতে পারেন font_scale=1.0


2

এক্স-অক্ষের লেবেলটি 90 ডিগ্রীতে ঘোরানোর জন্য

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

আপনার উত্তরটি কত সংক্ষিপ্ত তা আমি পছন্দ করি তবে আপনি যা পোস্ট করেছেন তা বৈধ পাইথন কোড নয়। এটি কীভাবে বৈধ অজগর কোড হিসাবে ব্যাখ্যা করবেন তা আমার কাছে পরিষ্কার নয়।
ডেভ সি

1

সবচেয়ে সহজ সমাধানটি হ'ল:

plt.xticks(rotation=XX)

কিন্তু

# Tweak spacing to prevent clipping of tick-labels
plt.subplots_adjust(bottom=X.XX)

যেমন তারিখগুলির জন্য আমি ঘূর্ণন = 45 এবং নীচে = 0.20 ব্যবহার করেছি তবে আপনি আপনার ডেটার জন্য কিছু পরীক্ষা করতে পারেন

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