Python 图形轴matplotlib中的非线性缩放图像

Python 图形轴matplotlib中的非线性缩放图像,python,image,python-3.x,matplotlib,axis-labels,Python,Image,Python 3.x,Matplotlib,Axis Labels,我希望我并没有像以前问的那个样看得太多。我不这么认为。 我有一张光谱图。我有几条激光线要校准。由于激光线和光谱是以相同的方式收集的,因此它们应该在像素距离上相关。像素数和波长之间的关系是非线性的。我用一个具有高度相关性的三次多项式,将x轴上的像素数与激光线的波长(蓝色@405nm绿色@532nm,红色@650nm)进行拟合。我想通过直接从像素数计算波长(nm)来绘制光谱,并显示光谱下的波长。在不将图像重叠到另一个图形上的情况下,这是否可行 最简单的选择可能是使用pcolormesh而不是imsh

我希望我并没有像以前问的那个样看得太多。我不这么认为。 我有一张光谱图。我有几条激光线要校准。由于激光线和光谱是以相同的方式收集的,因此它们应该在像素距离上相关。像素数和波长之间的关系是非线性的。我用一个具有高度相关性的三次多项式,将x轴上的像素数与激光线的波长(蓝色@405nm绿色@532nm,红色@650nm)进行拟合。我想通过直接从像素数计算波长(nm)来绘制光谱,并显示光谱下的波长。在不将图像重叠到另一个图形上的情况下,这是否可行


最简单的选择可能是使用
pcolormesh
而不是imshow绘图。
pcolormesh
显示网格的边缘,这样您就可以简单地使用像素和波长之间的函数依赖关系来变换原始网格,从而根据波长定义每个像素的边缘

import numpy as np 
import matplotlib.pyplot as plt

image = np.sort(np.random.randint(0,256,size=(400,600)),axis=0)


f = lambda i: i**3*-3.119E-6+2.926E-3*i**2+0.173*i+269.593
xi = np.arange(0,image.shape[1]+1)-0.5
yi = np.arange(0,image.shape[0]+1)-0.5
Xi, Yi = np.meshgrid(xi, yi)

Xw = f(Xi)

fig, (ax) = plt.subplots(figsize=(8,4))

ax.pcolormesh(Xw, Yi, image)

ax.set_xlabel("wavelength [nm]")
plt.show()

如果图像有3个颜色通道,则需要使用pcolormesh的
color
参数设置每个像素的颜色,如本问题所示:


此外,您的图像是完全白色的。很难想象你想要什么。我道歉。我省略了等式中的幂,我曾多次尝试上载.jpg文件,但结果是白色的。可以这样说,图像反映了三条激光线的光谱色散,这三条激光线遵循上述方程中表示的关系,其中i是图像中的像素数(x轴),x是波长空间中的x轴。感谢ImportanceOfBeingErnst,这看起来很有希望。但是,当我将我的图像替换到您的代码中时,我收到了以下错误。-->17 ax.pcolormesh(Xw,Yi,image)值错误:要解压缩的值太多(应为2)上述代码似乎对灰度图像效果良好,但对RGB图像效果不佳。从这个问题上看,您不清楚是否有RGB图像。我更新了答案,也包括了那个案例。太好了。非常感谢你的专业知识。
import numpy as np 
import matplotlib.pyplot as plt

image = np.sort(np.random.randint(0,256,size=(400,600)),axis=0)


f = lambda i: i**3*-3.119E-6+2.926E-3*i**2+0.173*i+269.593
xi = np.arange(0,image.shape[1]+1)-0.5
yi = np.arange(0,image.shape[0]+1)-0.5
Xi, Yi = np.meshgrid(xi, yi)

Xw = f(Xi)

fig, (ax) = plt.subplots(figsize=(8,4))

ax.pcolormesh(Xw, Yi, image)

ax.set_xlabel("wavelength [nm]")
plt.show()
import numpy as np 
import matplotlib.pyplot as plt

r = np.sort(np.random.randint(0,256,size=(200,600)),axis=1)
g = np.sort(np.random.randint(0,256,size=(200,600)),axis=0)
b = np.sort(np.random.randint(0,256,size=(200,600)),axis=1)
image = np.dstack([r, g, b])

color = image.reshape((image.shape[0]*image.shape[1],image.shape[2]))
if color.max() > 1.:
    color = color/255.

f = lambda i: i**3*-3.119E-6+2.926E-3*i**2+0.173*i+269.593
xi = np.arange(0,image.shape[1]+1)-0.5
yi = np.arange(0,image.shape[0]+1)-0.5
Xi, Yi = np.meshgrid(xi, yi)

Xw = f(Xi)

fig, (ax) = plt.subplots(figsize=(8,4))

pc = ax.pcolormesh(Xw, Yi, Xw, color=color )
pc.set_array(None)
ax.set_xlabel("wavelength [nm]")
plt.show()