web-dev-qa-db-ja.com

matplotlibの対数-対数プロットで科学的表記を削除する方法

この質問が以前に尋ねられたことは知っていますが、可能な解決策をすべて試しましたが、どれもうまくいきませんでした。

だから、私はmatplotlibに対数-対数プロットを持っています、そして私はx軸の科学的表記を避けたいです。

これは私のコードです:

_from numpy import array, log, pi
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import matplotlib.ticker as mticker

plt.rc('axes.formatter', useoffset=False)

tc = array([7499680.0, 12508380.0, 23858280.0, 34877020.0, 53970660.0, 89248580.0, 161032860.0, 326814160.0, 784460200.0])

theta = array([70, 60, 50, 45, 40, 35, 30, 25, 20])

plt.scatter(theta,tc)

ax=plt.gca()

ax.set_xscale('log')
ax.set_yscale('log')

ax.xaxis.set_major_formatter(mticker.ScalarFormatter())
ax.xaxis.get_major_formatter().set_scientific(False)
ax.xaxis.get_major_formatter().set_useOffset(False)

plt.show()
_

そして、これは出力です: Output

ご覧のとおり、x軸の数値はまだ科学的表記です。 20、30、40と表示したいのですが...可能な解決策をすべて試しましたが、結果はありませんでした。

助けてくれる皆さん、本当にありがとうございました。

NB。 plt.loglog()コマンドは使用できません。データにカーブフィッティングを行っているので、そのようにする必要があるからです。

NB2。非常に奇妙なことが起こっていることに気づきました。コードをyaxis.get_mayor_formatter()...に変更すると、y軸で機能します。機能していないのはxの1つだけです。どのように可能ですか?

編集:はっきりしないかもしれませんが、コードを見ると、xティックの表示に影響を与える3つのメソッドがあります:plt.rc('axes.formatter', useoffset=False)ax.xaxis.set_major_formatter(mticker.ScalarFormatter())およびax.xaxis.get_major_formatter().set_scientific(False)。私が見つけたものによると、これらは3つの方法ですべて単独でトリックを実行するはずですが、実際には実行しません。もちろん、私もそれらを1つずつ試しました。

11
Tropilio

それらは、x軸上の小目盛り(つまり、10の整数乗ではない)であり、大目盛りではありません。 matplotlibは、主ティックまたは副ティックにラベルを付けるかどうかを自動的に決定します。この場合、xの範囲に主ティックが表示されていないため、副ティックにラベルが付けられます)。したがって、set_minor_formatterメソッドを使用する必要があります。

ax.xaxis.set_minor_formatter(mticker.ScalarFormatter())

enter image description here

それがy軸で機能する理由は、それらのティックがメジャーティック(つまり、10の整数乗)であり、マイナーティックではないためです。

5
tmdavison

以下は回避策として使用できます( 元の回答 ):

from matplotlib.ticker import StrMethodFormatter, NullFormatter
ax.yaxis.set_major_formatter(StrMethodFormatter('{x:.0f}'))
ax.yaxis.set_minor_formatter(NullFormatter())
2
Ivan Mitevski

オフセットと科学表記の両方を無効にする場合は、ax.ticklabel_format(useOffset=False, style='plain')を使用します

0
Aditya