python 2.7 - एकाधिक उप-बिंदुओं के लिए निश्चित घातांक और महत्वपूर्ण अंकों के साथ वैज्ञानिक संकेतन सेट करें



python-2.7 matplotlib (1)

आप matplotlib.ticker.ScalarFormatter को subclass कर सकते हैं और आप की तरह (इस मामले में -4 ) नंबर के लिए orderOfMagnitude विशेषता को ठीक कर सकते हैं।
उसी तरह आप उपयोग किए जाने वाले प्रारूप को ठीक कर सकते हैं।

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

class OOMFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, order=0, fformat="%1.1f", offset=True, mathText=True):
        self.oom = order
        self.fformat = fformat
        matplotlib.ticker.ScalarFormatter.__init__(self,useOffset=offset,useMathText=mathText)
    def _set_orderOfMagnitude(self, nothing):
        self.orderOfMagnitude = self.oom
    def _set_format(self, vmin, vmax):
        self.format = self.fformat
        if self._useMathText:
            self.format = '$%s$' % matplotlib.ticker._mathdefault(self.format)



x = np.linspace(1,9,9)
y1 = x*10**(-4)
y2 = x*10**(-3)

fig, ax = plt.subplots(2,1,sharex=True)

ax[0].plot(x,y1)
ax[1].plot(x,y2)

for axe in ax:
    axe.yaxis.set_major_formatter(OOMFormatter(-4, "%1.1f"))
    axe.ticklabel_format(axis='y', style='sci', scilimits=(-4,-4))

plt.show()

हालांकि यह पहली नजर में जटिल लग सकता है, लेकिन वास्तव में यह एकमात्र ऐसा काम है जो निजी विधियों _set_orderOfMagnitude और _set_format को अधिलेखित करता है और इस तरह उन्हें पृष्ठभूमि में कुछ परिष्कृत सामान करने से रोकता है जो हम नहीं चाहते हैं। क्योंकि अंत में, हम सभी की जरूरत है कि, आंतरिक रूप से क्या होता है से स्वतंत्र है, self.orderOfMagnitude हमेशा -4 और "%1.1f" हमेशा "%1.1f"

मैं अक्षों को डेटा के दो अलग-अलग सेटों की वैज्ञानिक संकेतन को ठीक करने की कोशिश कर रहा हूं, जहां एक [1-9] एक्स 3 है और दूसरा [1-9] एक्स 3 है। मैं दोनों कुल्हाड़ियों को 10 ^ -4 होना चाहता हूं और दशमलव के बाद एक अंक होगा (उदाहरण% .1e)। यहां एक सरल संस्करण है जिसे मैंने साथ खेलने की कोशिश की है: मैं कुल्हाड़ियों पर संख्याओं को कम से कम 1 होना चाहूंगा और मैं चाहता हूं कि दोनों शक्तियां समान हों।

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1,9,9)
y1 = x*10**(-4)
y2 = x*10**(-3)

fig, ax = plt.subplots(2,1,sharex=True)

ax[0].plot(x,y1)
ax[0].ticklabel_format(axis='y', style='sci', scilimits=(-4,-4))
ax[0].yaxis.major.formatter._useMathText = True
ax[1].plot(x,y2)
ax[1].ticklabel_format(axis='y', style='sci', scilimits=(-4,-4))
ax[1].yaxis.major.formatter._useMathText = True

plt.show()





axes