web-dev-qa-db-ja.com

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

matplotlib では、 pyplot.xscale() または Axes.set_xscale() を使用して軸のスケーリングを設定できます。両方の関数は3つの異なるスケールを受け入れます:'linear' | 'log' | 'symlog'

違いは何ですか 'log'および'symlog'?私が行った簡単なテストでは、両者はまったく同じに見えました。

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

86

私は最終的に、それらの違いを理解するためにいくつかの実験を行う時間を見つけました。ここに私が発見したものがあります:

  • logは正の値のみを許可し、負の値(maskまたはclip)の処理方法を選択できます。
  • symlogsymmetric logを意味し、正および負の値を許可します。
  • 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')

A graph using 'linear' scaling

# 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')

A graph using 'log' scaling and nonposx='mask'

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

A graph using 'log' scaling and nonposx='clip'

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

A graph using 'symlog' scaling

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

A graph using 'symlog' scaling, but linear within (-20,20)

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

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

以下を使用して図のサイズを変更できることを忘れないでください。

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

(自分の質問に答えてくれるかどうかわからない場合は、 this を読んでください)

163

symlogはlogに似ていますが、プロットがゼロ付近で無限になることを避けるために、プロットが線形であるゼロ付近の値の範囲を定義できます。

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

ロググラフでは、値をゼロにすることはできません。また、値がゼロに近づくと、グラフの底から離れて(無限に下向きに)スパイクダウンします。なぜなら、「log(approaching zero)」 「負の無限大に近づきます」。

symlogは、ロググラフを作成したい場合に役立ちますが、値がゼロに向かって、またはゼロに下がることがありますが、意味のある方法でグラフに表示できるようにする必要があります。 symlogが必要な場合、ご存知でしょう。

18
thomasrutter