结束使用 Spyder 在 matplotlib 中手动选择轮廓 IDE

Ending manual selection of contours in matplotlib using Spyder IDE

我正在尝试使用 matplotlib.pyplot.clabel 手动放置等高线标签,如下所示:

import matplotlib.pyplot as plt
import numpy as np

# Make example contours
N=20
X = np.linspace(0.0, 10.0, N)
Y = np.linspace(0.0, 25.0, N)
Z = np.ones((N,N))
i=0
j=0
for i in range(N):
    for j in range(N):
        Z[i][j] = i+j
        j += 1
    i += 1
Z = Z.transpose()

# Make subplots figure
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(8,5))
im =  axes[0].contour(X, Y, Z, colors = 'k')
CLS = plt.clabel(im, colors = 'k', fmt = '%2.1f', fontsize=12, manual=True)
im2 =  axes[1].contourf(X, Y, Z)
fig.show()

此代码生成下图,当您左键单击不同的等高线时,它将等高线标签添加到它们:

控制台上 python 跟踪点击的消息是:

Select label locations manually using first mouse button. End manual selection with second mouse button.

问题是右击并没有结束事件记录,我在运行时无法在脚本中通过这一点。我已经使用 Spyder 在 Windows 和 Mac 上进行了尝试,但未记录 第二个鼠标按钮

编辑 1:正如@ImportanceOfBeingErnest 指出的那样,第二个鼠标按钮 实际上是滚轮,而不是右键。我决定按原样保留这个问题,因为我认为这对 matplotlib 的每个用户来说都不清楚。

我想知道如何结束手动选择过程,以便程序继续运行并且我能够检索到这样的图形:

但当然有等高线标签。我已经在自动、Tkinter 和 Qt5 中用图形绘图仪尝试过这个过程,但没有成功。

不是您期望的答案,但我自己也遇到过与 clabel 类似的问题,并且以不同的方式使用 manual 关键字找到了解决方法。您所要做的就是提供一个元组的元组,每个元组都包含所需标签的坐标(坐标就像您在带有 x 和 y 刻度标签的图表上阅读一样)。然后该算法会将您的标签添加到最近的轮廓。有一些尝试和错误,但至少我发现它比鼠标选择更可靠。

ax.clabel(contourObject, colors='', fmt='', fontsize=,
          manual=((x1, y1), (x2, y2), (x3, y3)), inline=True,
          inline_spacing=)

我在 PyCharm/windows 10 上试过了。

单击滚动按钮结束录制,当我在 clabel 函数中添加 inline=False 时,我可以删除最后添加的标签。

你可能会在matplotlib中找到解决方案事件处理和选择 文档:link

正如@ImportanceOfBeingErnest所说,第二个鼠标按钮实际上是滚轮,而不是右键。如果您的鼠标具有所有三个按钮,那么这就是解决方案。

对于使用 Magic Mouse 的 Mac 用户,解决方案并不那么简单。我能够让它与第 3 方应用程序一起工作 BetterTouchTool。下载后,转到 系统偏好设置 >> 安全和隐私 。在 允许以下应用程序控制您的计算机。 部分下,启用 BetterTouchTool。

然后,打开应用程序并在 Select 触发器 下选择 1 Finger Middle Click。然后在右侧的 分配给 Selected 触发器的操作 部分下,选择 中键单击 。一旦完成,按下魔术按钮的中间就可以了: