web-dev-qa-db-ja.com

matplotlibでlog2スケールで正方形軸プロットを作成する

Matplotlibで四角軸散布図を作成したいと思います。通常、set_scale("log")を使用するとうまく機能しますが、log10に制限されます。プロットをlog2で作成したいのですが。私はここで解決策を見ました: 指数的にスケールされた軸を生成する方法?

しかし、それは非常に複雑で、配列に値が0の場合は機能しません。私は他の派手な関数がするようなものを単に無視したいと思います。

例えば:

log2scatter(data1, data2)

data1とdata2に0が含まれている場合、x軸とy軸に対数目盛があり、対数間隔の目盛りが必要です。 log2を除いて、log10と同じです...

ありがとう。

25
user248237

_basex=2_または_basey=2_を指定するだけです。

_import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.set_xscale('log', basex=2)
ax.set_yscale('log', basey=2)

ax.plot(range(1024))
plt.show()
_

enter image description here

ゼロクロッシング動作の場合、あなたが言及しているのは「対称ログ」プロット(別名「symlog」)です。どんなに価値があるとしても、データは除外されず、0に近い線形プロットとそれ以外の場所の対数プロットにすぎません。変化するのはデータではなくスケールです。

通常はax.set_xscale('symlog', basex=2)を実行するだけですが、symlogプロットでは現時点で10以外のベースを使用するとバグがあるようです。

編集:へえ!バグは典型的な間違いによるものと思われます:可変のデフォルト引数を使用します。
バグレポートを提出しましたが、修正したい場合は、_lib/matplotlib/ticker.py_メソッドの___init___を1376行目で少し編集する必要がありますSymmetricalLogLocator

の代わりに

_def __init__(self, transform, subs=[1.0]):
    self._transform = transform
    self._subs = subs
    ...
_

次のようなものに変更します。

_def __init__(self, transform, subs=None):
    self._transform = transform
    if subs is None:
        self._subs = [1.0]
    else:
        self._subs = subs
    ....
_

その変更を行うと、期待どおりに動作します...

_import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.set_xscale('symlog', basex=2)
ax.set_yscale('symlog', basey=2)

x = np.arange(-1024, 1024)
ax.plot(x, x)

plt.show()
_

enter image description here

43
Joe Kington

plt.xscaleを使用している場合でも、basexではなくbaseを指定する必要があります。

plt.figure()
plt.plot(x, y)
plt.xscale('log', basex=2)
plt.show()
5
Jorge Leitao