私はこれができるかどうか疑問に思っていました。numpy logspace を使用してビンを明示的に設定しようとしました。また、xscale を「log」に設定しようとしました。これらのオプションはどちらも機能しません。誰もこれを試したことがありますか?
対数 x 軸と線形 y 軸を持つ 2D ヒストグラムが必要です。
私はこれができるかどうか疑問に思っていました。numpy logspace を使用してビンを明示的に設定しようとしました。また、xscale を「log」に設定しようとしました。これらのオプションはどちらも機能しません。誰もこれを試したことがありますか?
対数 x 軸と線形 y 軸を持つ 2D ヒストグラムが必要です。
正しく動作しない理由は、大きな画像に対してはるかに効率的な方法 をplt.hist2d
使用しているが、対数軸をサポートしていないためです。pcolorfast
np.histogram2d
対数軸で正しく機能する 2D ヒストグラムを作成するには、 と を使用して自分で作成する必要がありますax.pcolor
。ただし、これは 1 行の余分なコードにすぎません。
まず、線形軸上で指数関数的に間隔をあけたビンを使用しましょう。
import numpy as np
import matplotlib.pyplot as plt
x, y = np.random.random((2, 1000))
x = 10**x
xbins = 10**np.linspace(0, 1, 10)
ybins = np.linspace(0, 1, 10)
fig, ax = plt.subplots()
ax.hist2d(x, y, bins=(xbins, ybins))
plt.show()
わかりました、すべて順調です。x 軸に対数スケールを使用するとどうなるか見てみましょう。
import numpy as np
import matplotlib.pyplot as plt
x, y = np.random.random((2, 1000))
x = 10**x
xbins = 10**np.linspace(0, 1, 10)
ybins = np.linspace(0, 1, 10)
fig, ax = plt.subplots()
ax.hist2d(x, y, bins=(xbins, ybins))
ax.set_xscale('log') # <-- Only difference from previous example
plt.show()
対数スケーリングが適用されているように見えますが、色付きの画像 (ヒストグラム) にはそれが反映されていないことに注意してください。ビンは正方形に見えるはずです。によって作成されたアーティストがpcolorfast
対数軸をサポートしていないためではありません。
これを修正するには、 (舞台裏を使用するnp.histogram2d
もの) を使用してヒストグラムを作成し、対数軸をサポートする(または) を使用してプロットします。plt.hist2d
pcolormesh
pcolor
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1977)
x, y = np.random.random((2, 1000))
x = 10**x
xbins = 10**np.linspace(0, 1, 10)
ybins = np.linspace(0, 1, 10)
counts, _, _ = np.histogram2d(x, y, bins=(xbins, ybins))
fig, ax = plt.subplots()
ax.pcolormesh(xbins, ybins, counts.T)
ax.set_xscale('log')
plt.show()
(軸が(Y、X)の順序であると予想されるcounts
ため、ここで転置する必要があることに注意してください。)pcolormesh
これで、期待どおりの結果が得られました。