20

対数間隔の軸で 2D 配列を生成しています (たとえば、x ピクセル座標はlogspace(log10(0.95), log10(2.08), n).

ネイティブの解像度とスケーリングで、普通の古い imshow を使用して画像を表示したい (ストレッチする必要はありません。データ自体は既に対数スケーリングされています) が、目盛り、ラベル、ラインを追加したい対数軸上の正しい位置。どうすればいいですか?

理想的には、コマンド ラインを使用するだけaxvline(1.5)で、ラインが正しい場所 (左から 58%) に配置されますが、対数スケール座標と画像座標を手動で変換するしか方法がない場合は、それも問題ありません。

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

例:

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 ポイントの中央に線を配置し、ピクセルは等間隔のままにしたいと思います。

4

2 に答える 2

18

私の見解では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()

ここに画像の説明を入力してください

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

im = plt.pcolormesh(X,Y,Z, cmap='gray', norm=LogNorm())
于 2012-07-16T17:17:33.253 に答える
10

実際、それはうまく機能します。よくわかりません。

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

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()これはandよりも優れてpcolormesh()います

  1. めちゃくちゃ遅くないし、
  2. 画像がネイティブ解像度で表示されていない場合でも、誤解を招くアーティファクトなしで適切に補間されます。
于 2012-07-18T14:13:53.847 に答える