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


369

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()

回答:


384

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()

結果チャート


6
この方法は、「plot」(semilogx / semilogyが行うもの)だけでなく、あらゆる種類のプロット(ヒストグラムなど)で機能するので便利です
Tim Whitcomb

16
2の累乗の軸を使用する方法を探してここに来ました:pylab.gca()。set_xscale( 'log'、basex = 2)
zje

53
Matplotlibは持っていsemilogy()ます。さらに、オブジェクトを取得する必要がないpyplot.yscale()ためax.set_yscale('log')、を使用するよりも直接使用する方が簡単ですax(常にすぐに使用できるとは限りません)。
エリックOレビゴット2013

5
両方の軸でログスケールが必要な場合は、試してみるloglog()か、x軸のみで試してくださいsemilogx()
drevicko '28

10
@EOL私は反対をアドバイスします。明示的に使用することをお勧めしますaxその使用にオブジェクトをpyplot唯一のかもしれないあなたはそれがしたい軸に適用されます。
tacaswell 2016年

288

まず第一に、混合pylabしてpyplotコーディングすることはそれほど整然ではありません。さらに、pylabを使用するよりもpyplotスタイルを使用することをお勧めします。

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軸のスケールを変更することもできます。

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


それを行う方法を理解しようとするのに苦労しました。この答えは私の一日を救った!
HWende

13
pyplot.semilogy()より直接的です。
エリックOレビゴット2013

64

あなたは単にプロットの代わりにセミロジーを使う必要があります:

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()

1
LOL、私はずっとlog(FloatArray)を試していました。私の日を保存してくれてありがとう
Pradeep

5
semilogxあります。両方の軸でログが必要な場合は、loglog
drevicko

40

対数の底を変更したい場合は、以下を追加してください:

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

8

私はこれが少し話題から外れているのを知っていax.set_yscale('log')ます。ax.set_yscale('log')ヒストグラムや棒グラフに使用することはお勧めしません。私のバージョン(0.99.1.1)では、いくつかのレンダリングの問題に遭遇しました-この問題がどれほど一般的かはわかりません。ただし、barとhistの両方には、yスケールをログに設定するオプションの引数があります。これは正常に機能します。

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

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


5

したがって、私がよくあるように、単純化されていないAPIを単に使用している場合(ipythonでよく使用します)、これは単純です

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

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


-1

以下のコードを使用できます:

np.log(df['col_whose_log_you_need']).iplot(kind='histogram', bins=100,
                                   xTitle = 'log of col',yTitle ='Count corresponding to column',
                                   title='Distribution of log(col_whose_log_you_need)')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.