如何更改图中轴的单位?
How do I change the axes' units in a figure?
我正在用 matplotlib
从一些 .fits
文件中制作一些星系速度的数据。问题是图中的轴以像素为单位显示了星系的大小,我想将它们显示为赤纬和右斜角(以角度为单位)。我已经知道每个像素的大小为 0.396 角秒。如何将 X 轴和 Y 轴上的像素转换为角秒?
代码如下:
##############################################################################
# Generally the image information is located in the Primary HDU, also known
# as extension 0. Here, we use `astropy.io.fits.getdata()` to read the image
# data from this first extension using the keyword argument ``ext=0``:
image_data = fits.getdata(image_file, ext=0)
##############################################################################
# The data is now stored as a 2D numpy array. Print the dimensions using the
# shape attribute:
print(image_data.shape)
##############################################################################
# Display the image data:
fig = plt.figure()
plt.imshow(image_data, cmap='Spectral_r', origin='lower', vmin=-maior_pixel, vmax=maior_pixel)
plt.colorbar()
fig.suptitle(f'{gals_header["MANGAID"]}', fontsize=20, fontweight='bold')
ax = fig.add_subplot(111)
fig.subplots_adjust(top=0.85)
ax.set_title('RC')
ax.set_xlabel('pixelsx')
ax.set_ylabel('pixelsy')
还有更多代码,但我只想展示我认为相关的部分(如有必要,我可以在评论中添加更多代码)。此代码基于此 link 中的示例代码:https://docs.astropy.org/en/stable/generated/examples/io/plot_fits-image.html#sphx-glr-download-generated-examples-io-plot-fits-image-py
我已经尝试了一些东西,比如 Axes.convert_xunits
和一些 pyplot.axes
函数,但没有任何效果(或者我只是不知道如何正确使用它们)。
That is how the Image is currently
有人可以帮忙吗?提前谢谢你。
您可以使用 plt.FuncFormatter
对象使用任何您想要的作为刻度标签。
这里是一个例子(确实是一个非常愚蠢的例子),请参阅优秀的 Matplotlib 文档以获取详细信息。
import matplotlib.pyplot as plt
from numpy import arange
img = arange(21*21).reshape(21,21)
ax = plt.axes()
plt.imshow(img, origin='lower')
ax.xaxis.set_major_formatter(
plt.FuncFormatter(lambda x, pos: "$\frac{%d}{20}$"%(200+x**2)))
每个轴都有一个 major_formatter
负责生成刻度标签。
格式化程序必须是 class subclassed 来自 Formatter
的实例,上面我们使用了 FuncFormatter
.
为了初始化一个 FuncFormatter
,我们向它传递一个格式化函数,我们必须使用以下 必需的 特征
来定义该函数
- 有两个输入,
x
和 pos
,x
是要格式化的横坐标(或纵坐标),而 pos
可以安全地忽略,
- returns 用作标签的字符串。
在示例中,函数已使用 lambda
语法当场定义,其要点是格式化为 LaTeX
分数的格式字符串 ("$\frac{%d}{20}$"%(200+x**2)
)一个横坐标的函数,如上图所示
关于pos
参数,据我所知它只在某些方法中使用,例如
In [69]: ff = plt.FuncFormatter(lambda x, pos: "%r ፨ %05.2f"%(pos,x))
In [70]: ff.format_ticks((0,4,8,12))
Out[70]: ['0 ፨ 00.00', '1 ፨ 04.00', '2 ፨ 08.00', '3 ፨ 12.00']
但通常您可以忽略函数体中的 pos
参数。
我正在用 matplotlib
从一些 .fits
文件中制作一些星系速度的数据。问题是图中的轴以像素为单位显示了星系的大小,我想将它们显示为赤纬和右斜角(以角度为单位)。我已经知道每个像素的大小为 0.396 角秒。如何将 X 轴和 Y 轴上的像素转换为角秒?
代码如下:
##############################################################################
# Generally the image information is located in the Primary HDU, also known
# as extension 0. Here, we use `astropy.io.fits.getdata()` to read the image
# data from this first extension using the keyword argument ``ext=0``:
image_data = fits.getdata(image_file, ext=0)
##############################################################################
# The data is now stored as a 2D numpy array. Print the dimensions using the
# shape attribute:
print(image_data.shape)
##############################################################################
# Display the image data:
fig = plt.figure()
plt.imshow(image_data, cmap='Spectral_r', origin='lower', vmin=-maior_pixel, vmax=maior_pixel)
plt.colorbar()
fig.suptitle(f'{gals_header["MANGAID"]}', fontsize=20, fontweight='bold')
ax = fig.add_subplot(111)
fig.subplots_adjust(top=0.85)
ax.set_title('RC')
ax.set_xlabel('pixelsx')
ax.set_ylabel('pixelsy')
还有更多代码,但我只想展示我认为相关的部分(如有必要,我可以在评论中添加更多代码)。此代码基于此 link 中的示例代码:https://docs.astropy.org/en/stable/generated/examples/io/plot_fits-image.html#sphx-glr-download-generated-examples-io-plot-fits-image-py
我已经尝试了一些东西,比如 Axes.convert_xunits
和一些 pyplot.axes
函数,但没有任何效果(或者我只是不知道如何正确使用它们)。
That is how the Image is currently
有人可以帮忙吗?提前谢谢你。
您可以使用 plt.FuncFormatter
对象使用任何您想要的作为刻度标签。
这里是一个例子(确实是一个非常愚蠢的例子),请参阅优秀的 Matplotlib 文档以获取详细信息。
import matplotlib.pyplot as plt
from numpy import arange
img = arange(21*21).reshape(21,21)
ax = plt.axes()
plt.imshow(img, origin='lower')
ax.xaxis.set_major_formatter(
plt.FuncFormatter(lambda x, pos: "$\frac{%d}{20}$"%(200+x**2)))
每个轴都有一个 major_formatter
负责生成刻度标签。
格式化程序必须是 class subclassed 来自 Formatter
的实例,上面我们使用了 FuncFormatter
.
为了初始化一个 FuncFormatter
,我们向它传递一个格式化函数,我们必须使用以下 必需的 特征
- 有两个输入,
x
和pos
,x
是要格式化的横坐标(或纵坐标),而pos
可以安全地忽略, - returns 用作标签的字符串。
在示例中,函数已使用 lambda
语法当场定义,其要点是格式化为 LaTeX
分数的格式字符串 ("$\frac{%d}{20}$"%(200+x**2)
)一个横坐标的函数,如上图所示
关于pos
参数,据我所知它只在某些方法中使用,例如
In [69]: ff = plt.FuncFormatter(lambda x, pos: "%r ፨ %05.2f"%(pos,x))
In [70]: ff.format_ticks((0,4,8,12))
Out[70]: ['0 ፨ 00.00', '1 ፨ 04.00', '2 ፨ 08.00', '3 ፨ 12.00']
但通常您可以忽略函数体中的 pos
参数。