「log」と「symlog」の違いは何ですか?


101

matplotlibの、私はどちらか使用して軸のスケーリングを設定することができますpyplot.xscale()Axes.set_xscale()。どちらの関数も3つの異なるスケールを受け入れます'linear''log'| 'symlog'

違いは何である'log'とは'symlog'?私が行った簡単なテストでは、どちらもまったく同じに見えました。

ドキュメントには異なるパラメータを受け入れると書かれていますが、それらの違いはまだわかりません。誰かがそれを説明できますか?いくつかのサンプルコードとグラフィックスがあれば、答えは最高です!(また、「symlog」という名前はどこから来たのですか?)

回答:


188

それらの違いを理解するために、ようやくいくつかの実験をする時間を見つけました。これが私が発見したものです:

  • logは正の値のみを許可し、負の値(maskまたはclip)の処理方法を選択できます。
  • symlog対称ログを意味し、正と負の値を許可します。
  • symlog プロット内のゼロ付近の範囲を設定できます。対数ではなく線形になります。

グラフィックスと例を使用すると、すべてが理解しやすくなると思いますので、試してみましょう。

import numpy
from matplotlib import pyplot

# Enable interactive mode
pyplot.ion()

# Draw the grid lines
pyplot.grid(True)

# Numbers from -50 to 50, with 0.1 as step
xdomain = numpy.arange(-50,50, 0.1)

# Plots a simple linear function 'f(x) = x'
pyplot.plot(xdomain, xdomain)
# Plots 'sin(x)'
pyplot.plot(xdomain, numpy.sin(xdomain))

# 'linear' is the default mode, so this next line is redundant:
pyplot.xscale('linear')

「線形」スケーリングを使用したグラフ

# How to treat negative values?
# 'mask' will treat negative values as invalid
# 'mask' is the default, so the next two lines are equivalent
pyplot.xscale('log')
pyplot.xscale('log', nonposx='mask')

'log'スケーリングとnonposx = 'mask'を使用したグラフ

# 'clip' will map all negative values a very small positive one
pyplot.xscale('log', nonposx='clip')

'log'スケーリングとnonposx = 'clip'を使用したグラフ

# 'symlog' scaling, however, handles negative values nicely
pyplot.xscale('symlog')

「symlog」スケーリングを使用したグラフ

# And you can even set a linear range around zero
pyplot.xscale('symlog', linthreshx=20)

「symlog」スケーリングを使用しているが(-20,20)内で線形のグラフ

完全を期すために、以下のコードを使用して各図を保存しました。

# Default dpi is 80
pyplot.savefig('matplotlib_xscale_linear.png', dpi=50, bbox_inches='tight')

以下を使用して、Figureのサイズを変更できることを覚えておいてください。

fig = pyplot.gcf()
fig.set_size_inches([4., 3.])
# Default size: [8., 6.]

(私が自分の質問に答えるかどうかわからない場合は、こちらをお読みください)


19

symlogはlogに似ていますが、ゼロに近い値の範囲を定義して、その中でプロットが線形になるようにし、プロットがゼロ付近で無限大になるのを回避できます。

http://matplotlib.sourceforge.net/api/axes_api.html#matplotlib.axes.Axes.set_xscaleから

ロググラフでは、ゼロの値を持つことはできません。ゼロに近づく値がある場合、「ログ(ゼロに近づく)」を実行すると「負の無限大に近づく」。

symlogは、ロググラフが必要な場合に役立ちますが、値がゼロに近づく、またはゼロになる場合がありますが、それでも意味のある方法でグラフに表示できるようにする必要があります。symlogが必要な場合は、ご存知でしょう。


ええと...私はそれを読んだのですが、いつどちらを使うべきかわかりません。symlogが解決しようとしている問題が何であるかを実際に確認できるように、ある種のグラフィカルな例を期待していました。
DenilsonSáMaia 2010

4

symlogが必要な場合の動作の例を次に示します。

スケーリングされていない初期プロット。x〜0に点がいくつ集まっているかに注意してください

    ax = sns.scatterplot(x= 'Score', y ='Total Amount Deposited', data = df, hue = 'Predicted Category')

[ スケーリングなし '

対数スケールのプロット。すべてが崩壊した。

    ax = sns.scatterplot(x= 'Score', y ='Total Amount Deposited', data = df, hue = 'Predicted Category')

    ax.set_xscale('log')
    ax.set_yscale('log')
    ax.set(xlabel='Score, log', ylabel='Total Amount Deposited, log')

ログスケール

なぜ崩壊したのですか?x軸のいくつかの値が0に非常に近いか等しいため。

Symlogスケールプロット。すべてが本来あるべき姿です。

    ax = sns.scatterplot(x= 'Score', y ='Total Amount Deposited', data = df, hue = 'Predicted Category')

    ax.set_xscale('symlog')
    ax.set_yscale('symlog')
    ax.set(xlabel='Score, symlog', ylabel='Total Amount Deposited, symlog')

Symlogスケール

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.