python - 来自 matplotlib 事件的全局变量

标签 python events matplotlib global

我正在尝试检索一个数组作为 matplotlib 事件的输出:

import numpy as np
import matplotlib.pyplot as plt

def onclick(event):
    global points
    try:
        points = np.append(points,[[event.xdata,event.ydata]],axis=0)
    except NameError:
        points = np.array([[event.xdata,event.ydata]])
    ax.plot(points[:,0],points[:,1],'o')
    plt.draw()

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim((0,10))
ax.set_ylim((0,10))
plt.gcf().canvas.mpl_connect('button_press_event',onclick)
plt.show()

即使艰难,我也宣布“点”是全局性的,

print(points)

返回一个 NameError。 我怎样才能找回“积分”? 感谢您的帮助!!

最佳答案

您不能只将变量声明为global,您必须首先创建它。以下代码应按预期工作。

import numpy as np
import matplotlib.pyplot as plt

points = []

def onclick(event):
    global points
    points.append([event.xdata, event.ydata])

    ax.plot(event.xdata, event.ydata,'o')
    plt.draw()

fig = plt.figure()
ax = fig.add_subplot(111)

ax.set_xlim((0, 10))
ax.set_ylim((0, 10))

plt.gcf().canvas.mpl_connect('button_press_event', onclick)

plt.show()

下图是我点击5次后的图

Example plot

编辑

与每次添加点时都绘制一个新标记不同,您可以修改已有的绘图对象。如下所示。

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

ax.set_xlim((0, 10))
ax.set_ylim((0, 10))

points = []

line, = ax.plot(points, 'o--')

def onclick(event):
    global points
    points.append([event.xdata, event.ydata])

    line.set_data(zip(*points))
    plt.draw()

plt.gcf().canvas.mpl_connect('button_press_event', onclick)

plt.show()

这将绘制一次,然后每次用户点击绘图时,它都会修改line对象并重新绘制它。

关于python - 来自 matplotlib 事件的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22789112/

相关文章:

python - 动画 2D 绘图(2D 布朗运动)在 Python 中不起作用

python - 如何使用目录 api 和 python 将成员添加到组中?

python - 如何避免在Python中嵌套“for循环”?

events - 如何在 UML 类图中表示 "event"?

python - 运行两次库以在 jupyter 上进行交互式绘图

python-3.x - 箱线图 : whisker definition in pandas and matplotlib

python - 为什么这个神经网络会给出运行时警告?

python - 查找所有内置异常的简单函数在直接运行时有效,但在用作导入模块时失败,不提供回溯

jquery - 有没有办法从另一个插件检测 Jquery Mobile 中的第一页加载?

ArrowDown 的 Javascript 事件监听器 - 停止页面滚动