【问题标题】:converting functions of %matplotlib notebook into Python script将 %matplotlib notebook 的函数转换为 Python 脚本
【发布时间】:2017-07-21 09:16:43
【问题描述】:

我正在尝试将几个 python 笔记本文件转换为 python 脚本,以便我可以创建一个 python 包... 我现在遇到的问题是在 python 笔记本中,有

%matplotlib notebook

使用户可以单击绘图并接收他/她刚刚单击的绘图的坐标的魔术按钮。实现方式如下:

f = urllib.urlopen(url_link)
fig = plt.figure(figsize=(3,3))
coords = coordinates(my_coord)[1]
image = plt.imread(f)
plt.imshow(image)

collector = {'x':0,'y':0}
def onclick(event):
    collector['x'] = event.x
    collector['y'] = event.y

cid = fig.canvas.mpl_connect('button_press_event',onclick)
print(collector)

现在我想在 python 脚本中创建相同的函数。但在脚本中

%matplotlib notebook

不工作。有没有其他方法可以让我的 python 脚本做同样的事情:显示绘图和用户可以点击并返回用户点击的坐标?

提前谢谢!

【问题讨论】:

    标签: python matplotlib plot ipython-notebook


    【解决方案1】:

    原则上不需要这样的事件处理,因为这在 matplotlib 绘图窗口中自动可用。

    以下脚本

    import matplotlib.pyplot as plt
    
    image = plt.imread("image.jpg")
    
    fig, ax = plt.subplots(figsize=(4,3))
    ax.imshow(image)
    
    plt.show()
    

    产生这个窗口

    在下方状态栏中显示当前鼠标位置的坐标。

    但当然可以通过使用相同的事件处理机制来扩展功能,就像问题中一样

    import matplotlib.pyplot as plt
    
    image = plt.imread("image.jpg")
    
    fig, ax = plt.subplots(figsize=(4,3))
    ax.imshow(image)
    
    collector = {'x':0,'y':0}
    def onclick(event):
        collector['x'] = event.x
        collector['y'] = event.y
        print(collector)
    
    cid = fig.canvas.mpl_connect('button_press_event',onclick)
    
    plt.show()
    

    请注意,这将打印图形坐标,而不是数据坐标。由于图形坐标在大多数情况下是无用的,因此最好使用数据坐标,像这样。

    collector['x'] = event.xdata
    collector['y'] = event.ydata
    

    另请参阅 matplotlib 页面上的 event handling article

    【讨论】:

    • 酷!但还有一个问题......返回值始终是整数形式,但我希望它作为浮点供以后使用..任何解决方案都可以让我这样做?
    • return 值是什么意思?这里没有回报。当然,您可以将值转换为 float,如 collector['x'] = float(event.xdata),如果这就是您的意思。
    • 我的意思是它是否可以更精确地打印出我点击的点的坐标。如果我点击 x:503.449 y:521.459,我将得到 x-503 和 y=521 而不是原始值。有什么办法可以避免这种近似?
    • 当我点击图片时,它会打印出{'y': 267.66354838709674, 'x': 71.209677419354819}。我使用的是 matplotlib 2.0,这可能在以前的版本中有所不同。
    • 好的谢谢!我将尝试更改 matplotlib 的版本..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2015-11-17
    • 2021-04-15
    • 2022-11-24
    • 2011-02-19
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多