2012-06-29 9 views
79

में दिनांक टिक और रोटेशन मुझे मैटलप्लिब में घुमाए जाने की मेरी तिथि टिक प्राप्त करने का प्रयास करने में कोई समस्या है। एक छोटा सा नमूना कार्यक्रम नीचे है। अगर मैं अंत में टिकों को घुमाने की कोशिश करता हूं, तो टिक घूर्णन नहीं होती हैं। अगर मैं टिप्पणी 'क्रैश' के तहत दिखाए गए टिकों को घुमाने की कोशिश करता हूं, तो matplot lib crashes।matplotlib

यह केवल तभी होता है जब एक्स-मान तिथियां हों। यदि मैं परिवर्तनीय dates को पर avail_plot पर कॉल में परिवर्तनीय dates को प्रतिस्थापित करता हूं, तो कॉल 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() 
+0

x- अक्ष पर तारीखों के साथ एक साजिश बना रहा है के साथ एक अच्छा स्पष्ट समाधान देता है है इस तरह के एक आम कार्य - शर्म की बात है वहाँ और अधिक पूरा नहीं कर रहे हैं वहाँ उदाहरण हैं। – alexw

+0

मुझे आश्चर्य है कि यह https://stackoverflow.com/questions/10998621/rotate-axis-text-in-python-matplotlib – ImportanceOfBeingErnest

उत्तर

143

आप एक गैर वस्तु उन्मुख दृष्टिकोण पसंद करते हैं, सही से पहले दो avail_plot कॉल करने के लिए plt.xticks (रोटेशन = 70) ले जाते हैं, जैसे

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 कॉल का उपयोग कर सकते हैं। यह विशेष अक्षों पर विशेष रूप से रोटेशन सेट करता है।

+8

का डुप्लिकेट नहीं है एक और आसान बात: जब आप 'plt.setp' कहते हैं आप उन्हें अतिरिक्त कीवर्ड तर्क के रूप में निर्दिष्ट करके एकाधिक पैरामीटर सेट कर सकते हैं। जब आप टिक लेबल घुमाते हैं तो 'क्षैतिज संरेखण' kwarg विशेष रूप से उपयोगी होता है: 'plt.setp (axs [1] .xaxis.get_majorticklabels(), rotation = 70, क्षैतिज संरेखण = 'दाएं')' – 8one6

+2

मुझे यह समाधान पसंद नहीं है क्योंकि यह पाइपप्लॉट और ऑब्जेक्ट उन्मुख दृष्टिकोण को मिश्रित करता है। आप किसी भी स्थान पर 'ax.tick_params (axis =' x ', rotation = 70)' को कॉल कर सकते हैं। –

+1

@TedPetrou यहां "मिश्रण" से आपका क्या मतलब है? 'plt.setp' समाधान पूरी तरह ऑब्जेक्ट उन्मुख है। यदि आपको इस तथ्य को पसंद नहीं है कि इसमें कुछ 'plt' है, तो matplotlib.artist आयात setp से' का उपयोग करें; setp (ax.get_xticklabels(), रोटेशन = 9 0) इसके बजाए। – ImportanceOfBeingErnest

7

प्रत्येक टिक लेबल से 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 np.arange(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") 

enter image description here

और यहाँ एक उदाहरण है यदि आप चाहते हैं प्रमुख और मामूली टिकों के स्थान को नियंत्रित करें:

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 np.arange(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") 

enter image description here

16

एक आसान समाधान जो ticklabes से अधिक पाशन टाल बस का उपयोग करने के

fig.autofmt_xdate()

यह आदेश स्वचालित रूप से xaxis लेबल घूमता है और उनकी स्थिति को व्यवस्थित करता है। डिफ़ॉल्ट मान एक रोटेशन कोण 30 डिग्री और क्षैतिज संरेखण "दाएं" होते हैं। लेकिन वे समारोह कॉल

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

अतिरिक्त bottom तर्क plt.subplots_adjust(bottom=bottom) है, जो नीचे एक बड़ा मूल्य में पैडिंग अक्ष घुमाया ticklabels की मेजबानी के लिए सेट कर सकते हैं स्थापित करने के बराबर है में बदला जा सकता है।

तो मूल रूप से यहां आपके पास एक ही कमांड में एक अच्छी तिथि अक्ष रखने के लिए आवश्यक सभी सेटिंग्स हैं।

good example matplotlib पृष्ठ पर पाया जा सकता है।

+0

महान जवाब! धन्यवाद! – Abramodj

9

समाधान matplotlib 2.1+

एक कुल्हाड़ियों विधि tick_params कि टिक गुण बदल सकते हैं मौजूद है के लिए काम करता है। यह भी रूप में set_tick_params

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

या

ax.xaxis.set_tick_params(rotation=45) 

एक पक्ष नोट के रूप में एक धुरी विधि के रूप में मौजूद है, वर्तमान समाधान कमांड का उपयोग करके स्टेटफुल इंटरफ़ेस वस्तु उन्मुख इंटरफेस के साथ (pyplot का प्रयोग करके) मिक्स plt.xticks(rotation=70)। चूंकि प्रश्न में कोड वस्तु-उन्मुख दृष्टिकोण का उपयोग करता है, इसलिए पूरे दृष्टिकोण में रहना सर्वोत्तम होता है। समाधान plt.setp(axs[1].xaxis.get_majorticklabels(), rotation=70)

0

plt.imshow() विधि

import matplotlib.pyplot as plt 
import pandas as pd 

corr = df.corr() 
plt.imshow (corr, cmap='Blues') 
plt.xticks(range(len(corr.columns)), corr.columns, rotation=35) 
plt.yticks(range(len(corr.columns)), corr.columns) 
plt.colorbar() 
plt.show()