【问题标题】:Matplotlib Contour Clabel LocationMatplotlib 轮廓标签位置
【发布时间】:2015-12-03 05:06:45
【问题描述】:

我想控制 matplotlib clabels 在等高线图上的位置,但不使用 clabel 中的 manual=True 标志。例如,我想指定一个 x 坐标,并在通过这条线的点创建标签。我看到您可以使用 get_position() 获取各个标签的位置,但我坚持这一点。任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: python matplotlib contour


    【解决方案1】:

    是的,现在有一种方法可以控制标签位置! 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)
    

    【讨论】:

    • manual 可以是 x,y 元组的可迭代对象。将创建轮廓标签,就像在每个 x,y 位置单击鼠标一样。
    • 有没有办法允许自动标记,然后遍历标签以删除(并可能改进)与轴相交的任何内容?
    • 标签放置在轮廓上接近manual给出的位置。
    【解决方案2】:

    不,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
    

    【讨论】:

    猜你喜欢
    • 2016-01-12
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多