web-dev-qa-db-ja.com

matplotlibのimshowの非線形軸

ログ間隔の軸上に2D配列を生成しています(たとえば、xピクセル座標はlogspace(log10(0.95), log10(2.08), n)を使用して生成されます。

プレーンな古いimshowを使用して、ネイティブの解像度とスケーリングで画像を表示したい( ストレッチするために ;データ自体はすでにログスケーリングされています)が、ティックを追加したい、ラベル、対数軸の正しい位置にある線。どうすればよいですか?

理想的には、コマンドline axvline(1.5)を使用すれば、その行は正しい場所(左から58%)になりますが、ログスケール座標と画像座標を手動で変換するしか方法がない場合は、問題ありません。あまりにも。

線形軸の場合、imshowの呼び出しで_extents=_を使用すると、必要な処理が実行されますが、対数軸で同じことを実行する方法がわかりません。

例:

_from matplotlib.colors import LogNorm

x = logspace(log10(10), log10(1000), 5)
imshow(vstack((x,x)), extent=[10, 1000, 0, 100], cmap='gray', norm=LogNorm(), interpolation='nearest')
axvline(100, color='red')
_

この例は機能しません。extent=は線形スケールにのみ適用されるため、100でaxvlineを実行すると、中央に表示されません。 x軸に10、100、1000、およびaxvline(100)を表示して、ピクセルを等間隔に保ちながら、100ポイントの中央に線を配置したいと思います。

17
endolith

実際には、正常に動作します。よくわかりません。

以前、「画像は非線形軸ではサポートされていません」というエラーが発生していました。そのため、この質問をしました。しかし今、私がそれを試してみると、それは機能します:

_import matplotlib.pyplot as plt
import numpy as np

x = np.logspace(1, 3, 5)
y = np.linspace(0, 2, 3)
z = np.linspace(0, 1, 4)
Z = np.vstack((z, z))

plt.imshow(Z, extent=[10, 1000, 0, 1], cmap='gray')
plt.xscale('log')

plt.axvline(100, color='red')

plt.show()
_

これは、pcolor()およびpcolormesh()よりも優れています。

  1. それはめちゃくちゃ遅くはなく、
  2. 画像がネイティブ解像度で表示されていない場合、誤解を招くアーティファクトなしで適切に補間されます。
9
endolith

私の見解では、pcolorと通常の(変換されていない)x値とy値を使用する方が良いでしょう。 pcolorを使用すると柔軟性が高まり、通常のx軸とy軸の混乱が少なくなります。

import pylab as plt
import numpy as np
from matplotlib.colors import LogNorm
from matplotlib.ticker import LogFormatterMathtext

x=np.logspace(1, 3, 6)
y=np.logspace(0, 2,3)
X,Y=np.meshgrid(x,y)
z = np.logspace(np.log10(10), np.log10(1000), 5)
Z=np.vstack((z,z))

im = plt.pcolor(X,Y,Z, cmap='gray', norm=LogNorm())
plt.axvline(100, color='red')

plt.xscale('log')
plt.yscale('log')

plt.colorbar(im, orientation='horizontal',format=LogFormatterMathtext())
plt.show()

enter image description here

pcolorは遅いので、より速い解決策は代わりにpcolormeshを使用することです。

im = plt.pcolormesh(X,Y,Z, cmap='gray', norm=LogNorm())
11
imsc