2015-10-29 8 views
5

निकालें मैंने कुछ समय व्यर्थ रूप से मेरे प्रश्न का उत्तर खोजने में बिताया है, इसलिए मुझे लगता है कि एक नया प्रश्न क्रम में है। इस भूखंड पर विचार करें:अक्ष स्केल

![enter image description here

अक्ष लेबल वैज्ञानिक संकेतन का उपयोग करें। वाई-अक्ष पर, सब ठीक है। हालांकि, मैंने स्केलिंग कारक से छुटकारा पाने की कोशिश की है और पाइथन को निचले-दाएं कोने में जोड़ा है। मैं या तो इस कारक को पूरी तरह से हटा देना चाहता हूं और बस अक्ष शीर्षक में इकाइयों द्वारा इसे इंगित करना चाहता हूं या इसे प्रत्येक टिक लेबल में गुणा करना चाहता हूं। सब कुछ इस बदसूरत 1e14 से बेहतर लगेगा।

import numpy as np data_a = np.loadtxt('exercise_2a.txt') 

import matplotlib as mpl 
font = {'family' : 'serif', 
     'size' : 12} 
mpl.rc('font', **font) 

import matplotlib.pyplot as plt 
fig = plt.figure() 
subplot = fig.add_subplot(1,1,1) 

subplot.plot(data_a[:,0], data_a[:,1], label='$T(t)$', linewidth=2) 

subplot.set_yscale('log')    
subplot.set_xlabel("$t[10^{14}s]$",fontsize=14) 
subplot.set_ylabel("$T\,[K]$",fontsize=14) 
plt.xlim(right=max(data_a [:,0])) 
plt.legend(loc='upper right') 

plt.savefig('T(t).pdf', bbox_inches='tight') 

अपडेट::

कोड यह मेरी स्क्रिप्ट में scientificNotation के शामिल विल के कार्यान्वयन, साजिश अब लग रहा है

तरह

enter image description here

बहुत अच्छे अगर आप मुझसे पूछें।

import numpy as np 
data = np.loadtxt('file.txt') 

import matplotlib as mpl 
font = {'family' : 'serif', 
     'size' : 16} 
mpl.rc('font', **font) 

import matplotlib.pyplot as plt 
fig = plt.figure() 
subplot = fig.add_subplot(1,1,1) 

subplot.plot(data[:,0], data[:,1], label='$T(t)$', linewidth=2) 

subplot.set_yscale('log') 
subplot.set_xlabel("$t[s]$",fontsize=20) 
subplot.set_ylabel("$T\,[K]$",fontsize=20) 
plt.xlim(right=max(data [:,0])) 
plt.legend(loc='upper right') 

def scientificNotation(value): 
    if value == 0: 
     return '0' 
    else: 
     e = np.log10(np.abs(value)) 
     m = np.sign(value) * 10 ** (e - int(e)) 
     return r'${:.0f} \cdot 10^{{{:d}}}$'.format(m, int(e)) 

formatter = mpl.ticker.FuncFormatter(lambda x, p: scientificNotation(x)) 
plt.gca().xaxis.set_major_formatter(formatter) 


plt.savefig('T(t).pdf', bbox_inches='tight', transparent=True) 

उत्तर

5

बस 1e14 द्वारा एक्स-मूल्यों को विभाजित:: यहाँ पूरा कोड किसी को भी इसके बारे में कुछ हिस्सा अपनाने के लिए इच्छुक के लिए है

subplot.plot(data_a[:,0]/1e14, data_a[:,1], label='$T(t)$', linewidth=2) 

आप प्रत्येक व्यक्ति टिक करने के लिए लेबल जोड़ना चाहते हैं, तो आप टॉम के जवाब की तरह, custom formatter प्रदान करना होगा।

आप इसे अपने y- अक्ष पर टिक के रूप में के रूप में अच्छा तरह देखने के लिए चाहते हैं, आप LaTeX के साथ स्वरूपित करने के लिए एक समारोह प्रदान कर सकता है:

def scientificNotation(value): 
    if value == 0: 
     return '0' 
    else: 
     e = np.log10(np.abs(value)) 
     m = np.sign(value) * 10 ** (e - int(e)) 
     return r'${:.0f} \times 10^{{{:d}}}$'.format(m, int(e)) 

# x is the tick value; p is the position on the axes. 
formatter = mpl.ticker.FuncFormatter(lambda x, p: scientificNotation(x)) 
plt.gca().xaxis.set_major_formatter(formatter) 
बेशक

, यह आपके x- अक्ष को अस्त-व्यस्त हो जाएगा थोड़ा सा, तो आप उन्हें कोण पर प्रदर्शित करने की आवश्यकता समाप्त कर सकते हैं, उदाहरण के लिए।

+0

टिप के लिए धन्यवाद। मैंने संक्षेप में पहले कोशिश की और सोचा कि यह काम नहीं करता है, क्योंकि साजिश गायब हो गई और स्केल कारक बना रहा। मैंने कल ही पाइथन का उपयोग करना शुरू किया, इसलिए मुझे लगता है कि यह तब से कई वाक्यविन्यास गलतियों में से एक था। लेकिन अब जब आप इसे भी लाए हैं, तो मैंने फिर से जांच की और महसूस किया कि यह पहली बार गलत हो गया था क्योंकि मैं 'put.xlim' में rescaling को भी जोड़ना भूल गया था, जैसा कि 'plt.xlim में है (दाएं = अधिकतम (data_a [:, 0])/1e14) '। – Casimir

+0

क्या आप हर टिक लेबल में कारक प्रकट करने के तरीके के बारे में भी जानते हैं? धुरी लेबल की परिमाण के क्रम में परिवर्तन होने पर इसका मतलब बहुत कम हो जाएगा। – Casimir

+0

@Casimir: हाँ, आपको 'फॉर्मेटर' सेट करने की आवश्यकता है। मेरा जवाब देखें – tom

2

विल Vousden से अच्छा जवाब देने के लिए इसके अलावा, आप सेट कर सकते हैं क्या आप के साथ अपने टिक में लिखें:

plt.xticks(range(6), range(6)) 

पहले range(6) स्थान है और दूसरा लेबल है।

3

आप ticker मॉड्यूल के साथ टिक फॉर्मेटर भी बदल सकते हैं।

import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 

fig,ax = plt.subplots() 
ax.semilogy(np.linspace(0,5e14,50),np.logspace(3,7,50),'b-') 
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.0e')) 

enter image description here

इसके अलावा इस हल करने के तरीकों के लिए अच्छे विचार के बहुत सारे के साथ जवाब here देखें:

एक उदाहरण एक FormatStrFormatter उपयोग करने के लिए किया जाएगा।

+0

यह अच्छा है लेकिन 'y' लेबलों की तरह 'x' लेबल मुद्रित करने का कोई तरीका है, यानी' 4 x + 14' के बजाय '4 x 10^14'? – Casimir

+0

हाँ, मुझे लगता है कि आपने देखा है कि @ विलव्सडेन का जवाब पहले से ही करता है – tom