将%matplotlib notebook的函数转换为Python脚本

时间:2017-03-01 21:02:34

标签: python matplotlib plot ipython-notebook

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

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)

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

%matplotlib notebook

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

CREATE PROCEDURE UpdateSQL
-- Add the parameters for the stored procedure here
    @UpdateField varchar(25),
    @UpdateValue varchar(25),
    @FilterField varchar(25),
    @FilterValue varchar(25),
    @DBNAME sysname   
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @sql NVARCHAR(MAX);

    SET @sql = '
UPDATE @DBNAME SET @UpdateField = @UpdateValue WHERE @FilterField = @FilterValue
';
    SET @sql = REPLACE(@sql, '@DBNAME', @DBNAME);
    SET @sql = REPLACE(@sql, '@UpdateField', @UpdateField);
    SET @sql = REPLACE(@sql, '@FilterField', @FilterField);

    exec sp_executesql @sql,
                       N'@UpdateField varchar(25), @FilterField varchar(25)',
                       @UpdateField=@UpdateField, @FilterField=@FilterField;
END;

无效。有没有其他方法可以让我的python脚本做同样的事情:显示情节,用户可以点击并返回用户点击的坐标?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

以下脚本

import matplotlib.pyplot as plt

image = plt.imread("image.jpg")

fig, ax = plt.subplots(figsize=(4,3))
ax.imshow(image)

plt.show()

生成此窗口

enter image description here

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

但是当然可以通过使用相同的事件处理机制来扩展功能

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