matplotlib contourf:获取光标下的Z值

7

当我使用contourf绘制图形时,在绘图窗口底部可以看到鼠标光标下的当前x和y值。有没有办法也看到z值?

这里是一个contourf的例子:

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

9

显示光标位置的文本是由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()

1
它能用,但对于大规模数据集也相当缓慢,因为插值(在我的情况下)对于100x100网格是不可用的。 - levesque
假设您的数据在矩形网格上,如果您将interp2d替换为RectBivariateSpline,它将非常快速,并且能够进行高阶插值。 - alessandro
由於每次滑鼠移動一個點時都會調用“fmt()”,所以實現速度很慢。我編輯了答案,將插值函數(si.interp2d())的創建放在“fmt()”之外,現在執行速度非常快。 - Niko Pasanen

2

3
谢谢,这很有用,但我想要的是在光标下的Z值的实时显示,就像X和Y已经有的那样。 - Andrea Zonca
你不能这样做,因为那是wxWidgets界面的一部分。如果你编写自己的UI,你可以获取x/y坐标,将它们转换为轴上的x/y坐标。由于你从plt.contour获取轮廓,你知道它们的轮廓并且可以获取在或附近这些坐标的轮廓。 - j13r
2
@AndreaZonca,您确定这仍然是您想要接受的答案吗?wilywampa最近提供的解决方案正好符合您的要求... - gboffi

1

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

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()

Ex:

Example with mouse cursor


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接