복붙노트

[PYTHON] Python 2.7을 사용하여 matplotlib 플롯의 축에 소수점 및 과학 표기법을 표시 할 수 있습니까?

PYTHON

Python 2.7을 사용하여 matplotlib 플롯의 축에 소수점 및 과학 표기법을 표시 할 수 있습니까?

Python 2.7을 사용하는 pyqt 프로그램에서 matplotlib로 큰 숫자를 플롯하고 있습니다. y 축의 범위는 1e + 18에서 3e + 18까지입니다 (일반적으로). 각 눈금 표시가 과학 표기법으로 소수점 두 자리까지 표시되는지 확인하고 싶습니다. 예를 들어, 2e + 18과 3e + 18 사이의 값은 몇 눈금에 대해 단지 2e + 18을 읽으므로 2e + 18 대신에 2.35e + 18이됩니다. 다음은 그 문제의 예입니다.

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(0, 300, 20)
y = np.linspace(0,300, 20)
y = y*1e16
ax.plot(x,y)  
ax.get_xaxis().set_major_formatter(plt.LogFormatter(10,  labelOnlyBase=False))
ax.get_yaxis().set_major_formatter(plt.LogFormatter(10,  labelOnlyBase=False))
plt.show()

해결법

  1. ==============================

    1.LogFormatter와 달리 matplotlib.ticker.FormatStrFormatter를 사용하면 정말 쉽습니다. 다음 코드는 모든 것을 '% .2e'형식으로 레이블합니다.

    LogFormatter와 달리 matplotlib.ticker.FormatStrFormatter를 사용하면 정말 쉽습니다. 다음 코드는 모든 것을 '% .2e'형식으로 레이블합니다.

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.ticker as mtick
    
    fig = plt.figure()
    
    ax = fig.add_subplot(111)
    
    x = np.linspace(0, 300, 20)
    
    y = np.linspace(0,300, 20)
    y = y*1e16
    
    ax.plot(x,y)
    
    ax.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2e'))
    
    plt.show()
    

  2. ==============================

    2.과학적 표기법으로 멋지게 서식이 지정된 레이블을 얻으려면 MathText (라텍스)를 사용하는 ScalarFormatter의 서식 기능을 사용하여 레이블에 적용 할 수 있습니다.

    과학적 표기법으로 멋지게 서식이 지정된 레이블을 얻으려면 MathText (라텍스)를 사용하는 ScalarFormatter의 서식 기능을 사용하여 레이블에 적용 할 수 있습니다.

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.ticker as mticker
    
    fig, ax = plt.subplots()
    
    x = np.linspace(0, 300, 20)
    y = np.linspace(0,300, 20)
    y = y*1e16
    
    ax.plot(x,y)
    
    f = mticker.ScalarFormatter(useOffset=False, useMathText=True)
    g = lambda x,pos : "${}$".format(f._formatSciNotation('%1.10e' % x))
    plt.gca().yaxis.set_major_formatter(mticker.FuncFormatter(g))
    
    plt.show()
    

    이것은 많은 경우에 유용 할 수 있지만 실제로는 질문의 요구 사항을 충족시키지 못합니다. 모든 레이블에서 동일한 숫자를 사용하려면보다 사용자 정의 된 버전을 사용할 수 있습니다.

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.ticker as mticker
    
    fig, ax = plt.subplots()
    
    x = np.linspace(0, 300, 20)
    y = np.linspace(0,300, 20)
    y = y*1e16
    
    ax.plot(x,y)
    
    class MathTextSciFormatter(mticker.Formatter):
        def __init__(self, fmt="%1.2e"):
            self.fmt = fmt
        def __call__(self, x, pos=None):
            s = self.fmt % x
            decimal_point = '.'
            positive_sign = '+'
            tup = s.split('e')
            significand = tup[0].rstrip(decimal_point)
            sign = tup[1][0].replace(positive_sign, '')
            exponent = tup[1][1:].lstrip('0')
            if exponent:
                exponent = '10^{%s%s}' % (sign, exponent)
            if significand and exponent:
                s =  r'%s{\times}%s' % (significand, exponent)
            else:
                s =  r'%s%s' % (significand, exponent)
            return "${}$".format(s)
    
    # Format with 2 decimal places
    plt.gca().yaxis.set_major_formatter(MathTextSciFormatter("%1.2e"))
    
    plt.show()
    

  3. from https://stackoverflow.com/questions/25750170/can-i-show-decimal-places-and-scientific-notation-on-the-axis-of-a-matplotlib-pl by cc-by-sa and MIT license