質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5333閲覧

matplotlibで軸の値を10のN乗の指数表記にしたい

piyo001

総合スコア1

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/26 01:20

前提・実現したいこと

matplotlibでグラフを作成しています。軸の値を10のN乗の指数表記にするため、matplotlibで軸の値を10のN乗の指数表記にするため、こちら(matplotlibで軸の値を10のN乗の指数表記にしたい)のサイトを参考にコードを書きました。コードはscalarformatterを継承した子クラスFixedOrderFormatterを作り、本来scalarformatterで計算されるorderOfMagnitude(10のN乗のNを制御する変数)を任意の数にするというものらしく、他の海外の方もこの方法を取っているようです。しかし、FixedOrderFormatterの引数をいくつにしても、10のN乗のNを変えることができません。解決策を教えてください。

該当のソースコード

python

1import pandas as pd 2import matplotlib.pyplot as plt 3from matplotlib.ticker import ScalarFormatter 4 5#クラス設定 ※ScalarFormatterを継承 6class FixedOrderFormatter(ScalarFormatter): 7 def __init__(self, order_of_mag=0, useOffset=True, useMathText=True): 8 self._order_of_mag = order_of_mag 9 ScalarFormatter.__init__(self, useOffset=useOffset, 10 useMathText=useMathText) 11 def _set_orderOfMagnitude(self, range): 12 self.orderOfMagnitude = self._order_of_mag 13 14#グラフ描画 15x=[0,100] 16y=[0,2000000] 17 18fig=plt.figure() 19ax=fig.add_subplot() 20 21ax.plot(x,y) 22ax = plt.gca() 23ax.yaxis.set_major_formatter(FixedOrderFormatter(4 ,useMathText=True)) 24 25ax.yaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 26ax.ticklabel_format(style="sci", axis="y",scilimits=(0,4)) 27 28 29plt.show()

補足情報(FW/ツールのバージョンなど)

python 3.9.7
matplotlib 3.5.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

標準のScalarFormatterのままで、scilimitsの上限と下限に同じ数字をセットすれば、指数をその数字に固定できます。

python

1import pandas as pd 2import matplotlib.pyplot as plt 3 4#グラフ描画 5x=[0,100] 6y=[0,2000000] 7 8fig=plt.figure() 9ax=fig.add_subplot() 10 11ax.plot(x,y) 12 13ax.ticklabel_format(style="sci", axis="y", scilimits=(4, 4), useMathText=True) 14 15plt.show()

投稿2021/11/26 07:12

編集2021/11/26 07:26
bsdfan

総合スコア4560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piyo001

2021/12/01 05:21

ありがとうございます 解決いたしました
guest

0

どうやらメソッド名が変更された模様です(_set_orderOfMagnitude_set_order_of_magnitude)。

python

1class FixedOrderFormatter(ScalarFormatter): 2 def __init__(self, order_of_mag=0, useOffset=True, useMathText=True): 3 self._order_of_mag = order_of_mag 4 ScalarFormatter.__init__(self, useOffset=useOffset, 5 useMathText=useMathText) 6 def _set_order_of_magnitude(self): 7 self.orderOfMagnitude = self._order_of_mag

plot

追記

bsdfan 氏の回答にある「scilimitsの上限と下限に同じ数字をセットすれば、指数をその数字に固定できます」を読んで _set_order_of_magnitude の中身を確認してみると、、、

fixed scaling when lower power limit = upper <> 0.

matplotlib/ticker.py

python

1 def _set_order_of_magnitude(self): 2 # if scientific notation is to be used, find the appropriate exponent 3 # if using an numerical offset, find the exponent after applying the 4 # offset. When lower power limit = upper <> 0, use provided exponent. 5 if not self._scientific: 6 self.orderOfMagnitude = 0 7 return 8 if self._powerlimits[0] == self._powerlimits[1] != 0: 9 # fixed scaling when lower power limit = upper <> 0. 10 self.orderOfMagnitude = self._powerlimits[0] 11 return

投稿2021/11/26 01:47

編集2021/11/26 18:57
melian

総合スコア19763

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piyo001

2021/11/26 06:23 編集

軸を10のN乗の指数にすることができました。ありがとうございます。 重ねての質問で申し訳ないのですが、グラフ左上の×10^4の部分がNに連動して変わりません。どうすればよいのでしょうか? 以下のように書き換えてみたのですが上手くいきませんでした。 ```python class FixedOrderFormatter(ScalarFormatter): def __init__(self, order_of_mag=0,my_offset=0,useOffset=True, useMathText=True): self._order_of_mag = order_of_mag self.orderOfMagnitude = self._order_of_mag self._my_offset=my_offset self.offset=self._my_offset ScalarFormatter.__init__(self, useOffset=useOffset, useMathText=useMathText) def _set_order_of_magnitude(self): self.orderOfMagnitude = self._order_of_mag def _set_offset(self): self.offset=self._my_offset ```
melian

2021/11/26 18:32

状況がよく掴めないのですが、例えば、 ax.yaxis.set_major_formatter(FixedOrderFormatter(10, useMathText=True)) とすれば x10^10 という表示になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問