{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import sys\n", "\n", "import numpy as np\n", "import torch\n", "from torchvision import models\n", "from torchvision.models import AlexNet_Weights, VGG16_Weights\n", "import matplotlib.pyplot as plt\n", "%matplotlib ipympl\n", "\n", "# sys.path.append('..')\n", "# from stimulus import draw_bar\n", "# from mapping import RfMapper\n", "# import constants as c" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# Please specify some details here:\n", "model = models.alexnet(weights=AlexNet_Weights.IMAGENET1K_V1).to(c.DEVICE)\n", "model_name = 'alexnet'\n", "# model = models.vgg16(weights=VGG16_Weights.IMAGENET1K_V1).to(c.DEVICE)\n", "# model_name = 'vgg16'\n", "conv_i = 1 # 0 is Conv1, 1 is Conv2, etc.\n", "xn = yn = 227" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The RF mapper is for Conv2 (not Conv1) with input shape (yn = 227, xn = 227).\n" ] } ], "source": [ "# Not going to use the mapper object. Just using it to get info about the\n", "# conv layer.\n", "mapper = RfMapper(model, conv_i, (yn, xn))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c511944a736148979e5de634a4f2c37f", "version_major": 2, "version_minor": 0 }, "image/png": "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jBEev8doAH5U+AECgLHH43eS9wACAPD/CUAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQzJgNwx44dcccdd0RLS0vU1NTEs88+O+x4URSxatWqmDZtWkycODHa29vjtddeGzbm2LFjsXjx4iiVStHQ0BBLly6NEydOjOJZAABUx5gMwJMnT8bcuXNj3bp15z3+6KOPxmOPPRbr16+PXbt2xZVXXhkdHR1x6tSpypjFixfHnj17YvPmzbFx48bYsWNHLFu2bLROAQCgamqKoiiqPYnfRU1NTTzzzDNx5513RsRvnv1raWmJhx9+OB555JGIiOjv74/m5ubYsGFDLFq0KF599dWYM2dOvPjii3HzzTdHRMSmTZviC1/4QrzxxhvR0tJyQd97YGAg6uvro7+/P0ql0oicHwBwcXn8HqPPAL6X/fv3R09PT7S3t1f21dfXR2tra3R3d0dERHd3dzQ0NFTiLyKivb09amtrY9euXe9624ODgzEwMDBsAwAYay65AOzp6YmIiObm5mH7m5ubK8d6enqiqalp2PFx48ZFY2NjZcz5rF27Nurr6yvb9OnTL/LsAQBG3iUXgCNp5cqV0d/fX9kOHjxY7SkBAHxgl1wAlsvliIjo7e0dtr+3t7dyrFwux5EjR4YdP3v2bBw7dqwy5nzq6uqiVCoN2wAAxppLLgBnzZoV5XI5tmzZUtk3MDAQu3btira2toiIaGtri76+vti9e3dlzNatW2NoaChaW1tHfc4AAKNpXLUn8GGcOHEi9u3bV7m8f//+ePnll6OxsTFmzJgRDz74YPz93/99XHvttTFr1qz46le/Gi0tLZVPCl9//fXR2dkZ999/f6xfvz7OnDkTy5cvj0WLFl3wJ4ABAMaqMRmAP/7xj+Nzn/tc5fKKFSsiImLJkiWxYcOG+MpXvhInT56MZcuWRV9fX3zmM5+JTZs2xeWXX165zn/8x3/E8uXL47bbbova2tpYuHBhPPbYY6N+LgAAo23M/x3AavJ3hABg7PH4fQm+BxAAgPcmAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACCZSzYAv/a1r0VNTc2wbfbs2ZXjp06diq6urrjqqqti0qRJsXDhwujt7a3ijAEARsclG4AREZ/85Cfj8OHDle2FF16oHHvooYfiueeei6effjq2b98ehw4dirvuuquKswUAGB3jqj2BkTRu3Lgol8vv2N/f3x//+q//Gk8++WR8/vOfj4iIJ554Iq6//vrYuXNn3HrrraM9VQCAUXNJPwP42muvRUtLS1xzzTWxePHiOHDgQERE7N69O86cORPt7e2VsbNnz44ZM2ZEd3d3taYLADAqLtlnAFtbW2PDhg1x3XXXxeHDh2PNmjXx2c9+Nl555ZXo6emJCRMmRENDw7DrNDc3R09Pz7ve5uDgYAwODlYuDwwMjNT0AQBGzCUbgAsWLKh8fdNNN0Vra2vMnDkzvve978XEiRM/1G2uXbs21qxZc7GmCABQFZf0S8Bv19DQEJ/4xCdi3759US6X4/Tp09HX1zdsTG9v73nfM/iWlStXRn9/f2U7ePDgCM8aAODiSxOAJ06ciNdffz2mTZsW8+bNi/Hjx8eWLVsqx/fu3RsHDhyItra2d72Nurq6KJVKwzYAgLHmkn0J+JFHHok77rgjZs6cGYcOHYrVq1fHZZddFvfcc0/U19fH0qVLY8WKFdHY2BilUim+9KUvRVtbm08AAwCXvEs2AN94442455574ujRozF16tT4zGc+Ezt37oypU6dGRMQ///M/R21tbSxcuDAGBwejo6MjvvWtb1V51gAAI6+mKIqi2pMYqwYGBqK+vj76+/u9HAwAY4TH70TvAQQA4DcEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkkkfgOvWrYuPfexjcfnll0dra2v86Ec/qvaUAABGVOoA/O53vxsrVqyI1atXx09+8pOYO3dudHR0xJEjR6o9NQCAEZM6AL/xjW/E/fffH/fdd1/MmTMn1q9fH1dccUX827/9W7WnBgAwYsZVewLVcvr06di9e3esXLmysq+2tjba29uju7v7vNcZHByMwcHByuX+/v6IiBgYGBjZyQIAF81bj9tFUVR5JtWTNgB/+ctfxrlz56K5uXnY/ubm5vj5z39+3uusXbs21qxZ847906dPH5E5AgAj5/jx41FfX1/taVRF2gD8MFauXBkrVqyoXO7r64uZM2fGgQMH0v4AjTUDAwMxffr0OHjwYJRKpWpPhwtk3cYeazb2ZFqzoiji+PHj0dLSUu2pVE3aAJwyZUpcdtll0dvbO2x/b29vlMvl816nrq4u6urq3rG/vr7+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", "text/html": [ "\n", " <div style=\"display: inline-block;\">\n", " <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n", " Figure\n", " </div>\n", " <img src='data:image/png;base64,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jBEev8doAH5U+AECgLHH43eS9wACAPD/CUAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQzJgNwx44dcccdd0RLS0vU1NTEs88+O+x4URSxatWqmDZtWkycODHa29vjtddeGzbm2LFjsXjx4iiVStHQ0BBLly6NEydOjOJZAABUx5gMwJMnT8bcuXNj3bp15z3+6KOPxmOPPRbr16+PXbt2xZVXXhkdHR1x6tSpypjFixfHnj17YvPmzbFx48bYsWNHLFu2bLROAQCgamqKoiiqPYnfRU1NTTzzzDNx5513RsRvnv1raWmJhx9+OB555JGIiOjv74/m5ubYsGFDLFq0KF599dWYM2dOvPjii3HzzTdHRMSmTZviC1/4QrzxxhvR0tJyQd97YGAg6uvro7+/P0ql0oicHwBwcXn8HqPPAL6X/fv3R09PT7S3t1f21dfXR2tra3R3d0dERHd3dzQ0NFTiLyKivb09amtrY9euXe9624ODgzEwMDBsAwAYay65AOzp6YmIiObm5mH7m5ubK8d6enqiqalp2PFx48ZFY2NjZcz5rF27Nurr6yvb9OnTL/LsAQBG3iUXgCNp5cqV0d/fX9kOHjxY7SkBAHxgl1wAlsvliIjo7e0dtr+3t7dyrFwux5EjR4YdP3v2bBw7dqwy5nzq6uqiVCoN2wAAxppLLgBnzZoV5XI5tmzZUtk3MDAQu3btira2toiIaGtri76+vti9e3dlzNatW2NoaChaW1tHfc4AAKNpXLUn8GGcOHEi9u3bV7m8f//+ePnll6OxsTFmzJgRDz74YPz93/99XHvttTFr1qz46le/Gi0tLZVPCl9//fXR2dkZ999/f6xfvz7OnDkTy5cvj0WLFl3wJ4ABAMaqMRmAP/7xj+Nzn/tc5fKKFSsiImLJkiWxYcOG+MpXvhInT56MZcuWRV9fX3zmM5+JTZs2xeWXX165zn/8x3/E8uXL47bbbova2tpYuHBhPPbYY6N+LgAAo23M/x3AavJ3hABg7PH4fQm+BxAAgPcmAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACCZSzYAv/a1r0VNTc2wbfbs2ZXjp06diq6urrjqqqti0qRJsXDhwujt7a3ijAEARsclG4AREZ/85Cfj8OHDle2FF16oHHvooYfiueeei6effjq2b98ehw4dirvuuquKswUAGB3jqj2BkTRu3Lgol8vv2N/f3x//+q//Gk8++WR8/vOfj4iIJ554Iq6//vrYuXNn3HrrraM9VQCAUXNJPwP42muvRUtLS1xzzTWxePHiOHDgQERE7N69O86cORPt7e2VsbNnz44ZM2ZEd3d3taYLADAqLtlnAFtbW2PDhg1x3XXXxeHDh2PNmjXx2c9+Nl555ZXo6emJCRMmRENDw7DrNDc3R09Pz7ve5uDgYAwODlYuDwwMjNT0AQBGzCUbgAsWLKh8fdNNN0Vra2vMnDkzvve978XEiRM/1G2uXbs21qxZc7GmCABQFZf0S8Bv19DQEJ/4xCdi3759US6X4/Tp09HX1zdsTG9v73nfM/iWlStXRn9/f2U7ePDgCM8aAODiSxOAJ06ciNdffz2mTZsW8+bNi/Hjx8eWLVsqx/fu3RsHDhyItra2d72Nurq6KJVKwzYAgLHmkn0J+JFHHok77rgjZs6cGYcOHYrVq1fHZZddFvfcc0/U19fH0qVLY8WKFdHY2BilUim+9KUvRVtbm08AAwCXvEs2AN94442455574ujRozF16tT4zGc+Ezt37oypU6dGRMQ///M/R21tbSxcuDAGBwejo6MjvvWtb1V51gAAI6+mKIqi2pMYqwYGBqK+vj76+/u9HAwAY4TH70TvAQQA4DcEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkkkfgOvWrYuPfexjcfnll0dra2v86Ec/qvaUAABGVOoA/O53vxsrVqyI1atXx09+8pOYO3dudHR0xJEjR6o9NQCAEZM6AL/xjW/E/fffH/fdd1/MmTMn1q9fH1dccUX827/9W7WnBgAwYsZVewLVcvr06di9e3esXLmysq+2tjba29uju7v7vNcZHByMwcHByuX+/v6IiBgYGBjZyQIAF81bj9tFUVR5JtWTNgB/+ctfxrlz56K5uXnY/ubm5vj5z39+3uusXbs21qxZ847906dPH5E5AgAj5/jx41FfX1/taVRF2gD8MFauXBkrVqyoXO7r64uZM2fGgQMH0v4AjTUDAwMxffr0OHjwYJRKpWpPhwtk3cYeazb2ZFqzoiji+PHj0dLSUu2pVE3aAJwyZUpcdtll0dvbO2x/b29vlMvl816nrq4u6urq3rG/vr7+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' width=640.0/>\n", " </div>\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib ipympl\n", "class Cursor(object):\n", " def __init__(self, ax):\n", " self.ax = ax\n", " self.xn = 227\n", " self.yn = 227\n", " self.theta = 45\n", " self.blen = 50\n", " self.bwid = 25\n", " self.laa = 0.5\n", " self.fgval = 1\n", " self.bgval = -1\n", "\n", " # text location in axes coords\n", " self.txt = ax.text(15, 15, '', transform=ax.transAxes)\n", "\n", " def mouse_move(self, event):\n", " if not event.inaxes:\n", " return\n", "\n", " x, y = event.xdata, event.ydata\n", " bar = draw_bar(self.xn, self.yn, x, y, self.theta,\n", " self.blen, self.bwid, self.laa, self.fgval, self.bgval)\n", " self.txt.set_text('x=%1.2f, y=%1.2f' % (x, y))\n", " self.ax.imshow(bar, cmap='gray')\n", " \n", " \n", "\n", "fig, ax = plt.subplots()\n", "cursor = Cursor(ax)\n", "plt.connect('motion_notify_event', cursor.mouse_move)\n", "\n", "# ax.plot(t, s, 'o')\n", "plt.axis([0, 227, 0, 227])\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "93ec8a6a950c4dd5a732b4c39973d823", "version_major": 2, "version_minor": 0 }, "image/png": "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", "text/html": [ "\n", " <div style=\"display: inline-block;\">\n", " <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n", " Figure\n", " </div>\n", " <img src='data:image/png;base64,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' width=640.0/>\n", " </div>\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "x = 0, y = 0\n" ] } ], "source": [ "# from __future__ import print_function\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "%matplotlib ipympl\n", "\n", "\n", "class Cursor(object):\n", " def __init__(self, ax):\n", " self.ax = ax\n", " self.lx = ax.axhline(color='k') # the horiz line\n", " self.ly = ax.axvline(color='k') # the vert line\n", " self.x = 0\n", " self.y = 0\n", "\n", " # text location in axes coords\n", " self.txt = ax.text(0.7, 0.9, '', transform=ax.transAxes)\n", "\n", " def mouse_move(self, event):\n", " if not event.inaxes:\n", " return\n", "\n", " self.x, self.y = event.xdata, event.ydata\n", " # update the line positions\n", " self.lx.set_ydata(self.y)\n", " self.ly.set_xdata(self.x)\n", " \n", " # bar = draw_bar(self.xn, self.yn, x, y, self.theta,\n", " # self.blen, self.bwid, self.laa, self.fgval, self.bgval)\n", " # bar = np.random.rand((100,100))\n", " # self.ax.imshow(, cmap='gray')\n", "\n", " self.txt.set_text('x=%1.2f, y=%1.2f' % (self.x, self.y))\n", " plt.draw()\n", " \n", " def print_xy(self):\n", " print(f\"x = {self.x}, y = {self.y}\")\n", "\n", "t = np.arange(0.0, 1.0, 0.01)\n", "s = np.sin(2*2*np.pi*t)\n", "fig, ax = plt.subplots()\n", "\n", "cursor = Cursor(ax)\n", "# cursor = SnaptoCursor(ax, t, s)\n", "plt.connect('motion_notify_event', cursor.mouse_move)\n", "\n", "# ax.plot(t, s, 'o')\n", "plt.axis([0, 10, 0, 10])\n", "plt.show()\n", "\n", "cursor.print_xy()" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8d03fd0edbf84f03ab83a21e310827cc", "version_major": 2, "version_minor": 0 }, "image/png": "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5TkFBQXxzjvvdKzn5OR064wAAEeDrAnAQYMGdVpfsGBBnHrqqXHppZd2eU5OTk4UFRV192gAAEeVrPkI+A/t378/nnrqqbj++usP+VSvqakpTj755CgpKYmrrroqfvnLX/bglAAAmZGVAbhixYr46KOP4rrrruvymBEjRsTSpUvjxRdfjKeeeira2tpi/PjxsXv37i7PaWlpicbGxk4LAEBvk5UB+Pjjj0dZWVkUFxd3ecy4ceNixowZMXr06Lj00kvj+eefj0GDBsWjjz7a5TmVlZVRWFjYsZSUlHTH+AAA3SrrAnDnzp3x6quvxo033nhY5x1zzDFx3nnnxbZt27o8pqKiIhoaGjqWXbt2fdFxAQB6XNYF4BNPPBGDBw+OKVOmHNZ5ra2t8fbbb8fQoUO7PCYvLy8KCgo6LQAAvU1WBWBbW1s88cQTMXPmzOjbt/MPOM+YMSMqKio61u+99974t3/7t3j33Xdj06ZN8e1vfzt27tx52E8OAQB6m6z5NTAREa+++mrU1tbG9ddff8C+2tra6NPn97374YcfxuzZs6Ouri6OO+64GDNmTKxduzbOOuusnhwZAKDHZVUAXn755dHe3n7Qfa+99lqn9YcffjgefvjhHpgKAODoklUfAQMA8OkEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBi+mZ6AAC637B5L2d6hE5qFkzJ9AiQNE8AAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASkxUBeM8990ROTk6n5YwzzjjkOc8991ycccYZkZ+fH+eee2688sorPTQtAEBmZUUARkScffbZsWfPno7l9ddf7/LYtWvXxrRp0+KGG26It956K6ZOnRpTp06NzZs39+DEAACZkTUB2Ldv3ygqKupYBg4c2OWxP/zhD+OKK66I2267Lc4888y477774vzzz49Fixb14MQAAJmRNQG4devWKC4ujlNOOSWmT58etbW1XR67bt26mDRpUqdtkydPjnXr1h3yNVpaWqKxsbHTAgDQ22RFAJaWlsayZcti5cqVsWTJktixY0dccskl8fHHHx/0+Lq6uhgyZEinbUOGDIm6urpDvk5lZWUUFhZ2LCUlJUfsHgAAekpWBGBZWVlcc801MXLkyJg8eXK88sor8dFHH8Wzzz57RF+noqIiGhoaOpZdu3Yd0esDAPSEvpkeoDsce+yxcfrpp8e2bdsOur+oqCjq6+s7bauvr4+ioqJDXjcvLy/y8vKO2JwAAJmQFU8A/1hTU1Ns3749hg4detD948aNi6qqqk7bVq1aFePGjeuJ8QAAMiorAvDWW2+N1atXR01NTaxduzauvvrqyM3NjWnTpkVExIwZM6KioqLj+JtvvjlWrlwZDz74YGzZsiXuueee2LBhQ8ydOzdTtwAA0GOy4iPg3bt3x7Rp0+KDDz6IQYMGxcUXXxzr16+PQYMGRUREbW1t9Onz+9YdP358PP3003HHHXfE7bffHqeddlqsWLEizjnnnEzdAgBAj8mKAFy+fPkh97/22msHbLvmmmvimmuu6aaJAACOXlnxETAAAJ9dVjwB5OgybN7LmR6hk5oFUzI9AgAcVTwBBABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEhM30wPAAAcHYbNeznTI3RSs2BKpkfIWp4AAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACQmKwKwsrIyLrjgghgwYEAMHjw4pk6dGu+8884hz1m2bFnk5OR0WvLz83toYgCAzMmKAFy9enXMmTMn1q9fH6tWrYpPPvkkLr/88mhubj7keQUFBbFnz56OZefOnT00MQBA5mTFn4JbuXJlp/Vly5bF4MGDY+PGjfG1r32ty/NycnKiqKiou8cDADiqZMUTwD/W0NAQERHHH3/8IY9ramqKk08+OUpKSuKqq66KX/7yl4c8vqWlJRobGzstAAC9TdYFYFtbW9xyyy1x0UUXxTnnnNPlcSNGjIilS5fGiy++GE899VS0tbXF+PHjY/fu3V2eU1lZGYWFhR1LSUlJd9wCAEC3yroAnDNnTmzevDmWL19+yOPGjRsXM2bMiNGjR8ell14azz//fAwaNCgeffTRLs+pqKiIhoaGjmXXrl1HenwAgG6XFd8B/J25c+fGSy+9FGvWrIkTTzzxsM495phj4rzzzott27Z1eUxeXl7k5eV90TEBADIqK54Atre3x9y5c+OFF16In/3sZzF8+PDDvkZra2u8/fbbMXTo0G6YEADg6JEVTwDnzJkTTz/9dLz44osxYMCAqKuri4iIwsLC6N+/f0REzJgxI77yla9EZWVlRETce++98Sd/8ifx1a9+NT766KN44IEHYufOnXHjjTdm7D4AAHpCVgTgkiVLIiJiwoQJnbY/8cQTcd1110VERG1tbfTp8/sHnh9++GHMnj076urq4rjjjosxY8bE2rVr46yzzuqpsQEAMiIrArC9vf1Tj3nttdc6rT/88MPx8MMPd9NEAABHr6z4DiAAAJ+dAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEhMVgXg4sWLY9iwYZGfnx+lpaXxxhtvHPL45557Ls4444zIz8+Pc889N1555ZUemhQAIHOyJgCfeeaZKC8vj7vvvjs2bdoUo0aNismTJ8fevXsPevzatWtj2rRpccMNN8Rbb70VU6dOjalTp8bmzZt7eHIAgJ6VNQH40EMPxezZs2PWrFlx1llnxSOPPBJf+tKXYunSpQc9/oc//GFcccUVcdttt8WZZ54Z9913X5x//vmxaNGiHp4cAKBn9c30AEfC/v37Y+PGjVFRUdGxrU+fPjFp0qRYt27dQc9Zt25dlJeXd9o2efLkWLFiRZev09LSEi0tLR3rDQ0NERHR2Nj4BabvWlvLb7rlup/XZ71Pcx8Z5u5Z5u5Z5u5Z2T73571ue3t7t1y/N8iKANy3b1+0trbGkCFDOm0fMmRIbNmy5aDn1NXVHfT4urq6Ll+nsrIy5s+ff8D2kpKSzzF171O4MNMTfD7m7lnm7lnm7lnm7lndPffHH38chYWF3fsiR6msCMCeUlFR0empYVtb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", "text/html": [ "\n", " <div style=\"display: inline-block;\">\n", " <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n", " Figure\n", " </div>\n", " <img src='data:image/png;base64,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5TkFBQXxzjvvdKzn5OR064wAAEeDrAnAQYMGdVpfsGBBnHrqqXHppZd2eU5OTk4UFRV192gAAEeVrPkI+A/t378/nnrqqbj++usP+VSvqakpTj755CgpKYmrrroqfvnLX/bglAAAmZGVAbhixYr46KOP4rrrruvymBEjRsTSpUvjxRdfjKeeeira2tpi/PjxsXv37i7PaWlpicbGxk4LAEBvk5UB+Pjjj0dZWVkUFxd3ecy4ceNixowZMXr06Lj00kvj+eefj0GDBsWjjz7a5TmVlZVRWFjYsZSUlHTH+AAA3SrrAnDnzp3x6quvxo033nhY5x1zzDFx3nnnxbZt27o8pqKiIhoaGjqWXbt2fdFxAQB6XNYF4BNPPBGDBw+OKVOmHNZ5ra2t8fbbb8fQoUO7PCYvLy8KCgo6LQAAvU1WBWBbW1s88cQTMXPmzOjbt/MPOM+YMSMqKio61u+99974t3/7t3j33Xdj06ZN8e1vfzt27tx52E8OAQB6m6z5NTAREa+++mrU1tbG9ddff8C+2tra6NPn97374YcfxuzZs6Ouri6OO+64GDNmTKxduzbOOuusnhwZAKDHZVUAXn755dHe3n7Qfa+99lqn9YcffjgefvjhHpgKAODoklUfAQMA8OkEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBi+mZ6AAC637B5L2d6hE5qFkzJ9AiQNE8AAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASkxUBeM8990ROTk6n5YwzzjjkOc8991ycccYZkZ+fH+eee2688sorPTQtAEBmZUUARkScffbZsWfPno7l9ddf7/LYtWvXxrRp0+KGG26It956K6ZOnRpTp06NzZs39+DEAACZkTUB2Ldv3ygqKupYBg4c2OWxP/zhD+OKK66I2267Lc4888y477774vzzz49Fixb14MQAAJmRNQG4devWKC4ujlNOOSWmT58etbW1XR67bt26mDRpUqdtkydPjnXr1h3yNVpaWqKxsbHTAgDQ22RFAJaWlsayZcti5cqVsWTJktixY0dccskl8fHHHx/0+Lq6uhgyZEinbUOGDIm6urpDvk5lZWUUFhZ2LCUlJUfsHgAAekpWBGBZWVlcc801MXLkyJg8eXK88sor8dFHH8Wzzz57RF+noqIiGhoaOpZdu3Yd0esDAPSEvpkeoDsce+yxcfrpp8e2bdsOur+oqCjq6+s7bauvr4+ioqJDXjcvLy/y8vKO2JwAAJmQFU8A/1hTU1Ns3749hg4detD948aNi6qqqk7bVq1aFePGjeuJ8QAAMiorAvDWW2+N1atXR01NTaxduzauvvrqyM3NjWnTpkVExIwZM6KioqLj+JtvvjlWrlwZDz74YGzZsiXuueee2LBhQ8ydOzdTtwAA0GOy4iPg3bt3x7Rp0+KDDz6IQYMGxcUXXxzr16+PQYMGRUREbW1t9Onz+9YdP358PP3003HHHXfE7bffHqeddlqsWLEizjnnnEzdAgBAj8mKAFy+fPkh97/22msHbLvmmmvimmuu6aaJAACOXlnxETAAAJ9dVjwB5OgybN7LmR6hk5oFUzI9AgAcVTwBBABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEhM30wPAAAcHYbNeznTI3RSs2BKpkfIWp4AAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACQmKwKwsrIyLrjgghgwYEAMHjw4pk6dGu+8884hz1m2bFnk5OR0WvLz83toYgCAzMmKAFy9enXMmTMn1q9fH6tWrYpPPvkkLr/88mhubj7keQUFBbFnz56OZefOnT00MQBA5mTFn4JbuXJlp/Vly5bF4MGDY+PGjfG1r32ty/NycnKiqKiou8cDADiqZMUTwD/W0NAQERHHH3/8IY9ramqKk08+OUpKSuKqq66KX/7yl4c8vqWlJRobGzstAAC9TdYFYFtbW9xyyy1x0UUXxTnnnNPlcSNGjIilS5fGiy++GE899VS0tbXF+PHjY/fu3V2eU1lZGYWFhR1LSUlJd9wCAEC3yroAnDNnTmzevDmWL19+yOPGjRsXM2bMiNGjR8ell14azz//fAwaNCgeffTRLs+pqKiIhoaGjmXXrl1HenwAgG6XFd8B/J25c+fGSy+9FGvWrIkTTzzxsM495phj4rzzzott27Z1eUxeXl7k5eV90TEBADIqK54Atre3x9y5c+OFF16In/3sZzF8+PDDvkZra2u8/fbbMXTo0G6YEADg6JEVTwDnzJkTTz/9dLz44osxYMCAqKuri4iIwsLC6N+/f0REzJgxI77yla9EZWVlRETce++98Sd/8ifx1a9+NT766KN44IEHYufOnXHjjTdm7D4AAHpCVgTgkiVLIiJiwoQJnbY/8cQTcd1110VERG1tbfTp8/sHnh9++GHMnj076urq4rjjjosxY8bE2rVr46yzzuqpsQEAMiIrArC9vf1Tj3nttdc6rT/88MPx8MMPd9NEAABHr6z4DiAAAJ+dAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEhMVgXg4sWLY9iwYZGfnx+lpaXxxhtvHPL45557Ls4444zIz8+Pc889N1555ZUemhQAIHOyJgCfeeaZKC8vj7vvvjs2bdoUo0aNismTJ8fevXsPevzatWtj2rRpccMNN8Rbb70VU6dOjalTp8bmzZt7eHIAgJ6VNQH40EMPxezZs2PWrFlx1llnxSOPPBJf+tKXYunSpQc9/oc//GFcccUVcdttt8WZZ54Z9913X5x//vmxaNGiHp4cAKBn9c30AEfC/v37Y+PGjVFRUdGxrU+fPjFp0qRYt27dQc9Zt25dlJeXd9o2efLkWLFiRZev09LSEi0tLR3rDQ0NERHR2Nj4BabvWlvLb7rlup/XZ71Pcx8Z5u5Z5u5Z5u5Z2T73571ue3t7t1y/N8iKANy3b1+0trbGkCFDOm0fMmRIbNmy5aDn1NXVHfT4urq6Ll+nsrIy5s+ff8D2kpKSzzF171O4MNMTfD7m7lnm7lnm7lnm7lndPffHH38chYWF3fsiR6msCMCeUlFR0empYVtb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' width=640.0/>\n", " </div>\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "class DraggableRectangle:\n", " def __init__(self, rect):\n", " self.rect = rect\n", " self.press = None\n", "\n", " def connect(self):\n", " 'connect to all the events we need'\n", " self.cidpress = self.rect.figure.canvas.mpl_connect(\n", " 'button_press_event', self.on_press)\n", " self.cidrelease = self.rect.figure.canvas.mpl_connect(\n", " 'button_release_event', self.on_release)\n", " self.cidmotion = self.rect.figure.canvas.mpl_connect(\n", " 'motion_notify_event', self.on_motion)\n", "\n", " def on_press(self, event):\n", " 'on button press we will see if the mouse is over us and store some data'\n", " if event.inaxes != self.rect.axes: return\n", "\n", " contains, attrd = self.rect.contains(event)\n", " if not contains: return\n", " print('event contains', self.rect.xy)\n", " x0, y0 = self.rect.xy\n", " self.press = x0, y0, event.xdata, event.ydata\n", "\n", " def on_motion(self, event):\n", " 'on motion we will move the rect if the mouse is over us'\n", " if self.press is None: return\n", " if event.inaxes != self.rect.axes: return\n", " x0, y0, xpress, ypress = self.press\n", " dx = event.xdata - xpress\n", " dy = event.ydata - ypress\n", " #print('x0=%f, xpress=%f, event.xdata=%f, dx=%f, x0+dx=%f' %\n", " # (x0, xpress, event.xdata, dx, x0+dx))\n", " self.rect.set_x(x0+dx)\n", " self.rect.set_y(y0+dy)\n", "\n", " self.rect.figure.canvas.draw()\n", "\n", "\n", " def on_release(self, event):\n", " 'on release we reset the press data'\n", " self.press = None\n", " self.rect.figure.canvas.draw()\n", "\n", " def disconnect(self):\n", " 'disconnect all the stored connection ids'\n", " self.rect.figure.canvas.mpl_disconnect(self.cidpress)\n", " self.rect.figure.canvas.mpl_disconnect(self.cidrelease)\n", " self.rect.figure.canvas.mpl_disconnect(self.cidmotion)\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "rects = ax.bar(range(10), 20*np.random.rand(10))\n", "drs = []\n", "for rect in rects:\n", " dr = DraggableRectangle(rect)\n", " dr.connect()\n", " drs.append(dr)\n", "\n", "plt.show()" ] } ], "metadata": { "interpreter": { "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" }, "kernelspec": { "display_name": "Python 3.9.1 64-bit", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.1" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }