我在对数间隔的轴上生成2D数组(例如,x像素坐标是使用logspace(log10(0.95), log10(2.08), n)
生成的。
我想使用简单的旧版imshow显示图像,原始分辨率和缩放(我不需要to stretch it;数据本身已经是日志缩放),但我想添加刻度,标签,在日志轴上的正确位置的行。我该怎么做?
理想情况下,我可以使用命令行axvline(1.5)
,并且该行将位于正确的位置(左起58%),但如果唯一的方法是在logscale坐标和图像坐标之间手动转换,那就没关系也是。
对于线性轴,在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点处的中心放置一条线,而像素保持相等的间距。
答案 0 :(得分:10)
在我看来,最好使用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())
答案 1 :(得分:7)
实际上,它运作正常。我糊涂了。
之前我收到的错误是“非线性轴上不支持图像”,这就是我问这个问题的原因。但是现在当我尝试它时,它可以工作:
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()
更好,因为