image - matplotlib中用于imshow的非线性轴

标签 image plot matplotlib logarithm

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

我想使用原始的老式imshow显示图像,以其原始分辨率和比例缩放(我不需要to stretch it;数据本身已经进行了日志缩放),但是我想添加刻度线,标签,在对数轴上的正确位置。我该怎么做呢?

理想情况下,我可以只使用命令行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')


此示例不起作用,因为range =仅适用于线性比例,因此当您将axvline设置为100时,它不会出现在中心。我希望x轴显示10、100、1000和axvline(100)以在100点的中心放置一条线,而像素保持相等的间距。

最佳答案

在我看来,最好使用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())

关于image - matplotlib中用于imshow的非线性轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11488800/

相关文章:

plot - gnuplot 需要很长时间才能从大型数据集生成 3D 表面

python - 带有seaborn的 latex 标签

python - matplotlib 绘制了太多刻度

python-3.x - 在 GOOGLE COLAB 中运行开放式 AI 健身房时出现 NameError : name 'base' is not defined,

java - 如何更好地理解java上的png表示?

ios - AFNetworking 3 异步图像下载队列

php - 实时更新 2 个系列的 Flot 图

python - 具有表面渐变的颜色 matplotlib plot_surface 命令

image - 如何在matlab中连接二值图像中的点

javascript - 如果找不到图像,如何防止显示图像占位符?