find_nearest_contour 已弃用。现在怎么办?

find_nearest_contour is deprecated. Now what?

提问人:matteo 提问时间:10/12/2023 最后编辑:Trenton McKinneymatteo 更新时间:10/13/2023 访问量:104

问:

我正在使用 Matplotlib 等值线来探索 2D 地图。我使用 contour.find_nearest_contour 来获取接近点的轮廓的 x 和 y 范围,如下所示:x0, y0

cs = fig.gca().contour(x, y, image, [level])

cont, seg, idx, xm, ym, d2 = cs.find_nearest_contour(x0, y0, pixel=False)

min_x = cs.allsegs[cont][seg][:, 0].min()
max_x = cs.allsegs[cont][seg][:, 0].max()
min_y = cs.allsegs[cont][seg][:, 1].min()
max_y = cs.allsegs[cont][seg][:, 1].max()

cont, seg, idx, xm, ym, d2 = cs.find_nearest_contour(x0, y0, pixel=False)

现在 Matplotlib v3.8 抛出了一个 ,但我找不到任何解释如何获得相同功能的文档。MatplotlibDeprecationWarning

请注意,给定的轮廓级别可以创建多个线段,我还需要哪个线段更接近我的观点。实际上,我需要在我的代码行中。这不是从私人方法中共享的,这是替换的非常好的候选者。seg_find_nearest_contour

python matplotlib 轮廓 弃用警告

评论

1赞 Jody Klymak 10/13/2023
Matplotlib 似乎有点过分热衷于那里的弃用。轮廓的内部表示已更改,因此修改了一些公共接口。请在 github.com/matplotlib/matplotlib/issues/27070 查看并发表评论
0赞 matteo 10/13/2023
谢谢@JodyKlymak,我在那里发表了评论

答:

1赞 Trenton McKinney 10/13/2023 #1
  • 继续使用,直到将其移除。.find_nearest_contour
  • 根据 matplotlib 问题 27070 中的此注释,私有方法 ,可以在重新实现公共方法之前使用。._find_nearest_contour
    • 它已被弃用,因为旧的返回值 ...,对于 ContourSets 的新内部表示形式(有一个 Collection,每个级别只有一个路径)没有多大意义

    • 如果您有现有代码,则可能需要执行下列操作之一:
      • 继续使用 matplotlib 低于 3.8
      • 使用最新的实现,并根据新的Returns
  • 给定示例代码:
    • CS.find_nearest_contour(0, 0)(5, 0, 296, 209.70308429471964, 168.30113207547168, 72300.65462060366)
    • CS._find_nearest_contour((0, 0))(5, 296, array([209.70308429, 168.30113208]))
import matplotlib.pyplot as plt
import numpy as np

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

# Basic contour plot
fig, ax = plt.subplots(figsize=(7, 7))
CS = ax.contour(X, Y, Z)

CS._find_nearest_contour((0, 0))  # private method

enter image description here

Signature: CS._find_nearest_contour(xy, indices=None)
Docstring:
Find the point in the unfilled contour plot that is closest (in screen
space) to point *xy*.

Parameters
----------
xy : tuple[float, float]
    The reference point (in screen space).
indices : list of int or None, default: None
    Indices of contour levels to consider.  If None (the default), all levels
    are considered.

Returns
-------
idx_level_min : int
    The index of the contour level closest to *xy*.
idx_vtx_min : int
    The index of the `.Path` segment closest to *xy* (at that level).
proj : (float, float)
    The point in the contour plot closest to *xy*.
File:      c:\users\trenton\anaconda3\envs\py312\lib\site-packages\matplotlib\contour.py
Type:      method

关于私有方法

评论

0赞 matteo 10/13/2023
谢谢。我编辑了问题以指定我实际上需要由轮廓创建的最近路径,该路径不是由 返回的。此外,固定到 Matplotlib <=3.8 对我们来说是不可行的,所以要么 Matplotlib 创建一个替代方法,要么我需要完全改变策略。_find_nearest_contour
0赞 Trenton McKinney 10/13/2023
@matteo 由于 API 已更改,因此即使它们引入了新的公共方法,也不太可能恢复到以前的功能。另一种选择是在本地存储库中重新引入源代码matplotlibcontour.find_nearest_contour