2016-01-25 4 views
7

मैं अन्य चीजों के साथ plt.ticklabel_format(axis='y',style='sci',scilimits=(0,3)) का उपयोग करके मैटलप्लिब में निम्नलिखित प्लॉट बना रहा हूं। यह इतनी के रूप में एक y- अक्ष पैदावार:वैज्ञानिक अक्ष के साथ प्लॉटिंग, महत्वपूर्ण आंकड़ों की संख्या बदलना

enter image description here

अब समस्या यह है कि मैं y- अक्ष [0, -2, -4, -6, -8, -12] से टिक करना चाहते हैं। मैंने scilimits के साथ खेला है लेकिन इसका कोई फायदा नहीं हुआ है।

कोई भी टिक्स को केवल एक महत्वपूर्ण आंकड़ा और कोई पिछला शून्य नहीं लगा सकता है, और आवश्यकता होने पर तैरता है? , सबसे अच्छा मैं ऊपर आ सकता है के साथ टिक के लिए एक कस्टम FuncFormatter का इस्तेमाल किया गया

import matplotlib.pyplot as plt 
import numpy as np 

t = np.arange(0.0, 10000.0, 10.) 
s = np.sin(np.pi*t)*np.exp(-t*0.0001) 

fig, ax = plt.subplots() 

ax.tick_params(axis='both', which='major') 
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,3)) 
plt.plot(t,s) 

plt.show() 
+0

क्या आप कट और पेस्टेबल कोड जोड़ सकते हैं? – atomh33ls

+1

http://stackoverflow.com/help/mcve – atomh33ls

+0

माफ़ी माफी अब – Astrid

उत्तर

1

जब मैं इस समस्या का सामना किया:

मेगावाट नीचे गयी। हालांकि, मुझे अक्ष के साथ स्केल (उदा। 1e5) प्रदर्शित करने का कोई तरीका नहीं मिला। आसान समाधान इसे टिक लेबल के साथ मैन्युअल रूप से शामिल करना था।

क्षमा करता है, तो यह पूरी तरह से इस सवाल का जवाब नहीं है, लेकिन यह मेरी समाधान इस तरह कुछ हद तक लग रहा है समस्या :)

के लिए एक अपेक्षाकृत सरल समाधान मेगावाट के रूप में पर्याप्त हो सकता है:

import matplotlib.pyplot as plt 
from matplotlib.ticker import FuncFormatter 
import numpy as np 


def tickformat(x): 
    if int(x) == float(x): 
     return str(int(x)) 
    else: 
     return str(x)   


t = np.arange(0.0, 10000.0, 10.) 
s = np.sin(np.pi*t)*np.exp(-t*0.0001) 

fig, ax = plt.subplots() 

ax.tick_params(axis='both', which='major') 
plt.plot(t,s) 

fmt = FuncFormatter(lambda x, pos: tickformat(x/1e3)) 
ax.xaxis.set_major_formatter(fmt) 

plt.xlabel('time ($s 10^3$)') 

plt.show() 

नोट उदाहरण में x -axis का उपयोग करता है!

enter image description here

बेशक, इस डेटा को फिर से स्केलिंग द्वारा और भी आसान प्राप्त किया जा सकता है। हालांकि, मुझे लगता है कि आप डेटा को छूना नहीं चाहते हैं और केवल धुरी में हेरफेर करना चाहते हैं।

+0

इसके लिए धन्यवाद, अच्छा थोड़ा कामकाज। यह बहुत अजीब बात है कि ऐसा करने का कोई अच्छा तरीका नहीं है। – Astrid

+1

मैं सहमत हूं, लेकिन शायद असली मैटलप्लिब गुरु में से एक बाद में आ जाएगा और एक सरल और व्यावहारिक समाधान प्रदान करेगा;) – kazemakase

+0

बिल्कुल, कोई उम्मीद कर सकता है :) – Astrid

0

मुझे ScalarFormatter पर मौजूद knobs के माध्यम से ऐसा करने का एक स्पष्ट तरीका नहीं दिख रहा है। कुछ इस तरह:

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.ticker as mticker 

t = np.arange(0.0, 10000.0, 10.) 
s = np.sin(np.pi*t)*np.exp(-t*0.0001) 

class EpiCycleScalarFormatter(mticker.ScalarFormatter): 
    def _set_orderOfMagnitude(self, rng): 
     # can just be super() in py3, args only needed in LPy 
     super(EpiCycleScalarFormatter, self)._set_orderOfMagnitude(rng) 
     if self.orderOfMagnitude != 0: 
      self.orderOfMagnitude -= 1 


fig, ax = plt.subplots() 

ax.tick_params(axis='both', which='major') 
ax.yaxis.set_major_formatter(EpiCycleScalarFormatter()) 
ax.xaxis.set_major_formatter(EpiCycleScalarFormatter()) 
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,3)) 
plt. 
plt.show()plot(t,s) 

enter image description here

आपकी समस्या का समाधान होगा। उप-वर्ग का नाम नोट करें, क्योंकि यह केवल मौजूदा कोड में ऐपिकल्स जोड़ रहा है (वे दिखते हैं कि वे काम करते हैं, लेकिन अधिक जटिलता जोड़ें)। यह लाइब्रेरी के निजी हिस्सों को भी छूता है जिसे हम किसी भी समय तोड़ सकते हैं।

संबंधित मुद्दे