[PYTHON] Python 2.7을 사용하여 matplotlib 플롯의 축에 소수점 및 과학 표기법을 표시 할 수 있습니까?
PYTHONPython 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.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.과학적 표기법으로 멋지게 서식이 지정된 레이블을 얻으려면 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()
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
'PYTHON' 카테고리의 다른 글
[PYTHON] Python과 minidom을 사용한 XML 구문 분석 (0) | 2018.11.09 |
---|---|
[PYTHON] Django AutoFields를 더 높은 수로 시작하는 방법 (0) | 2018.11.08 |
[PYTHON] PyEphem을 사용하여 새벽과 일몰 시간 계산하기 (0) | 2018.11.08 |
[PYTHON] RegEx를 사용하여 Python에서 IP 주소 일치시키기 (0) | 2018.11.08 |
[PYTHON] Python 파일 구문 분석 : 텍스트 파일에서 트리 만들기 (0) | 2018.11.08 |