Python 使用matplotlib plt.imshow()时从像素更改为微米

Python 使用matplotlib plt.imshow()时从像素更改为微米,python,matplotlib,Python,Matplotlib,正如标题所示,在使用从显微镜捕获的plt.imshow on.tif图像时,我正在尝试更新轴单位。像素-->微米。假设1个像素是0.5微米 我过去曾使用回调进行过二次访问,但在imshow方面运气不佳。我简要地使用了imshow参数origin和extent。这些似乎是方向的参数。很抱歉,我在编写此遥控器时提供了代码。为了回答这个问题,让我们以下面的示例代码为例说明imshow: import matplotlib.pyplot as plt import numpy as np data =

正如标题所示,在使用从显微镜捕获的plt.imshow on.tif图像时,我正在尝试更新轴单位。像素-->微米。假设1个像素是0.5微米


我过去曾使用回调进行过二次访问,但在imshow方面运气不佳。我简要地使用了imshow参数origin和extent。这些似乎是方向的参数。很抱歉,我在编写此遥控器时提供了代码。

为了回答这个问题,让我们以下面的示例代码为例说明
imshow

import matplotlib.pyplot as plt
import numpy as np

data = np.random.uniform(size=(1024, 1024))

fig, ax = plt.subplots()
ax.imshow(data)
ax.set_xlabel('x pixel index')
ax.set_ylabel('y pixel index')

plt.show()

在此图中,轴刻度的范围为0到1024(像素)。相反,您希望它们的范围为0到512微米。一种稍微复杂且麻烦的方法是获取x和y记号值,将它们除以二,然后将新值设置为记号标签。另一种方法是创建一个自定义函数,本质上是一个在记号值和记号标签格式之间转换的函数

在您的情况下,创建
FuncFormatter
可能是最好的选择。这里,您定义了一个函数,该函数接受两个输入(一个tick值
x
和一个position
pos
),并返回一个包含tick标签的字符串。有几种不同的方法可以定义这样的格式化程序(参见上面的链接),但最简单的方法是将lambda函数传递给axis的
set\u major\u格式化程序
方法
xaxis
yaxis
对象。请参见下面的示例

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np

data = np.random.uniform(size=(1024, 1024))

fig, ax = plt.subplots()
ax.imshow(data)

formatter = lambda x, pos: x * 0.5  # 0.5 is the resolution
ax.xaxis.set_major_formatter(formatter)
ax.yaxis.set_major_formatter(formatter)

ax.set_xlabel('x position (μm)')
ax.set_ylabel('y position (μm)')

plt.show()
在本例中,您的绘图如下所示:

请注意,现在已经添加了小数点,因为Python的默认浮点到字符串行为是包含一个小数点。您可以更改格式化程序以返回不带小数的格式化字符串:

formatter = lambda x, pos: f'{(x * 0.5):.0f}'


基本上,你现在可以让你的格式化程序简单到你喜欢的程度。

谢谢luuk,这很有帮助。我欣赏这个明确的例子。