web-dev-qa-db-ja.com

Pythonでmatplotlibを使って対数軸をプロットする

私はmatplotlibを使用して1つの対数軸でグラフをプロットしたいです。

私はドキュメントを読んできましたが、構文を理解することはできません。おそらくそれはプロット引数の'scale=linear'のような単純なものであることを私は知っています、しかし私はそれを正しくするようには思えません

サンプルプログラム

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)
pylab.show()
292
Jim

Axes.set_yscale メソッドを使用できます。それはAxesオブジェクトが作成された後にスケールを変更することを可能にします。また、必要に応じてユーザーがスケールを選択できるようにコントロールを構築することもできます。

追加する関連行は次のとおりです。

ax.set_yscale('log')

'linear'を使ってリニアスケールに戻すことができます。あなたのコードは次のようになります。

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)

ax.set_yscale('log')

pylab.show()

result chart

308
Mathieu

まず第一に、pylabpyplotのコードを混在させるのはそれほどきれいではありません。さらに、 pyplotスタイルはpylab を使用するよりも優先されます。

これは、pyplot関数のみを使用して、少し整理したコードです。

from matplotlib import pyplot

a = [ pow(10,i) for i in range(10) ]

pyplot.subplot(2,1,1)
pyplot.plot(a, color='blue', lw=2)
pyplot.yscale('log')
pyplot.show()

関連する関数は pyplot.yscale() です。オブジェクト指向バージョンを使用している場合は、それをメソッド Axes.set_yscale() に置き換えます。 pyplot.xscale() (または Axes.set_xscale() )を使用してX軸のスケールを変更することもできます。

私の質問をチェックしてください 「log」と「symlog」の違いは何ですか? matplotlibが提供するグラフスケールのいくつかの例を見る。

256

単にplotの代わりに semilogy を使うだけです。

from pylab import *
import matplotlib.pyplot  as pyplot
a = [ pow(10,i) for i in range(10) ]
fig = pyplot.figure()
ax = fig.add_subplot(2,1,1)

line, = ax.semilogy(a, color='blue', lw=2)
show()
61
Scott McCammon

あなたが対数の底を変えたいならば、単に加えなさい:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log
16
Dawid

一部のコメントではax.set_yscale('log')が「最も良い」解決策であると述べていたので、私はこれがやや話題から外れることを知っています。ヒストグラムや棒グラフにax.set_yscale('log')を使うことはお勧めしません。私のバージョン(0.99.1.1)では、私はいくつかのレンダリング問題に出くわします - この問題がどれほど一般的であるかわかりません。ただし、barとhistの両方に、yスケールをlogに設定するためのオプションの引数があります。これはうまく機能します。

参照先: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist

8
user3465408

だから私がよく使うように単純に洗練されていないAPIを使っているのなら(私はipythonでよく使っています)、これは単に

yscale('log')
plot(...)

これが簡単な答えを探している人に役立つことを願っています! :)。

5
crazy2be