Matplotlib等高线标签位置

23 投票
2 回答
21939 浏览
提问于 2025-04-15 22:28

我想控制在等高线图上标签的位置,但不想使用clabel中的manual=True这个选项。比如说,我想指定一个x坐标,然后在通过这条线的点上生成标签。我发现可以用get_position()来获取每个标签的位置,但我在这方面遇到了困难。希望能得到一些帮助,谢谢!

2 个回答

25

是的,现在有办法控制标签的位置了!https://github.com/matplotlib/matplotlib/pull/642

plt.figure()
CS = plt.contour(X, Y, Z)
manual_locations = [(-1, -1.4), (-0.62, -0.7), (-2, 0.5), (1.7, 1.2), (2.0, 1.4), (2.4, 1.7)]
plt.clabel(CS, inline=1, fontsize=10, manual=manual_locations)
5

不,matplotlib里没有直接的方法可以做到这一点。你要么就接受默认的位置,要么就得手动操作,使用鼠标来进行交互。

你可以考虑把这个问题反馈给开发者,这样他们可以改进他们的算法。

有几种方法可以绕过这个问题。第一种是通过编程的方式在等高线图上放置文本。这样做的话,你无法可靠地去掉文本下面的线条。假设你有一个等高线对象c,你可以在c.collections中找到等高线。对每条等高线调用get_paths,然后把你的文本放在那个路径上。

另一种选择是替换手动放置文本的代码(在matplotlib.contour.BlockingContourLabeler中),或者调整找到标签位置的代码(在matplotlib.contour.locate_label中),但这两个函数的代码都比较复杂。如果你能想出一个可用的替代方案来替换locate_label,那么就可以在你的绘图宏中覆盖掉旧的方法。

def your_locate_label(self, linecontour, labelwidth):
    # some magic
    pass

ar = np.array([[1,0], [0,1]]
c = matplotlib.contour(ar)
c.locate_label = your_locate_label

c.clabel()

顺便说一下,如果你使用ipython,你可以很方便地在交互会话中查看函数的源代码,方法是:

%psource c.clabel

或者直接用$EDITOR打开定义该函数的文件,方法是:

%edit c.clabel

撰写回答