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()和更好,pcolormesh()因为

  1. 它不是非常慢而且
  2. 当图像未以原始分辨率显示时,可以很好地插值而不会产生误导性伪影。
于 2012-07-18T14:13:53.847 回答