如何在matplotlib中转换(或缩放)坐标轴值并重新定义刻度频率?

23 投票
1 回答
31954 浏览
提问于 2025-04-15 12:58

我正在显示一张jpg图片(我把它旋转了90度,如果这有关系的话),当然,坐标轴上显示的是像素坐标。我想把坐标轴的显示方式改一下,不再显示像素编号,而是显示我想要的单位,比如弧度、度数,或者在我这个例子中是天文坐标。我知道如何把像素转换成(例如)度数。以下是我目前代码的一部分:

import matplotlib.pyplot as plt 
import Image
import matplotlib
thumb = Image.open(self.image)
thumb = thumb.rotate(90)
dpi = plt.rcParams['figure.dpi']
figsize = thumb.size[0]/dpi, thumb.size[1]/dpi
fig = plt.figure(figsize=figsize)
plt.imshow(thumb, origin='lower',aspect='equal')
plt.show()

...接着这个,我能不能把matplotlib在坐标轴上打印的每个值,换成我想要的字符串呢?我想为特定的坐标格式这样做,比如说,不想显示10.44(度),而是想显示10 26' 24''(也就是度、弧分、弧秒)。

最后,关于这个主题,我还想控制图上的刻度频率。matplotlib可能每50个像素就打印一个坐标值,但我其实想要每(例如)一个度就打印一个。

听起来我想定义一个数组,里面包含像素值和我想显示的转换值(比如度数等),并且可以控制在xmin/xmax范围内的采样频率。

Stack Overflow上有没有matplotlib的专家?如果有,非常感谢你们的帮助!为了让这个过程更有学习意义,我非常希望能得到一些关于这类matplotlib问题的教程等的指引。我发现自己对坐标轴、轴、图形、艺术家等概念感到很困惑!

谢谢,

Dave

1 个回答

38

看起来你在使用 matplotlib.pyplot 这个接口,这样你就可以省去很多关于艺术家、坐标轴等的麻烦。你可以通过使用 matplotlib.pyplot.xticks 命令来控制刻度线的值和标签,具体用法如下:

tick_locs = [list of locations where you want your tick marks placed]
tick_lbls = [list of corresponding labels for each of the tick marks]
plt.xticks(tick_locs, tick_lbls)

对于你的具体例子,你需要计算刻度线相对于你原始图像的单位(也就是像素),因为你在使用 imshow。不过你说你知道怎么做这一点。

我对图像的处理不多,但你可能可以使用其他绘图方法(比如 pcolor),这样可以让你提供 xy 的信息。这可能会给你更多选择来指定图像的单位。

如果你想找教程,可以看看 matplotlib 画廊 - 找一些你喜欢的东西,看看生成它的代码。我们办公室有个同事最近买了一本关于 Python 可视化 的书,可能值得一看。

我一般是这样理解这些不同的部分的:

  • Figure 是一个容器,里面装着所有的 Axes
  • Axes 是你绘制的内容(也就是你的图)实际显示的地方
  • Axis 是实际的 xy
  • 至于艺术家?那对我来说太复杂了:我从来没有需要担心这些,尽管我在实际绘图中很少使用 pyplot 模块。

撰写回答