matplotlib中imshow的非线性轴

end*_*ith 17 plot logarithm image matplotlib

我在对数间隔轴上生成二维数组(例如,使用生成x像素坐标logspace(log10(0.95), log10(2.08), n).

我希望使用普通的imshow显示图像,原始分辨率和缩放(我不需要拉伸它 ;数据本身已经是日志缩放),但我想添加刻度,标签,行对数轴上的正确位置.我该怎么做呢?

理想情况下,我可以使用命令行,axvline(1.5)并且该行将位于正确的位置(左起58%),但如果唯一的方法是在logscale坐标和图像坐标之间手动转换,那也没关系.

对于线性轴,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')
Run Code Online (Sandbox Code Playgroud)

此示例不起作用,因为extent =仅适用于线性比例,因此当您在100处执行axvline时,它不会出现在中心.我希望x轴显示10,100,1000,并axvline(100)在100点的中心放一条线,而像素保持相等的间距.

ims*_*msc 11

在我看来,最好使用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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

由于pcolor是缓慢的,更快的解决方案是使用pcolormesh来代替.

im = plt.pcolormesh(X,Y,Z, cmap='gray', norm=LogNorm())
Run Code Online (Sandbox Code Playgroud)


end*_*ith 8

实际上,它工作正常.我糊涂了.

以前我得到的错误是"非线性轴上不支持图像"这就是我问这个问题的原因.但现在当我尝试它,它的工作原理:

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()
Run Code Online (Sandbox Code Playgroud)

这比pcolor()并且pcolormesh()因为更好

  1. 它不是非常缓慢而且
  2. 当图像未以原始分辨率显示时,插值很好而不会产生误导性的伪像.

  • 这仍然有效吗?我没有收到任何错误,但图像被对数刻度拉伸和变形。就像我希望所有方块的大小相同,但事实并非如此。 (3认同)
  • 我同样困惑.以前,我尝试使用`log`来"imshow"并且它不起作用,但它现在工作得很好. (2认同)
  • 我们发现如果你删除`extent`它将无法工作.也就是说,`plt.imshow(Z,cmap ='gray'); plt.xscale('log')`引发错误. (2认同)
  • @developer 哦,也许是因为默认范围从 0 开始? (2认同)
  • 这在 MPL2 中停止工作了吗?...可能:http://matplotlib.org/devdocs/users/whats_new.html#non-linear-scales-on-image-plots (2认同)
  • 我认为它不再起作用了,我也有拉伸的图像。在 @endolith 提供的示例中,x= 31.6、100 和 316 有 4 个不同的值应该更改。但是在图像中,更改约为 250、500 和 750。显然有些东西没有按预期工作!有人有关于如何做的参考吗? (2认同)