【问题标题】:matplotlib contourf: get Z value under cursormatplotlib contourf:获取光标下的 Z 值
【发布时间】:2012-04-22 07:00:18
【问题描述】:

当我用contourf 绘制某些东西时,我会在绘图窗口的底部看到鼠标光标下的当前 x 和 y 值。 有没有办法同时查看 z 值?

这里是一个例子contourf

import matplotlib.pyplot as plt
import numpy as hp
plt.contourf(np.arange(16).reshape(-1,4))

【问题讨论】:

    标签: python plot matplotlib contour


    【解决方案1】:

    显示光标位置的文本由ax.format_coord 生成。您可以覆盖该方法以同时显示 z 值。例如,

    import matplotlib.pyplot as plt
    import numpy as np
    import scipy.interpolate as si
    data = np.arange(16).reshape(-1, 4)
    X, Y = np.mgrid[:data.shape[0], :data.shape[1]]
    cs = plt.contourf(X, Y, data)
    
    func = si.interp2d(X, Y, data)
    def fmt(x, y):
        z = np.take(func(x, y), 0)
        return 'x={x:.5f}  y={y:.5f}  z={z:.5f}'.format(x=x, y=y, z=z)
    
    
    plt.gca().format_coord = fmt
    plt.show()
    

    【讨论】:

    • 它可以工作,但由于插值,它对于大型数据集也很慢(在我的情况下不适用于 100x100 网格)。
    • 假设您的数据位于矩形网格上,如果您将 interp2d 替换为 RectBivariateSpline,它将非常快并且还能够进行高阶插值。
    • 执行速度很慢,因为每次鼠标移动一个点都会调用fmt()。我编辑了答案并将插值函数 (si.interp2d()) 的创建放在 fmt() 之外,现在速度非常快。
    【解决方案2】:

    documentation example 展示了如何在绘图中插入 z 值标签

    脚本:http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/contour_demo.py

    基本上是

    plt.figure()
    CS = plt.contour(X, Y, Z) 
    plt.clabel(CS, inline=1, fontsize=10)
    plt.title('Simplest default with labels')
    

    【讨论】:

    • 谢谢,这很有用,但我要求在光标下实时显示 Z 值,就像 X 和 Y 已经存在一样。
    • 你不能,这是 wxWidgets 界面的一部分。如果您编写自己的 UI,您可以获得 x/y 坐标,将它们转换为轴上的 x/y 坐标。由于您从 plt.contour 获得轮廓,因此您知道它们的轮廓并且可以得到位于或围绕这些坐标的轮廓。
    • @AndreaZonca 您确定这是您仍想接受的答案吗? wilywampa 最近的 solution 完全符合您的要求...
    【解决方案3】:

    只是wilywampa 答案的变体。如果您已经有一个预先计算的插值轮廓值网格,因为您的数据是稀疏的,或者如果您有一个巨大的数据矩阵,那么这可能适合您。

    import matplotlib.pyplot as plt
    import numpy as np
    
    resolution = 100
    Z = np.arange(resolution**2).reshape(-1, resolution)
    X, Y = np.mgrid[:Z.shape[0], :Z.shape[1]]
    cs = plt.contourf(X, Y, Z)
    
    Xflat, Yflat, Zflat = X.flatten(), Y.flatten(), Z.flatten()
    def fmt(x, y):
        # get closest point with known data
        dist = np.linalg.norm(np.vstack([Xflat - x, Yflat - y]), axis=0)
        idx = np.argmin(dist)
        z = Zflat[idx]
        return 'x={x:.5f}  y={y:.5f}  z={z:.5f}'.format(x=x, y=y, z=z)
    
    plt.colorbar()
    plt.gca().format_coord = fmt
    plt.show()
    

    例如:

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2011-10-08
      • 2016-02-18
      • 2014-12-18
      • 2019-01-31
      • 1970-01-01
      相关资源
      最近更新 更多