Matplotlib等高线标签位置
我想控制在等高线图上标签的位置,但不想使用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