summaryrefslogtreecommitdiff
path: root/megapixels/notebooks/face_analysis/3d_face_plot.ipynb
blob: 537e471bcc8c78c8d408e9b8c526476017bca979 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3D Face Plot\n",
    "\n",
    "Attenzione visualization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'face_alignment'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m-------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m               Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-1-c83e215f6ccb>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     16\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mrandom\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mrandint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     17\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'/work/megapixels_dev/3rdparty/face-alignment'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mface_alignment\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     19\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     20\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mmpl_toolkits\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmplot3d\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mAxes3D\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'face_alignment'"
     ]
    }
   ],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "import os\n",
    "from os.path import join\n",
    "import sys\n",
    "import time\n",
    "import cv2 as cv\n",
    "import numpy as np\n",
    "import imutils\n",
    "import matplotlib.animation\n",
    "%matplotlib notebook\n",
    "from glob import glob\n",
    "from matplotlib import cbook\n",
    "from matplotlib import cm\n",
    "from matplotlib.colors import LightSource\n",
    "from random import randint\n",
    "sys.path.append('/work/megapixels_dev/3rdparty/face-alignment')\n",
    "import face_alignment\n",
    "import numpy as np\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "import matplotlib.pyplot as plt\n",
    "import mpl_toolkits.mplot3d.axes3d as p3\n",
    "from matplotlib import animation\n",
    "import random\n",
    "from skimage import io"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generate random hex colors\n",
    "def rhex():\n",
    "  r = lambda: random.randint(0,255)\n",
    "  return '#%02X%02X%02X' % (r(), r(), r())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "# init 3d face\n",
    "# Run the 3D face alignment on a test image, without CUDA.\n",
    "fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._3D, \n",
    "                                  enable_cuda=True, flip_input=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "80\n"
     ]
    }
   ],
   "source": [
    "data_bodega = '../data_bodega/'\n",
    "fp = join(data_bodega,'images/msceleb/**/*.jpg')\n",
    "face_files = glob(fp,recursive=True)\n",
    "face_files = [f for f in face_files if os.path.basename(f) == '0-FaceId-0.jpg']\n",
    "print(len(face_files))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../data_bodega/images/msceleb/m.0k014/0-FaceId-0.jpg\n"
     ]
    }
   ],
   "source": [
    "fp_face = face_files[randint(0,len(face_files)-1)]\n",
    "im = io.imread(fp_face)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "preds = fa.get_landmarks(im)[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(31.0, 256.0) (97.0, 293.0) (-101.42858, 71.526764)\n"
     ]
    }
   ],
   "source": [
    "xmm = (np.min(preds[:,0]),np.max(preds[:,0]))\n",
    "ymm = (np.min(preds[:,1]),np.max(preds[:,1]))\n",
    "zmm = (np.min(preds[:,2]),np.max(preds[:,2]))\n",
    "print(xmm,ymm,zmm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # draw person\n",
    "# fig = plt.figure(figsize=plt.figaspect(.5))\n",
    "# ax = fig.add_subplot(1, 2, 1)\n",
    "# ax.imshow(im)\n",
    "# ax.plot(preds[0:17,0],preds[0:17,1],marker='o',markersize=6,linestyle='-',color='w',lw=2)\n",
    "# ax.plot(preds[17:22,0],preds[17:22,1],marker='o',markersize=6,linestyle='-',color='w',lw=2)\n",
    "# ax.plot(preds[22:27,0],preds[22:27,1],marker='o',markersize=6,linestyle='-',color='w',lw=2)\n",
    "# ax.plot(preds[27:31,0],preds[27:31,1],marker='o',markersize=6,linestyle='-',color='w',lw=2)\n",
    "# ax.plot(preds[31:36,0],preds[31:36,1],marker='o',markersize=6,linestyle='-',color='w',lw=2)\n",
    "# ax.plot(preds[36:42,0],preds[36:42,1],marker='o',markersize=6,linestyle='-',color='w',lw=2)\n",
    "# ax.plot(preds[42:48,0],preds[42:48,1],marker='o',markersize=6,linestyle='-',color='w',lw=2)\n",
    "# ax.plot(preds[48:60,0],preds[48:60,1],marker='o',markersize=6,linestyle='-',color='w',lw=2)\n",
    "# ax.plot(preds[60:68,0],preds[60:68,1],marker='o',markersize=6,linestyle='-',color='w',lw=2) \n",
    "# ax.axis('off')\n",
    "# plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "preds_orig = preds.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "xmm_sc = (1.2*np.min(preds[:,0]),1.2*np.max(preds_orig[:,0]))\n",
    "xmm = (np.min(preds_orig[:,0]),np.max(preds_orig[:,0]))\n",
    "ymm = (np.min(preds_orig[:,1]),np.max(preds_orig[:,1]))\n",
    "zmm = (np.min(preds_orig[:,2]),np.max(preds_orig[:,2]))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "#$preds = np.array( [p[0]-xmm[0], p[1]-ymm[1], p[2]-zmm[0]] for p in preds_orig)\n",
    "preds = np.zeros_like(preds_orig).astype(np.uint8)\n",
    "for i,p in enumerate(preds_orig):\n",
    "  x,y,z = p\n",
    "  preds[i] = np.array([x - xmm[0], y - ymm[0], z - zmm[0]])\n",
    "  preds[i] = np.array([x - xmm[0], z - zmm[0], y - ymm[0]])\n",
    "  #preds[i] = np.array([x - xmm[0], abs((z - zmm[0])+zmm[0]), y - ymm[0]])\n",
    "  \n",
    "#preds = np.rot90(preds,2,axes=(0,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,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FisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKREREROQpxBUA+GM9GJCc4GCxEhERERF5CnEFAP5YDwYkJzhYrEREREREnkJcAYA/1oMByQkOFisRERERkacQVwDgj/VgQHKCg8VKRFSoYd3Tuv+sq/XKzDu1atKV2qfrAPMzERHRnhHiCgD8sR4MSE5wsFiJiP66UelDtHnuajU1ZvNtnrtaR/c/wPxsRERU/CGuAMAf68GA5AQHi5WI6MulQkqvzrxLTY1Zvbj0ea246n09dvmrzf99+u3m5yMiouIPcQUA/lgPBiQnOFisRERfrltdB22Ys1KfNGZ1xLX/rXQmp4uX/UpNjVltmLNS7WrqzM9IRETFHeIKAPyxHgxITnCwWImIvlybqlbaMGelmhqzWnT1J0pnchp23Z/008a12tiwSjXlVeZnJKLirHfbLpp2yHhNHT5O3dt0Mj8P2YW4AgB/rAcDkhMcLFYior/uwbOX66PFa/TE5S8rnckpncnpwaWv6J7TLzc/GxEVZwuOOkebGlbp48WP6aPFj2lTw2pNP3SC+bnIJsQVAPhjPRiQnOBgsRLtTvVt101Duw5UZVmF+VmKufY1bbRu6k3aOPd+HXztH5XO5HRe43uqr25tfjYiKr6GdU/rrbn36ZPGrD5ofFIbLntWHzWu1ea5qzWoY2/z81H8EFcA4I/1YEBygoPFSrQ71LO+s56beqM2NKzUpoZV2jBnpc494CTzcxVzqZDS8N5DNGLqM0pncuq/9F8UUiXm5yKi4us7J89VU2NWj37ztfyzDF9Zul5NjVldOXKq+fkofogrAPDHejAgOcHBYiXyXsfaer02664WHy3e1JjVW3Pv04g+Q83PV+zVDBqZvxCr7nOY+XmIqPi6Y2Kjmhqzevby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fqLAYZWkldBJT73+/n/a5Na/SH+WldCmRzynnXPoE8d+ov2mP25bHvOi9OeSdHzEWAHUkz0M9BMFDqskrYR2XPrmdvDI0bb71b+Z/ixzbtXmHe2My+5e9hPtp73gLW3Vxu3pzybp+ImxAqgnexjoJwocVklaCe284r33/6tGL3ln+rPMta0Xvqztu+VPj/1E+/X3to37n5H+XJKOvxgrgHqyh4F+osBhlaQ5t2nthvbap1zWnnz7n7WDR462S779XW3N4ur055pTa07e38668n3HfqL98H3tlGcfaQtrNqY/m6TjM8YKoJ7sYaCfKHBYJWmurV+9tv3Cld/fPnL93e28u+5rB48cbXfe9F/b2198R1uIhfTnO+5bXN1OuuS72v7b/3rpo8/ZV3+4rTvjgvxnk3Rcx1gB1JM9DPQTBQ6rJM21yx/77PZbr3t7+5Ub3rP0YeKtb/iV9uHXvLU9afdj0p/veG79WY9ru6/5jS/4ifa/bCdefG2LxVXpzybp+I+xAqgnexjoJwocVkmaaz992e3t3kP3tHff9EtLHyh+8OYPtXsP3dNue9bL05/veOixOx/R3vGSu9ovX/Uj7d99+/e2Z5731e2U53zPsp9o33nFL7Q1J52T/qyS5hNjBVBP9jDQTxQ4rJI0137gG65v9x66p33k0Dvb4w9/th08crSdf9d97Z4b3teuudhPi3+pnnLOBe1Dr/6Jdu+he9q9h+5pb3vD+9sT7/zM0geffTf/n3bCV74k/TklzS/GCqCe7GGgnyhwWCVprj125yPah1/91nbvoXvae258X3vMXZ9rB48cbRcc/mw7a++T05+ver/4nf+63XvonvaBG97TrrztE8t+ov3MF72trdp0SvozSppnjBVAPdnDQD9R4LBK0px71ZNf2H7tmh9vH73+Z9vbbviP7ZF/94c8n3Po99vqbbvSn69qa1etae98zc+1q277vXbeXcf+ta4nH/7L9kPX/ft27qm7059R0nxjrADqyR4G+okCh1WS5t6pm09qL3jMM9qlj3pq2/GVly/9+TR7rv1oW7Xp5PTnq9a60x7dzviWt7dz7/q/Sx98HnnX59t1t/5u+61D72q/+qq3tB1bTkp/TknzjbECqCd7GOgnChxWSVppbbvo5UsfNHa98lfbwtpN6c9UofW7Lmpnftu7lv0rXY+667527a33tg/c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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgOPb/wPSUftx+Ms3tgAAAABJRU5ErkJggg==\" width=\"1437.5\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(31.0, 256.0) (97.0, 293.0) (-101.42858, 71.526764)\n",
      "143.0 195.0 -15.428581237792969\n"
     ]
    }
   ],
   "source": [
    "#TODO: Make this nice\n",
    "fig = plt.figure(figsize=(16,16),dpi=72)\n",
    "ax = fig.add_subplot(111, projection='3d')\n",
    "\n",
    "preds_scaled = np.array([1.2*x,y,z] for x,y,z in preds)\n",
    "\n",
    "preds_plot = np.zeros_like(preds)\n",
    "for i,p in enumerate(preds):\n",
    "  x,y,z = p\n",
    "  preds_plot[i] = np.array([x,y,z])\n",
    "\n",
    "clr1 = '#00ff00'\n",
    "clr2 = '#00ff00'\n",
    "\n",
    "clr1 = '#ff0000'\n",
    "clr2 = '#ff0000'\n",
    "\n",
    "ax.set_facecolor('black')\n",
    "#ax.set_facecolor((1, 0, 0))\n",
    "\n",
    "ls = LightSource(270, 45)\n",
    "# To use a custom hillshading mode, override the built-in shading and pass\n",
    "# in the rgb colors of the shaded surface calculated from \"shade\".\n",
    "#rgb = ls.shade(preds[:,1], cmap=cm.gist_earth, vert_exag=0.1, blend_mode='soft')\n",
    "rh = rhex()\n",
    "surf = ax.scatter(preds_plot[:,0]*1.2,preds_plot[:,1],preds_plot[:,2],c=rh, \n",
    "                  alpha=1.0, s=65, edgecolor=rh)\n",
    "#facecolors=rgb,linewidth=0, antialiased=False, shade=Fals\n",
    "\n",
    "\n",
    "#surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb,\n",
    "#                       linewidth=0, antialiased=False, shade=False)\n",
    "\n",
    "\n",
    "#surf.actor.property.specular = 0.1\n",
    "#surf.actor.property.specular_power = 5\n",
    "\n",
    "lw = 3\n",
    "ax.plot3D(preds_plot[:17,0]*1.2,preds_plot[:17,1], preds_plot[:17,2], color=rhex(),linewidth=lw)\n",
    "ax.plot3D(preds_plot[17:22,0]*1.2,preds_plot[17:22,1],preds_plot[17:22,2], color=rhex(),linewidth=lw)\n",
    "ax.plot3D(preds_plot[22:27,0]*1.2,preds_plot[22:27,1],preds_plot[22:27,2], color=rhex(),linewidth=lw)\n",
    "ax.plot3D(preds_plot[27:31,0]*1.2,preds_plot[27:31,1],preds_plot[27:31,2], color=rhex(),linewidth=lw)\n",
    "ax.plot3D(preds_plot[31:36,0]*1.2,preds_plot[31:36,1],preds_plot[31:36,2], color=rhex(),linewidth=lw)\n",
    "ax.plot3D(preds_plot[36:42,0]*1.2,preds_plot[36:42,1],preds_plot[36:42,2], color=rhex(),linewidth=lw)\n",
    "ax.plot3D(preds_plot[42:48,0]*1.2,preds_plot[42:48,1],preds_plot[42:48,2], color=rhex(),linewidth=lw)\n",
    "ax.plot3D(preds_plot[48:,0]*1.2,preds_plot[48:,1],preds_plot[48:,2], color=rhex(), linewidth=lw)\n",
    "\n",
    "\n",
    "print(xmm,ymm,zmm)\n",
    "# ax.set_xlim3d(left=xmm[0],right=xmm[1])\n",
    "# ax.set_ylim3d(bottom=ymm[0],top=ymm[1])\n",
    "# ax.set_zlim3d(bottom=zmm[0],top=zmm[1])\n",
    "\n",
    "cx = ((xmm[0] - xmm[1]) // 2) + xmm[1]\n",
    "cy = ((ymm[1] - ymm[0]) // 2) + ymm[0]\n",
    "cz = ((zmm[1] - zmm[0]) // 2) + zmm[0]\n",
    "print(cx,cy,cz)\n",
    "\n",
    "xpts = [cx,cx]\n",
    "ypts = [cy,cy]\n",
    "zpts = [zmm[0],zmm[1]]\n",
    "\n",
    "#ax.plot3D(xpts,ypts,zpts,color='red')\n",
    "\n",
    "# need to make this dynamic, sigh\n",
    "ax.view_init(elev=120., azim=70.)\n",
    "#ax.view_init(elev=90., azim=40.)\n",
    "\n",
    "margin = 20\n",
    "\n",
    "#ax.set_xlim(xmm[0] - margin,xmm[1] + margin)\n",
    "#ax.set_ylim(ymm[0] - margin,ymm[1] + margin)\n",
    "#ax.set_zlim(zmm[0] - margin,zmm[1] + margin)\n",
    "\n",
    "ax.set_xticks([])\n",
    "ax.set_yticks([])\n",
    "ax.set_zticks([])\n",
    "ax.set_axis_off()\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_zlabel('z')\n",
    "plt.savefig('test.png', dpi=80)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../data_bodega/output/m.0k014.gif\n"
     ]
    }
   ],
   "source": [
    "fname_out = join(data_bodega,'output', '{}.gif'.format(os.path.basename(os.path.dirname(fp_face))))\n",
    "\n",
    "phi = np.linspace(0, 2*np.pi,60)\n",
    "\n",
    "def update(phi):\n",
    "    ax.view_init(180,phi*180./np.pi)\n",
    "    #ax.view_init(90,phi*90./np.pi)\n",
    "    #ax.view_init(elev=90., azim=90.)\n",
    "\n",
    "ani = matplotlib.animation.FuncAnimation(fig, update, frames=phi)\n",
    "ani.save(fname_out, writer='imagemagick', fps=10)\n",
    "#plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [default]",
   "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.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}