अजगर 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
मामले में कोई और mpld3 का उपयोग कर रहा है, और काम करने वाले इन समाधानों में से किसी के बारे में निराश नहीं है। MPld3 में रोटेशन समर्थित नहीं है
बीट्री

4
इन्हें फिगर / विंडो के अंदर बने रहने के लिए अतिरिक्त अंक। मेरा आधा बाहर है।
गॉथियर

1
साजिश रचने के बाद यह कॉल करें । Ie, पहले ax.plot(...)तोplt.xticks(rotation=90)
CGFoX

161

आसान तरीका

जैसा कि यहां बताया गया है , एक मौजूदा तरीका हैmatplotlib.pyplot figure वर्ग जो स्वचालित रूप से आपके लिए उचित तारीखों को घुमाता है।

अपना डेटा प्लॉट करने के बाद आप इसे कॉल कर सकते हैं (यानी ax.plot(dates,ydata):

fig.autofmt_xdate()

यदि आपको आगे लेबल को प्रारूपित करने की आवश्यकता है, तो उपरोक्त लिंक की जांच करें।

गैर-डेटाइम ऑब्जेक्ट्स

प्रति टिप्पणी के अनुसार, गैर- डाइमटाइम के लिए मैंने जो तरीका सुझाया xticksहै वह ज़ूम करते समय सही ढंग से अपडेट नहीं होगा, अगर यह datetimeआपके एक्स-एक्सिस डेटा के रूप में उपयोग की जाने वाली वस्तु नहीं है , तो आपको टॉमी के उत्तर का पालन करना चाहिए :

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(as plt) का उपयोग करते हैं लेकिन यह ऑब्जेक्ट ओरिएंटेड है क्योंकि हम एक विशिष्ट axऑब्जेक्ट की संपत्ति को बदल रहे हैं ।

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

विकल्प 6

यह विकल्प सरल है, लेकिन AFAIK आप इस तरह से क्षैतिज संरेखित लेबल सेट नहीं कर सकते हैं, इसलिए यदि आपका कोण 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'
टीएमसी

मुझे लगता है कि मैं एक कदम पहले याद किया। क्या संपादित उदाहरण मदद करता है? मैं एक matplotlib विशेषज्ञ से बहुत दूर हूं, हालांकि, एक बेहतर तरीका हो सकता है।
ओपिथेहोकी

1
यह बिल्कुल काम नहीं करता है- छवि (मेरी मशीन पर) पूरी तरह से गड़बड़ हो जाती है। आउटपुट छवि पर काली रेखाएँ ... लगभग एक बार कोड की तरह दिखता है। यह बहुत अजीब है।
tMC

माटप्लोटलिब का कौन सा संस्करण था? 1.2.0 के setp(subplot(111).get_xticklabels(), rotation=90)साथ, Qt4Agg बैकएंड के साथ ठीक काम करता है। मेरे मामले में, यह रीसेट हो जाता है plt.hist(), इसलिए मैं इसके बाद कॉल करता हूं, हालांकि plt.plot()इसे रीसेट नहीं किया जाता है, इसलिए आपको ठीक होना चाहिए।
drevicko

1
@tMC 1.2.0 mpl के साथ, मैंने आपके कोड की नकल की (कुछ डमी डेटा के साथ), locs, labels = plt.xticks() plt.setp(labels, rotation=90)बस कुछ समय पहले जोड़ा plt.plot(time, delay)और यह ठीक काम किया।
drevicko


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)

उन सभी तरीकों को पहले से ही अन्य उत्तरों में दिखाया गया है। यह उत्तर यहाँ क्या जोड़ रहा है?
ImportanceOfBeingErnest

@ImportanceOfBeingErnest यह उन लोगों की मदद करने के लिए है जो सीधे पंडों या समुद्री जीवों का उपयोग करते हैं, और सीधे साजिश रचने के लिए, मैटलपोटलिब नहीं।
मानवलन गजपति

for tick in ax.get_xticklabels(): tick.set_rotation(45)मेरे लिए चाल चली।
एपी

30

यदि आप एक्सिस ऑब्जेक्ट पर रोटेशन लागू करना चाहते हैं, तो सबसे आसान तरीका उपयोग कर रहा है tick_params। उदाहरण के लिए।

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

यहाँ Matplotlib प्रलेखन संदर्भ ।

यह तब उपयोगी होता है जब आपके पास अक्षों की एक सरणी होती है plt.subplots, जैसे कि यह वापस आ गया है , और यह उपयोग करने की तुलना में अधिक सुविधाजनक है set_xticksक्योंकि उस स्थिति में आपको टिक लेबल भी सेट करने की आवश्यकता है, और यह भी अधिक सुविधाजनक है कि जो टिकों पर दिखाई देते हैं (स्पष्ट कारणों के लिए)


1
इसके अलावा, यह समाधान पंडों डेटाफ्रेम के प्लॉट फ़ंक्शन में भी काम करता है क्योंकि यह एक्सिस ऑब्जेक्ट को भी लौटाता है। चेक यहाँ । काफी आसान कार्य। pd_dataframe.plot().tick_params(axis='x', labelrotation=90)
15

केवल इसके साथ समस्या यह है कि मैं यह पता नहीं लगा सकता कि कैसे कुछ का उपयोग करके क्षैतिज रूप से लेबल को सही ढंग से संरेखित करें labelrotation=30
गेटअप 8


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 का उपयोग किया है लेकिन आप अपने डेटा के लिए कुछ परीक्षण कर सकते हैं

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