##// END OF EJS Templates
Backport PR #10527: Document _repr_mimebundle_...
Thomas Kluyver -
Show More
@@ -1,1037 +1,1037 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Display formatters.
3 3
4 4 Inheritance diagram:
5 5
6 6 .. inheritance-diagram:: IPython.core.formatters
7 7 :parts: 3
8 8 """
9 9
10 10 # Copyright (c) IPython Development Team.
11 11 # Distributed under the terms of the Modified BSD License.
12 12
13 13 import abc
14 14 import json
15 15 import sys
16 16 import traceback
17 17 import warnings
18 18
19 19 from decorator import decorator
20 20
21 21 from traitlets.config.configurable import Configurable
22 22 from IPython.core.getipython import get_ipython
23 23 from IPython.utils.sentinel import Sentinel
24 24 from IPython.utils.dir2 import get_real_method
25 25 from IPython.lib import pretty
26 26 from traitlets import (
27 27 Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List,
28 28 ForwardDeclaredInstance,
29 29 default, observe,
30 30 )
31 31 from IPython.utils.py3compat import (
32 32 with_metaclass, string_types, unicode_type,
33 33 )
34 34
35 35
36 36 class DisplayFormatter(Configurable):
37 37
38 38 active_types = List(Unicode(),
39 39 help="""List of currently active mime-types to display.
40 40 You can use this to set a white-list for formats to display.
41 41
42 42 Most users will not need to change this value.
43 43 """).tag(config=True)
44 44
45 45 @default('active_types')
46 46 def _active_types_default(self):
47 47 return self.format_types
48 48
49 49 @observe('active_types')
50 50 def _active_types_changed(self, change):
51 51 for key, formatter in self.formatters.items():
52 52 if key in change['new']:
53 53 formatter.enabled = True
54 54 else:
55 55 formatter.enabled = False
56 56
57 57 ipython_display_formatter = ForwardDeclaredInstance('FormatterABC')
58 58 @default('ipython_display_formatter')
59 59 def _default_formatter(self):
60 60 return IPythonDisplayFormatter(parent=self)
61 61
62 62 mimebundle_formatter = ForwardDeclaredInstance('FormatterABC')
63 63 @default('mimebundle_formatter')
64 64 def _default_mime_formatter(self):
65 65 return MimeBundleFormatter(parent=self)
66 66
67 67 # A dict of formatter whose keys are format types (MIME types) and whose
68 68 # values are subclasses of BaseFormatter.
69 69 formatters = Dict()
70 70 @default('formatters')
71 71 def _formatters_default(self):
72 72 """Activate the default formatters."""
73 73 formatter_classes = [
74 74 PlainTextFormatter,
75 75 HTMLFormatter,
76 76 MarkdownFormatter,
77 77 SVGFormatter,
78 78 PNGFormatter,
79 79 PDFFormatter,
80 80 JPEGFormatter,
81 81 LatexFormatter,
82 82 JSONFormatter,
83 83 JavascriptFormatter
84 84 ]
85 85 d = {}
86 86 for cls in formatter_classes:
87 87 f = cls(parent=self)
88 88 d[f.format_type] = f
89 89 return d
90 90
91 91 def format(self, obj, include=None, exclude=None):
92 92 """Return a format data dict for an object.
93 93
94 94 By default all format types will be computed.
95 95
96 96 The following MIME types are usually implemented:
97 97
98 98 * text/plain
99 99 * text/html
100 100 * text/markdown
101 101 * text/latex
102 102 * application/json
103 103 * application/javascript
104 104 * application/pdf
105 105 * image/png
106 106 * image/jpeg
107 107 * image/svg+xml
108 108
109 109 Parameters
110 110 ----------
111 111 obj : object
112 112 The Python object whose format data will be computed.
113 113 include : list, tuple or set; optional
114 114 A list of format type strings (MIME types) to include in the
115 115 format data dict. If this is set *only* the format types included
116 116 in this list will be computed.
117 117 exclude : list, tuple or set; optional
118 118 A list of format type string (MIME types) to exclude in the format
119 119 data dict. If this is set all format types will be computed,
120 120 except for those included in this argument.
121 121 Mimetypes present in exclude will take precedence over the ones in include
122 122
123 123 Returns
124 124 -------
125 125 (format_dict, metadata_dict) : tuple of two dicts
126 126
127 127 format_dict is a dictionary of key/value pairs, one of each format that was
128 128 generated for the object. The keys are the format types, which
129 129 will usually be MIME type strings and the values and JSON'able
130 130 data structure containing the raw data for the representation in
131 131 that format.
132 132
133 133 metadata_dict is a dictionary of metadata about each mime-type output.
134 134 Its keys will be a strict subset of the keys in format_dict.
135 135
136 136 Notes
137 137 -----
138 138
139 139 If an object implement `_repr_mimebundle_` as well as various
140 140 `_repr_*_`, the data returned by `_repr_mimebundle_` will take
141 141 precedence and the corresponding `_repr_*_` for this mimetype will
142 142 not be called.
143 143
144 144 """
145 145 format_dict = {}
146 146 md_dict = {}
147 147
148 148 if self.ipython_display_formatter(obj):
149 149 # object handled itself, don't proceed
150 150 return {}, {}
151 151
152 152 format_dict, md_dict = self.mimebundle_formatter(obj, include=include, exclude=exclude)
153 153
154 154 if format_dict or md_dict:
155 155 if include:
156 156 format_dict = {k:v for k,v in format_dict.items() if k in include}
157 157 md_dict = {k:v for k,v in md_dict.items() if k in include}
158 158 if exclude:
159 159 format_dict = {k:v for k,v in format_dict.items() if k not in exclude}
160 160 md_dict = {k:v for k,v in md_dict.items() if k not in exclude}
161 161
162 162 for format_type, formatter in self.formatters.items():
163 163 if format_type in format_dict:
164 164 # already got it from mimebundle, don't render again
165 165 continue
166 166 if include and format_type not in include:
167 167 continue
168 168 if exclude and format_type in exclude:
169 169 continue
170 170
171 171 md = None
172 172 try:
173 173 data = formatter(obj)
174 174 except:
175 175 # FIXME: log the exception
176 176 raise
177 177
178 178 # formatters can return raw data or (data, metadata)
179 179 if isinstance(data, tuple) and len(data) == 2:
180 180 data, md = data
181 181
182 182 if data is not None:
183 183 format_dict[format_type] = data
184 184 if md is not None:
185 185 md_dict[format_type] = md
186 186 return format_dict, md_dict
187 187
188 188 @property
189 189 def format_types(self):
190 190 """Return the format types (MIME types) of the active formatters."""
191 191 return list(self.formatters.keys())
192 192
193 193
194 194 #-----------------------------------------------------------------------------
195 195 # Formatters for specific format types (text, html, svg, etc.)
196 196 #-----------------------------------------------------------------------------
197 197
198 198
199 199 def _safe_repr(obj):
200 200 """Try to return a repr of an object
201 201
202 202 always returns a string, at least.
203 203 """
204 204 try:
205 205 return repr(obj)
206 206 except Exception as e:
207 207 return "un-repr-able object (%r)" % e
208 208
209 209
210 210 class FormatterWarning(UserWarning):
211 211 """Warning class for errors in formatters"""
212 212
213 213 @decorator
214 214 def catch_format_error(method, self, *args, **kwargs):
215 215 """show traceback on failed format call"""
216 216 try:
217 217 r = method(self, *args, **kwargs)
218 218 except NotImplementedError:
219 219 # don't warn on NotImplementedErrors
220 220 return None
221 221 except Exception:
222 222 exc_info = sys.exc_info()
223 223 ip = get_ipython()
224 224 if ip is not None:
225 225 ip.showtraceback(exc_info)
226 226 else:
227 227 traceback.print_exception(*exc_info)
228 228 return None
229 229 return self._check_return(r, args[0])
230 230
231 231
232 232 class FormatterABC(with_metaclass(abc.ABCMeta, object)):
233 233 """ Abstract base class for Formatters.
234 234
235 235 A formatter is a callable class that is responsible for computing the
236 236 raw format data for a particular format type (MIME type). For example,
237 237 an HTML formatter would have a format type of `text/html` and would return
238 238 the HTML representation of the object when called.
239 239 """
240 240
241 241 # The format type of the data returned, usually a MIME type.
242 242 format_type = 'text/plain'
243 243
244 244 # Is the formatter enabled...
245 245 enabled = True
246 246
247 247 @abc.abstractmethod
248 248 def __call__(self, obj):
249 249 """Return a JSON'able representation of the object.
250 250
251 251 If the object cannot be formatted by this formatter,
252 252 warn and return None.
253 253 """
254 254 return repr(obj)
255 255
256 256
257 257 def _mod_name_key(typ):
258 258 """Return a (__module__, __name__) tuple for a type.
259 259
260 260 Used as key in Formatter.deferred_printers.
261 261 """
262 262 module = getattr(typ, '__module__', None)
263 263 name = getattr(typ, '__name__', None)
264 264 return (module, name)
265 265
266 266
267 267 def _get_type(obj):
268 268 """Return the type of an instance (old and new-style)"""
269 269 return getattr(obj, '__class__', None) or type(obj)
270 270
271 271
272 272 _raise_key_error = Sentinel('_raise_key_error', __name__,
273 273 """
274 274 Special value to raise a KeyError
275 275
276 276 Raise KeyError in `BaseFormatter.pop` if passed as the default value to `pop`
277 277 """)
278 278
279 279
280 280 class BaseFormatter(Configurable):
281 281 """A base formatter class that is configurable.
282 282
283 283 This formatter should usually be used as the base class of all formatters.
284 284 It is a traited :class:`Configurable` class and includes an extensible
285 285 API for users to determine how their objects are formatted. The following
286 286 logic is used to find a function to format an given object.
287 287
288 288 1. The object is introspected to see if it has a method with the name
289 289 :attr:`print_method`. If is does, that object is passed to that method
290 290 for formatting.
291 291 2. If no print method is found, three internal dictionaries are consulted
292 292 to find print method: :attr:`singleton_printers`, :attr:`type_printers`
293 293 and :attr:`deferred_printers`.
294 294
295 295 Users should use these dictionaries to register functions that will be
296 296 used to compute the format data for their objects (if those objects don't
297 297 have the special print methods). The easiest way of using these
298 298 dictionaries is through the :meth:`for_type` and :meth:`for_type_by_name`
299 299 methods.
300 300
301 301 If no function/callable is found to compute the format data, ``None`` is
302 302 returned and this format type is not used.
303 303 """
304 304
305 305 format_type = Unicode('text/plain')
306 306 _return_type = string_types
307 307
308 308 enabled = Bool(True).tag(config=True)
309 309
310 310 print_method = ObjectName('__repr__')
311 311
312 312 # The singleton printers.
313 313 # Maps the IDs of the builtin singleton objects to the format functions.
314 314 singleton_printers = Dict().tag(config=True)
315 315
316 316 # The type-specific printers.
317 317 # Map type objects to the format functions.
318 318 type_printers = Dict().tag(config=True)
319 319
320 320 # The deferred-import type-specific printers.
321 321 # Map (modulename, classname) pairs to the format functions.
322 322 deferred_printers = Dict().tag(config=True)
323 323
324 324 @catch_format_error
325 325 def __call__(self, obj):
326 326 """Compute the format for an object."""
327 327 if self.enabled:
328 328 # lookup registered printer
329 329 try:
330 330 printer = self.lookup(obj)
331 331 except KeyError:
332 332 pass
333 333 else:
334 334 return printer(obj)
335 335 # Finally look for special method names
336 336 method = get_real_method(obj, self.print_method)
337 337 if method is not None:
338 338 return method()
339 339 return None
340 340 else:
341 341 return None
342 342
343 343 def __contains__(self, typ):
344 344 """map in to lookup_by_type"""
345 345 try:
346 346 self.lookup_by_type(typ)
347 347 except KeyError:
348 348 return False
349 349 else:
350 350 return True
351 351
352 352 def _check_return(self, r, obj):
353 353 """Check that a return value is appropriate
354 354
355 355 Return the value if so, None otherwise, warning if invalid.
356 356 """
357 357 if r is None or isinstance(r, self._return_type) or \
358 358 (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)):
359 359 return r
360 360 else:
361 361 warnings.warn(
362 362 "%s formatter returned invalid type %s (expected %s) for object: %s" % \
363 363 (self.format_type, type(r), self._return_type, _safe_repr(obj)),
364 364 FormatterWarning
365 365 )
366 366
367 367 def lookup(self, obj):
368 368 """Look up the formatter for a given instance.
369 369
370 370 Parameters
371 371 ----------
372 372 obj : object instance
373 373
374 374 Returns
375 375 -------
376 376 f : callable
377 377 The registered formatting callable for the type.
378 378
379 379 Raises
380 380 ------
381 381 KeyError if the type has not been registered.
382 382 """
383 383 # look for singleton first
384 384 obj_id = id(obj)
385 385 if obj_id in self.singleton_printers:
386 386 return self.singleton_printers[obj_id]
387 387 # then lookup by type
388 388 return self.lookup_by_type(_get_type(obj))
389 389
390 390 def lookup_by_type(self, typ):
391 391 """Look up the registered formatter for a type.
392 392
393 393 Parameters
394 394 ----------
395 395 typ : type or '__module__.__name__' string for a type
396 396
397 397 Returns
398 398 -------
399 399 f : callable
400 400 The registered formatting callable for the type.
401 401
402 402 Raises
403 403 ------
404 404 KeyError if the type has not been registered.
405 405 """
406 406 if isinstance(typ, string_types):
407 407 typ_key = tuple(typ.rsplit('.',1))
408 408 if typ_key not in self.deferred_printers:
409 409 # We may have it cached in the type map. We will have to
410 410 # iterate over all of the types to check.
411 411 for cls in self.type_printers:
412 412 if _mod_name_key(cls) == typ_key:
413 413 return self.type_printers[cls]
414 414 else:
415 415 return self.deferred_printers[typ_key]
416 416 else:
417 417 for cls in pretty._get_mro(typ):
418 418 if cls in self.type_printers or self._in_deferred_types(cls):
419 419 return self.type_printers[cls]
420 420
421 421 # If we have reached here, the lookup failed.
422 422 raise KeyError("No registered printer for {0!r}".format(typ))
423 423
424 424 def for_type(self, typ, func=None):
425 425 """Add a format function for a given type.
426 426
427 427 Parameters
428 428 -----------
429 429 typ : type or '__module__.__name__' string for a type
430 430 The class of the object that will be formatted using `func`.
431 431 func : callable
432 432 A callable for computing the format data.
433 433 `func` will be called with the object to be formatted,
434 434 and will return the raw data in this formatter's format.
435 435 Subclasses may use a different call signature for the
436 436 `func` argument.
437 437
438 438 If `func` is None or not specified, there will be no change,
439 439 only returning the current value.
440 440
441 441 Returns
442 442 -------
443 443 oldfunc : callable
444 444 The currently registered callable.
445 445 If you are registering a new formatter,
446 446 this will be the previous value (to enable restoring later).
447 447 """
448 448 # if string given, interpret as 'pkg.module.class_name'
449 449 if isinstance(typ, string_types):
450 450 type_module, type_name = typ.rsplit('.', 1)
451 451 return self.for_type_by_name(type_module, type_name, func)
452 452
453 453 try:
454 454 oldfunc = self.lookup_by_type(typ)
455 455 except KeyError:
456 456 oldfunc = None
457 457
458 458 if func is not None:
459 459 self.type_printers[typ] = func
460 460
461 461 return oldfunc
462 462
463 463 def for_type_by_name(self, type_module, type_name, func=None):
464 464 """Add a format function for a type specified by the full dotted
465 465 module and name of the type, rather than the type of the object.
466 466
467 467 Parameters
468 468 ----------
469 469 type_module : str
470 470 The full dotted name of the module the type is defined in, like
471 471 ``numpy``.
472 472 type_name : str
473 473 The name of the type (the class name), like ``dtype``
474 474 func : callable
475 475 A callable for computing the format data.
476 476 `func` will be called with the object to be formatted,
477 477 and will return the raw data in this formatter's format.
478 478 Subclasses may use a different call signature for the
479 479 `func` argument.
480 480
481 481 If `func` is None or unspecified, there will be no change,
482 482 only returning the current value.
483 483
484 484 Returns
485 485 -------
486 486 oldfunc : callable
487 487 The currently registered callable.
488 488 If you are registering a new formatter,
489 489 this will be the previous value (to enable restoring later).
490 490 """
491 491 key = (type_module, type_name)
492 492
493 493 try:
494 494 oldfunc = self.lookup_by_type("%s.%s" % key)
495 495 except KeyError:
496 496 oldfunc = None
497 497
498 498 if func is not None:
499 499 self.deferred_printers[key] = func
500 500 return oldfunc
501 501
502 502 def pop(self, typ, default=_raise_key_error):
503 503 """Pop a formatter for the given type.
504 504
505 505 Parameters
506 506 ----------
507 507 typ : type or '__module__.__name__' string for a type
508 508 default : object
509 509 value to be returned if no formatter is registered for typ.
510 510
511 511 Returns
512 512 -------
513 513 obj : object
514 514 The last registered object for the type.
515 515
516 516 Raises
517 517 ------
518 518 KeyError if the type is not registered and default is not specified.
519 519 """
520 520
521 521 if isinstance(typ, string_types):
522 522 typ_key = tuple(typ.rsplit('.',1))
523 523 if typ_key not in self.deferred_printers:
524 524 # We may have it cached in the type map. We will have to
525 525 # iterate over all of the types to check.
526 526 for cls in self.type_printers:
527 527 if _mod_name_key(cls) == typ_key:
528 528 old = self.type_printers.pop(cls)
529 529 break
530 530 else:
531 531 old = default
532 532 else:
533 533 old = self.deferred_printers.pop(typ_key)
534 534 else:
535 535 if typ in self.type_printers:
536 536 old = self.type_printers.pop(typ)
537 537 else:
538 538 old = self.deferred_printers.pop(_mod_name_key(typ), default)
539 539 if old is _raise_key_error:
540 540 raise KeyError("No registered value for {0!r}".format(typ))
541 541 return old
542 542
543 543 def _in_deferred_types(self, cls):
544 544 """
545 545 Check if the given class is specified in the deferred type registry.
546 546
547 547 Successful matches will be moved to the regular type registry for future use.
548 548 """
549 549 mod = getattr(cls, '__module__', None)
550 550 name = getattr(cls, '__name__', None)
551 551 key = (mod, name)
552 552 if key in self.deferred_printers:
553 553 # Move the printer over to the regular registry.
554 554 printer = self.deferred_printers.pop(key)
555 555 self.type_printers[cls] = printer
556 556 return True
557 557 return False
558 558
559 559
560 560 class PlainTextFormatter(BaseFormatter):
561 561 """The default pretty-printer.
562 562
563 563 This uses :mod:`IPython.lib.pretty` to compute the format data of
564 564 the object. If the object cannot be pretty printed, :func:`repr` is used.
565 565 See the documentation of :mod:`IPython.lib.pretty` for details on
566 566 how to write pretty printers. Here is a simple example::
567 567
568 568 def dtype_pprinter(obj, p, cycle):
569 569 if cycle:
570 570 return p.text('dtype(...)')
571 571 if hasattr(obj, 'fields'):
572 572 if obj.fields is None:
573 573 p.text(repr(obj))
574 574 else:
575 575 p.begin_group(7, 'dtype([')
576 576 for i, field in enumerate(obj.descr):
577 577 if i > 0:
578 578 p.text(',')
579 579 p.breakable()
580 580 p.pretty(field)
581 581 p.end_group(7, '])')
582 582 """
583 583
584 584 # The format type of data returned.
585 585 format_type = Unicode('text/plain')
586 586
587 587 # This subclass ignores this attribute as it always need to return
588 588 # something.
589 589 enabled = Bool(True).tag(config=False)
590 590
591 591 max_seq_length = Integer(pretty.MAX_SEQ_LENGTH,
592 592 help="""Truncate large collections (lists, dicts, tuples, sets) to this size.
593 593
594 594 Set to 0 to disable truncation.
595 595 """
596 596 ).tag(config=True)
597 597
598 598 # Look for a _repr_pretty_ methods to use for pretty printing.
599 599 print_method = ObjectName('_repr_pretty_')
600 600
601 601 # Whether to pretty-print or not.
602 602 pprint = Bool(True).tag(config=True)
603 603
604 604 # Whether to be verbose or not.
605 605 verbose = Bool(False).tag(config=True)
606 606
607 607 # The maximum width.
608 608 max_width = Integer(79).tag(config=True)
609 609
610 610 # The newline character.
611 611 newline = Unicode('\n').tag(config=True)
612 612
613 613 # format-string for pprinting floats
614 614 float_format = Unicode('%r')
615 615 # setter for float precision, either int or direct format-string
616 616 float_precision = CUnicode('').tag(config=True)
617 617
618 618 @observe('float_precision')
619 619 def _float_precision_changed(self, change):
620 620 """float_precision changed, set float_format accordingly.
621 621
622 622 float_precision can be set by int or str.
623 623 This will set float_format, after interpreting input.
624 624 If numpy has been imported, numpy print precision will also be set.
625 625
626 626 integer `n` sets format to '%.nf', otherwise, format set directly.
627 627
628 628 An empty string returns to defaults (repr for float, 8 for numpy).
629 629
630 630 This parameter can be set via the '%precision' magic.
631 631 """
632 632
633 633 new = change['new']
634 634 if '%' in new:
635 635 # got explicit format string
636 636 fmt = new
637 637 try:
638 638 fmt%3.14159
639 639 except Exception:
640 640 raise ValueError("Precision must be int or format string, not %r"%new)
641 641 elif new:
642 642 # otherwise, should be an int
643 643 try:
644 644 i = int(new)
645 645 assert i >= 0
646 646 except ValueError:
647 647 raise ValueError("Precision must be int or format string, not %r"%new)
648 648 except AssertionError:
649 649 raise ValueError("int precision must be non-negative, not %r"%i)
650 650
651 651 fmt = '%%.%if'%i
652 652 if 'numpy' in sys.modules:
653 653 # set numpy precision if it has been imported
654 654 import numpy
655 655 numpy.set_printoptions(precision=i)
656 656 else:
657 657 # default back to repr
658 658 fmt = '%r'
659 659 if 'numpy' in sys.modules:
660 660 import numpy
661 661 # numpy default is 8
662 662 numpy.set_printoptions(precision=8)
663 663 self.float_format = fmt
664 664
665 665 # Use the default pretty printers from IPython.lib.pretty.
666 666 @default('singleton_printers')
667 667 def _singleton_printers_default(self):
668 668 return pretty._singleton_pprinters.copy()
669 669
670 670 @default('type_printers')
671 671 def _type_printers_default(self):
672 672 d = pretty._type_pprinters.copy()
673 673 d[float] = lambda obj,p,cycle: p.text(self.float_format%obj)
674 674 return d
675 675
676 676 @default('deferred_printers')
677 677 def _deferred_printers_default(self):
678 678 return pretty._deferred_type_pprinters.copy()
679 679
680 680 #### FormatterABC interface ####
681 681
682 682 @catch_format_error
683 683 def __call__(self, obj):
684 684 """Compute the pretty representation of the object."""
685 685 if not self.pprint:
686 686 return repr(obj)
687 687 else:
688 688 # handle str and unicode on Python 2
689 689 # io.StringIO only accepts unicode,
690 690 # cStringIO doesn't handle unicode on py2,
691 691 # StringIO allows str, unicode but only ascii str
692 692 stream = pretty.CUnicodeIO()
693 693 printer = pretty.RepresentationPrinter(stream, self.verbose,
694 694 self.max_width, self.newline,
695 695 max_seq_length=self.max_seq_length,
696 696 singleton_pprinters=self.singleton_printers,
697 697 type_pprinters=self.type_printers,
698 698 deferred_pprinters=self.deferred_printers)
699 699 printer.pretty(obj)
700 700 printer.flush()
701 701 return stream.getvalue()
702 702
703 703
704 704 class HTMLFormatter(BaseFormatter):
705 705 """An HTML formatter.
706 706
707 707 To define the callables that compute the HTML representation of your
708 708 objects, define a :meth:`_repr_html_` method or use the :meth:`for_type`
709 709 or :meth:`for_type_by_name` methods to register functions that handle
710 710 this.
711 711
712 712 The return value of this formatter should be a valid HTML snippet that
713 713 could be injected into an existing DOM. It should *not* include the
714 714 ```<html>`` or ```<body>`` tags.
715 715 """
716 716 format_type = Unicode('text/html')
717 717
718 718 print_method = ObjectName('_repr_html_')
719 719
720 720
721 721 class MarkdownFormatter(BaseFormatter):
722 722 """A Markdown formatter.
723 723
724 724 To define the callables that compute the Markdown representation of your
725 725 objects, define a :meth:`_repr_markdown_` method or use the :meth:`for_type`
726 726 or :meth:`for_type_by_name` methods to register functions that handle
727 727 this.
728 728
729 729 The return value of this formatter should be a valid Markdown.
730 730 """
731 731 format_type = Unicode('text/markdown')
732 732
733 733 print_method = ObjectName('_repr_markdown_')
734 734
735 735 class SVGFormatter(BaseFormatter):
736 736 """An SVG formatter.
737 737
738 738 To define the callables that compute the SVG representation of your
739 739 objects, define a :meth:`_repr_svg_` method or use the :meth:`for_type`
740 740 or :meth:`for_type_by_name` methods to register functions that handle
741 741 this.
742 742
743 743 The return value of this formatter should be valid SVG enclosed in
744 744 ```<svg>``` tags, that could be injected into an existing DOM. It should
745 745 *not* include the ```<html>`` or ```<body>`` tags.
746 746 """
747 747 format_type = Unicode('image/svg+xml')
748 748
749 749 print_method = ObjectName('_repr_svg_')
750 750
751 751
752 752 class PNGFormatter(BaseFormatter):
753 753 """A PNG formatter.
754 754
755 755 To define the callables that compute the PNG representation of your
756 756 objects, define a :meth:`_repr_png_` method or use the :meth:`for_type`
757 757 or :meth:`for_type_by_name` methods to register functions that handle
758 758 this.
759 759
760 760 The return value of this formatter should be raw PNG data, *not*
761 761 base64 encoded.
762 762 """
763 763 format_type = Unicode('image/png')
764 764
765 765 print_method = ObjectName('_repr_png_')
766 766
767 767 _return_type = (bytes, unicode_type)
768 768
769 769
770 770 class JPEGFormatter(BaseFormatter):
771 771 """A JPEG formatter.
772 772
773 773 To define the callables that compute the JPEG representation of your
774 774 objects, define a :meth:`_repr_jpeg_` method or use the :meth:`for_type`
775 775 or :meth:`for_type_by_name` methods to register functions that handle
776 776 this.
777 777
778 778 The return value of this formatter should be raw JPEG data, *not*
779 779 base64 encoded.
780 780 """
781 781 format_type = Unicode('image/jpeg')
782 782
783 783 print_method = ObjectName('_repr_jpeg_')
784 784
785 785 _return_type = (bytes, unicode_type)
786 786
787 787
788 788 class LatexFormatter(BaseFormatter):
789 789 """A LaTeX formatter.
790 790
791 791 To define the callables that compute the LaTeX representation of your
792 792 objects, define a :meth:`_repr_latex_` method or use the :meth:`for_type`
793 793 or :meth:`for_type_by_name` methods to register functions that handle
794 794 this.
795 795
796 796 The return value of this formatter should be a valid LaTeX equation,
797 797 enclosed in either ```$```, ```$$``` or another LaTeX equation
798 798 environment.
799 799 """
800 800 format_type = Unicode('text/latex')
801 801
802 802 print_method = ObjectName('_repr_latex_')
803 803
804 804
805 805 class JSONFormatter(BaseFormatter):
806 806 """A JSON string formatter.
807 807
808 808 To define the callables that compute the JSONable representation of
809 809 your objects, define a :meth:`_repr_json_` method or use the :meth:`for_type`
810 810 or :meth:`for_type_by_name` methods to register functions that handle
811 811 this.
812 812
813 813 The return value of this formatter should be a JSONable list or dict.
814 814 JSON scalars (None, number, string) are not allowed, only dict or list containers.
815 815 """
816 816 format_type = Unicode('application/json')
817 817 _return_type = (list, dict)
818 818
819 819 print_method = ObjectName('_repr_json_')
820 820
821 821 def _check_return(self, r, obj):
822 822 """Check that a return value is appropriate
823 823
824 824 Return the value if so, None otherwise, warning if invalid.
825 825 """
826 826 if r is None:
827 827 return
828 828 md = None
829 829 if isinstance(r, tuple):
830 830 # unpack data, metadata tuple for type checking on first element
831 831 r, md = r
832 832
833 833 # handle deprecated JSON-as-string form from IPython < 3
834 834 if isinstance(r, string_types):
835 835 warnings.warn("JSON expects JSONable list/dict containers, not JSON strings",
836 836 FormatterWarning)
837 837 r = json.loads(r)
838 838
839 839 if md is not None:
840 840 # put the tuple back together
841 841 r = (r, md)
842 842 return super(JSONFormatter, self)._check_return(r, obj)
843 843
844 844
845 845 class JavascriptFormatter(BaseFormatter):
846 846 """A Javascript formatter.
847 847
848 848 To define the callables that compute the Javascript representation of
849 849 your objects, define a :meth:`_repr_javascript_` method or use the
850 850 :meth:`for_type` or :meth:`for_type_by_name` methods to register functions
851 851 that handle this.
852 852
853 853 The return value of this formatter should be valid Javascript code and
854 854 should *not* be enclosed in ```<script>``` tags.
855 855 """
856 856 format_type = Unicode('application/javascript')
857 857
858 858 print_method = ObjectName('_repr_javascript_')
859 859
860 860
861 861 class PDFFormatter(BaseFormatter):
862 862 """A PDF formatter.
863 863
864 864 To define the callables that compute the PDF representation of your
865 865 objects, define a :meth:`_repr_pdf_` method or use the :meth:`for_type`
866 866 or :meth:`for_type_by_name` methods to register functions that handle
867 867 this.
868 868
869 869 The return value of this formatter should be raw PDF data, *not*
870 870 base64 encoded.
871 871 """
872 872 format_type = Unicode('application/pdf')
873 873
874 874 print_method = ObjectName('_repr_pdf_')
875 875
876 876 _return_type = (bytes, unicode_type)
877 877
878 878 class IPythonDisplayFormatter(BaseFormatter):
879 879 """An escape-hatch Formatter for objects that know how to display themselves.
880 880
881 881 To define the callables that compute the representation of your
882 882 objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type`
883 883 or :meth:`for_type_by_name` methods to register functions that handle
884 884 this. Unlike mime-type displays, this method should not return anything,
885 885 instead calling any appropriate display methods itself.
886 886
887 887 This display formatter has highest priority.
888 888 If it fires, no other display formatter will be called.
889 889
890 890 Prior to IPython 6.1, `_ipython_display_` was the only way to display custom mime-types
891 891 without registering a new Formatter.
892 892
893 893 IPython 6.1 introduces `_repr_mimebundle_` for displaying custom mime-types,
894 894 so `_ipython_display_` should only be used for objects that require unusual
895 895 display patterns, such as multiple display calls.
896 896 """
897 897 print_method = ObjectName('_ipython_display_')
898 898 _return_type = (type(None), bool)
899 899
900 900 @catch_format_error
901 901 def __call__(self, obj):
902 902 """Compute the format for an object."""
903 903 if self.enabled:
904 904 # lookup registered printer
905 905 try:
906 906 printer = self.lookup(obj)
907 907 except KeyError:
908 908 pass
909 909 else:
910 910 printer(obj)
911 911 return True
912 912 # Finally look for special method names
913 913 method = get_real_method(obj, self.print_method)
914 914 if method is not None:
915 915 method()
916 916 return True
917 917
918 918
919 919 class MimeBundleFormatter(BaseFormatter):
920 920 """A Formatter for arbitrary mime-types.
921 921
922 922 Unlike other `_repr_<mimetype>_` methods,
923 923 `_repr_mimebundle_` should return mime-bundle data,
924 924 either the mime-keyed `data` dictionary or the tuple `(data, metadata)`.
925 925 Any mime-type is valid.
926 926
927 927 To define the callables that compute the mime-bundle representation of your
928 928 objects, define a :meth:`_repr_mimebundle_` method or use the :meth:`for_type`
929 929 or :meth:`for_type_by_name` methods to register functions that handle
930 930 this.
931 931
932 932 .. versionadded:: 6.1
933 933 """
934 934 print_method = ObjectName('_repr_mimebundle_')
935 935 _return_type = dict
936 936
937 937 def _check_return(self, r, obj):
938 938 r = super(MimeBundleFormatter, self)._check_return(r, obj)
939 939 # always return (data, metadata):
940 940 if r is None:
941 941 return {}, {}
942 942 if not isinstance(r, tuple):
943 943 return r, {}
944 944 return r
945 945
946 946 @catch_format_error
947 947 def __call__(self, obj, include=None, exclude=None):
948 948 """Compute the format for an object.
949 949
950 950 Identical to parent's method but we pass extra parameters to the method.
951 951
952 952 Unlike other _repr_*_ `_repr_mimebundle_` should allow extra kwargs, in
953 953 particular `include` and `exclude`.
954 954 """
955 955 if self.enabled:
956 956 # lookup registered printer
957 957 try:
958 958 printer = self.lookup(obj)
959 959 except KeyError:
960 960 pass
961 961 else:
962 962 return printer(obj)
963 963 # Finally look for special method names
964 964 method = get_real_method(obj, self.print_method)
965 965
966 966 if method is not None:
967 967 d = {}
968 968 d['include'] = include
969 d['exclude'] = include
969 d['exclude'] = exclude
970 970 return method(**d)
971 971 return None
972 972 else:
973 973 return None
974 974
975 975
976 976 FormatterABC.register(BaseFormatter)
977 977 FormatterABC.register(PlainTextFormatter)
978 978 FormatterABC.register(HTMLFormatter)
979 979 FormatterABC.register(MarkdownFormatter)
980 980 FormatterABC.register(SVGFormatter)
981 981 FormatterABC.register(PNGFormatter)
982 982 FormatterABC.register(PDFFormatter)
983 983 FormatterABC.register(JPEGFormatter)
984 984 FormatterABC.register(LatexFormatter)
985 985 FormatterABC.register(JSONFormatter)
986 986 FormatterABC.register(JavascriptFormatter)
987 987 FormatterABC.register(IPythonDisplayFormatter)
988 988 FormatterABC.register(MimeBundleFormatter)
989 989
990 990
991 991 def format_display_data(obj, include=None, exclude=None):
992 992 """Return a format data dict for an object.
993 993
994 994 By default all format types will be computed.
995 995
996 996 The following MIME types are currently implemented:
997 997
998 998 * text/plain
999 999 * text/html
1000 1000 * text/markdown
1001 1001 * text/latex
1002 1002 * application/json
1003 1003 * application/javascript
1004 1004 * application/pdf
1005 1005 * image/png
1006 1006 * image/jpeg
1007 1007 * image/svg+xml
1008 1008
1009 1009 Parameters
1010 1010 ----------
1011 1011 obj : object
1012 1012 The Python object whose format data will be computed.
1013 1013
1014 1014 Returns
1015 1015 -------
1016 1016 format_dict : dict
1017 1017 A dictionary of key/value pairs, one or each format that was
1018 1018 generated for the object. The keys are the format types, which
1019 1019 will usually be MIME type strings and the values and JSON'able
1020 1020 data structure containing the raw data for the representation in
1021 1021 that format.
1022 1022 include : list or tuple, optional
1023 1023 A list of format type strings (MIME types) to include in the
1024 1024 format data dict. If this is set *only* the format types included
1025 1025 in this list will be computed.
1026 1026 exclude : list or tuple, optional
1027 1027 A list of format type string (MIME types) to exclue in the format
1028 1028 data dict. If this is set all format types will be computed,
1029 1029 except for those included in this argument.
1030 1030 """
1031 1031 from IPython.core.interactiveshell import InteractiveShell
1032 1032
1033 1033 return InteractiveShell.instance().display_formatter.format(
1034 1034 obj,
1035 1035 include,
1036 1036 exclude
1037 1037 )
@@ -1,503 +1,523 b''
1 1 """Tests for the Formatters."""
2 2
3 3 import warnings
4 4 from math import pi
5 5
6 6 try:
7 7 import numpy
8 8 except:
9 9 numpy = None
10 10 import nose.tools as nt
11 11
12 12 from IPython import get_ipython
13 13 from traitlets.config import Config
14 14 from IPython.core.formatters import (
15 15 PlainTextFormatter, HTMLFormatter, PDFFormatter, _mod_name_key,
16 16 DisplayFormatter, JSONFormatter,
17 17 )
18 18 from IPython.utils.io import capture_output
19 19
20 20 class A(object):
21 21 def __repr__(self):
22 22 return 'A()'
23 23
24 24 class B(A):
25 25 def __repr__(self):
26 26 return 'B()'
27 27
28 28 class C:
29 29 pass
30 30
31 31 class BadRepr(object):
32 32 def __repr__(self):
33 33 raise ValueError("bad repr")
34 34
35 35 class BadPretty(object):
36 36 _repr_pretty_ = None
37 37
38 38 class GoodPretty(object):
39 39 def _repr_pretty_(self, pp, cycle):
40 40 pp.text('foo')
41 41
42 42 def __repr__(self):
43 43 return 'GoodPretty()'
44 44
45 45 def foo_printer(obj, pp, cycle):
46 46 pp.text('foo')
47 47
48 48 def test_pretty():
49 49 f = PlainTextFormatter()
50 50 f.for_type(A, foo_printer)
51 51 nt.assert_equal(f(A()), 'foo')
52 52 nt.assert_equal(f(B()), 'foo')
53 53 nt.assert_equal(f(GoodPretty()), 'foo')
54 54 # Just don't raise an exception for the following:
55 55 f(BadPretty())
56 56
57 57 f.pprint = False
58 58 nt.assert_equal(f(A()), 'A()')
59 59 nt.assert_equal(f(B()), 'B()')
60 60 nt.assert_equal(f(GoodPretty()), 'GoodPretty()')
61 61
62 62
63 63 def test_deferred():
64 64 f = PlainTextFormatter()
65 65
66 66 def test_precision():
67 67 """test various values for float_precision."""
68 68 f = PlainTextFormatter()
69 69 nt.assert_equal(f(pi), repr(pi))
70 70 f.float_precision = 0
71 71 if numpy:
72 72 po = numpy.get_printoptions()
73 73 nt.assert_equal(po['precision'], 0)
74 74 nt.assert_equal(f(pi), '3')
75 75 f.float_precision = 2
76 76 if numpy:
77 77 po = numpy.get_printoptions()
78 78 nt.assert_equal(po['precision'], 2)
79 79 nt.assert_equal(f(pi), '3.14')
80 80 f.float_precision = '%g'
81 81 if numpy:
82 82 po = numpy.get_printoptions()
83 83 nt.assert_equal(po['precision'], 2)
84 84 nt.assert_equal(f(pi), '3.14159')
85 85 f.float_precision = '%e'
86 86 nt.assert_equal(f(pi), '3.141593e+00')
87 87 f.float_precision = ''
88 88 if numpy:
89 89 po = numpy.get_printoptions()
90 90 nt.assert_equal(po['precision'], 8)
91 91 nt.assert_equal(f(pi), repr(pi))
92 92
93 93 def test_bad_precision():
94 94 """test various invalid values for float_precision."""
95 95 f = PlainTextFormatter()
96 96 def set_fp(p):
97 97 f.float_precision=p
98 98 nt.assert_raises(ValueError, set_fp, '%')
99 99 nt.assert_raises(ValueError, set_fp, '%.3f%i')
100 100 nt.assert_raises(ValueError, set_fp, 'foo')
101 101 nt.assert_raises(ValueError, set_fp, -1)
102 102
103 103 def test_for_type():
104 104 f = PlainTextFormatter()
105 105
106 106 # initial return, None
107 107 nt.assert_is(f.for_type(C, foo_printer), None)
108 108 # no func queries
109 109 nt.assert_is(f.for_type(C), foo_printer)
110 110 # shouldn't change anything
111 111 nt.assert_is(f.for_type(C), foo_printer)
112 112 # None should do the same
113 113 nt.assert_is(f.for_type(C, None), foo_printer)
114 114 nt.assert_is(f.for_type(C, None), foo_printer)
115 115
116 116 def test_for_type_string():
117 117 f = PlainTextFormatter()
118 118
119 mod = C.__module__
120
121 119 type_str = '%s.%s' % (C.__module__, 'C')
122 120
123 121 # initial return, None
124 122 nt.assert_is(f.for_type(type_str, foo_printer), None)
125 123 # no func queries
126 124 nt.assert_is(f.for_type(type_str), foo_printer)
127 125 nt.assert_in(_mod_name_key(C), f.deferred_printers)
128 126 nt.assert_is(f.for_type(C), foo_printer)
129 127 nt.assert_not_in(_mod_name_key(C), f.deferred_printers)
130 128 nt.assert_in(C, f.type_printers)
131 129
132 130 def test_for_type_by_name():
133 131 f = PlainTextFormatter()
134 132
135 133 mod = C.__module__
136 134
137 135 # initial return, None
138 136 nt.assert_is(f.for_type_by_name(mod, 'C', foo_printer), None)
139 137 # no func queries
140 138 nt.assert_is(f.for_type_by_name(mod, 'C'), foo_printer)
141 139 # shouldn't change anything
142 140 nt.assert_is(f.for_type_by_name(mod, 'C'), foo_printer)
143 141 # None should do the same
144 142 nt.assert_is(f.for_type_by_name(mod, 'C', None), foo_printer)
145 143 nt.assert_is(f.for_type_by_name(mod, 'C', None), foo_printer)
146 144
147 145 def test_lookup():
148 146 f = PlainTextFormatter()
149 147
150 148 f.for_type(C, foo_printer)
151 149 nt.assert_is(f.lookup(C()), foo_printer)
152 150 with nt.assert_raises(KeyError):
153 151 f.lookup(A())
154 152
155 153 def test_lookup_string():
156 154 f = PlainTextFormatter()
157 155 type_str = '%s.%s' % (C.__module__, 'C')
158 156
159 157 f.for_type(type_str, foo_printer)
160 158 nt.assert_is(f.lookup(C()), foo_printer)
161 159 # should move from deferred to imported dict
162 160 nt.assert_not_in(_mod_name_key(C), f.deferred_printers)
163 161 nt.assert_in(C, f.type_printers)
164 162
165 163 def test_lookup_by_type():
166 164 f = PlainTextFormatter()
167 165 f.for_type(C, foo_printer)
168 166 nt.assert_is(f.lookup_by_type(C), foo_printer)
169 type_str = '%s.%s' % (C.__module__, 'C')
170 167 with nt.assert_raises(KeyError):
171 168 f.lookup_by_type(A)
172 169
173 170 def test_lookup_by_type_string():
174 171 f = PlainTextFormatter()
175 172 type_str = '%s.%s' % (C.__module__, 'C')
176 173 f.for_type(type_str, foo_printer)
177 174
178 175 # verify insertion
179 176 nt.assert_in(_mod_name_key(C), f.deferred_printers)
180 177 nt.assert_not_in(C, f.type_printers)
181 178
182 179 nt.assert_is(f.lookup_by_type(type_str), foo_printer)
183 180 # lookup by string doesn't cause import
184 181 nt.assert_in(_mod_name_key(C), f.deferred_printers)
185 182 nt.assert_not_in(C, f.type_printers)
186 183
187 184 nt.assert_is(f.lookup_by_type(C), foo_printer)
188 185 # should move from deferred to imported dict
189 186 nt.assert_not_in(_mod_name_key(C), f.deferred_printers)
190 187 nt.assert_in(C, f.type_printers)
191 188
192 189 def test_in_formatter():
193 190 f = PlainTextFormatter()
194 191 f.for_type(C, foo_printer)
195 192 type_str = '%s.%s' % (C.__module__, 'C')
196 193 nt.assert_in(C, f)
197 194 nt.assert_in(type_str, f)
198 195
199 196 def test_string_in_formatter():
200 197 f = PlainTextFormatter()
201 198 type_str = '%s.%s' % (C.__module__, 'C')
202 199 f.for_type(type_str, foo_printer)
203 200 nt.assert_in(type_str, f)
204 201 nt.assert_in(C, f)
205 202
206 203 def test_pop():
207 204 f = PlainTextFormatter()
208 205 f.for_type(C, foo_printer)
209 206 nt.assert_is(f.lookup_by_type(C), foo_printer)
210 207 nt.assert_is(f.pop(C, None), foo_printer)
211 208 f.for_type(C, foo_printer)
212 209 nt.assert_is(f.pop(C), foo_printer)
213 210 with nt.assert_raises(KeyError):
214 211 f.lookup_by_type(C)
215 212 with nt.assert_raises(KeyError):
216 213 f.pop(C)
217 214 with nt.assert_raises(KeyError):
218 215 f.pop(A)
219 216 nt.assert_is(f.pop(A, None), None)
220 217
221 218 def test_pop_string():
222 219 f = PlainTextFormatter()
223 220 type_str = '%s.%s' % (C.__module__, 'C')
224 221
225 222 with nt.assert_raises(KeyError):
226 223 f.pop(type_str)
227 224
228 225 f.for_type(type_str, foo_printer)
229 226 f.pop(type_str)
230 227 with nt.assert_raises(KeyError):
231 228 f.lookup_by_type(C)
232 229 with nt.assert_raises(KeyError):
233 230 f.pop(type_str)
234 231
235 232 f.for_type(C, foo_printer)
236 233 nt.assert_is(f.pop(type_str, None), foo_printer)
237 234 with nt.assert_raises(KeyError):
238 235 f.lookup_by_type(C)
239 236 with nt.assert_raises(KeyError):
240 237 f.pop(type_str)
241 238 nt.assert_is(f.pop(type_str, None), None)
242 239
243 240
244 241 def test_error_method():
245 242 f = HTMLFormatter()
246 243 class BadHTML(object):
247 244 def _repr_html_(self):
248 245 raise ValueError("Bad HTML")
249 246 bad = BadHTML()
250 247 with capture_output() as captured:
251 248 result = f(bad)
252 249 nt.assert_is(result, None)
253 250 nt.assert_in("Traceback", captured.stdout)
254 251 nt.assert_in("Bad HTML", captured.stdout)
255 252 nt.assert_in("_repr_html_", captured.stdout)
256 253
257 254 def test_nowarn_notimplemented():
258 255 f = HTMLFormatter()
259 256 class HTMLNotImplemented(object):
260 257 def _repr_html_(self):
261 258 raise NotImplementedError
262 259 h = HTMLNotImplemented()
263 260 with capture_output() as captured:
264 261 result = f(h)
265 262 nt.assert_is(result, None)
266 263 nt.assert_equal("", captured.stderr)
267 264 nt.assert_equal("", captured.stdout)
268 265
269 266 def test_warn_error_for_type():
270 267 f = HTMLFormatter()
271 268 f.for_type(int, lambda i: name_error)
272 269 with capture_output() as captured:
273 270 result = f(5)
274 271 nt.assert_is(result, None)
275 272 nt.assert_in("Traceback", captured.stdout)
276 273 nt.assert_in("NameError", captured.stdout)
277 274 nt.assert_in("name_error", captured.stdout)
278 275
279 276 def test_error_pretty_method():
280 277 f = PlainTextFormatter()
281 278 class BadPretty(object):
282 279 def _repr_pretty_(self):
283 280 return "hello"
284 281 bad = BadPretty()
285 282 with capture_output() as captured:
286 283 result = f(bad)
287 284 nt.assert_is(result, None)
288 285 nt.assert_in("Traceback", captured.stdout)
289 286 nt.assert_in("_repr_pretty_", captured.stdout)
290 287 nt.assert_in("given", captured.stdout)
291 288 nt.assert_in("argument", captured.stdout)
292 289
293 290
294 291 def test_bad_repr_traceback():
295 292 f = PlainTextFormatter()
296 293 bad = BadRepr()
297 294 with capture_output() as captured:
298 295 result = f(bad)
299 296 # catches error, returns None
300 297 nt.assert_is(result, None)
301 298 nt.assert_in("Traceback", captured.stdout)
302 299 nt.assert_in("__repr__", captured.stdout)
303 300 nt.assert_in("ValueError", captured.stdout)
304 301
305 302
306 303 class MakePDF(object):
307 304 def _repr_pdf_(self):
308 305 return 'PDF'
309 306
310 307 def test_pdf_formatter():
311 308 pdf = MakePDF()
312 309 f = PDFFormatter()
313 310 nt.assert_equal(f(pdf), 'PDF')
314 311
315 312 def test_print_method_bound():
316 313 f = HTMLFormatter()
317 314 class MyHTML(object):
318 315 def _repr_html_(self):
319 316 return "hello"
320 317 with capture_output() as captured:
321 318 result = f(MyHTML)
322 319 nt.assert_is(result, None)
323 320 nt.assert_not_in("FormatterWarning", captured.stderr)
324 321
325 322 with capture_output() as captured:
326 323 result = f(MyHTML())
327 324 nt.assert_equal(result, "hello")
328 325 nt.assert_equal(captured.stderr, "")
329 326
330 327 def test_print_method_weird():
331 328
332 329 class TextMagicHat(object):
333 330 def __getattr__(self, key):
334 331 return key
335 332
336 333 f = HTMLFormatter()
337 334
338 335 text_hat = TextMagicHat()
339 336 nt.assert_equal(text_hat._repr_html_, '_repr_html_')
340 337 with capture_output() as captured:
341 338 result = f(text_hat)
342 339
343 340 nt.assert_is(result, None)
344 341 nt.assert_not_in("FormatterWarning", captured.stderr)
345 342
346 343 class CallableMagicHat(object):
347 344 def __getattr__(self, key):
348 345 return lambda : key
349 346
350 347 call_hat = CallableMagicHat()
351 348 with capture_output() as captured:
352 349 result = f(call_hat)
353 350
354 351 nt.assert_equal(result, None)
355 352
356 353 class BadReprArgs(object):
357 354 def _repr_html_(self, extra, args):
358 355 return "html"
359 356
360 357 bad = BadReprArgs()
361 358 with capture_output() as captured:
362 359 result = f(bad)
363 360
364 361 nt.assert_is(result, None)
365 362 nt.assert_not_in("FormatterWarning", captured.stderr)
366 363
367 364
368 365 def test_format_config():
369 366 """config objects don't pretend to support fancy reprs with lazy attrs"""
370 367 f = HTMLFormatter()
371 368 cfg = Config()
372 369 with capture_output() as captured:
373 370 result = f(cfg)
374 371 nt.assert_is(result, None)
375 372 nt.assert_equal(captured.stderr, "")
376 373
377 374 with capture_output() as captured:
378 375 result = f(Config)
379 376 nt.assert_is(result, None)
380 377 nt.assert_equal(captured.stderr, "")
381 378
382 379 def test_pretty_max_seq_length():
383 380 f = PlainTextFormatter(max_seq_length=1)
384 381 lis = list(range(3))
385 382 text = f(lis)
386 383 nt.assert_equal(text, '[0, ...]')
387 384 f.max_seq_length = 0
388 385 text = f(lis)
389 386 nt.assert_equal(text, '[0, 1, 2]')
390 387 text = f(list(range(1024)))
391 388 lines = text.splitlines()
392 389 nt.assert_equal(len(lines), 1024)
393 390
394 391
395 392 def test_ipython_display_formatter():
396 393 """Objects with _ipython_display_ defined bypass other formatters"""
397 394 f = get_ipython().display_formatter
398 395 catcher = []
399 396 class SelfDisplaying(object):
400 397 def _ipython_display_(self):
401 398 catcher.append(self)
402 399
403 400 class NotSelfDisplaying(object):
404 401 def __repr__(self):
405 402 return "NotSelfDisplaying"
406 403
407 404 def _ipython_display_(self):
408 405 raise NotImplementedError
409 406
410 407 save_enabled = f.ipython_display_formatter.enabled
411 408 f.ipython_display_formatter.enabled = True
412 409
413 410 yes = SelfDisplaying()
414 411 no = NotSelfDisplaying()
415 412
416 413 d, md = f.format(no)
417 414 nt.assert_equal(d, {'text/plain': repr(no)})
418 415 nt.assert_equal(md, {})
419 416 nt.assert_equal(catcher, [])
420 417
421 418 d, md = f.format(yes)
422 419 nt.assert_equal(d, {})
423 420 nt.assert_equal(md, {})
424 421 nt.assert_equal(catcher, [yes])
425 422
426 423 f.ipython_display_formatter.enabled = save_enabled
427 424
428 425
429 426 def test_json_as_string_deprecated():
430 427 class JSONString(object):
431 428 def _repr_json_(self):
432 429 return '{}'
433 430
434 431 f = JSONFormatter()
435 432 with warnings.catch_warnings(record=True) as w:
436 433 d = f(JSONString())
437 434 nt.assert_equal(d, {})
438 435 nt.assert_equal(len(w), 1)
439 436
440 437
441 438 def test_repr_mime():
442 439 class HasReprMime(object):
443 440 def _repr_mimebundle_(self, include=None, exclude=None):
444 441 return {
445 442 'application/json+test.v2': {
446 443 'x': 'y'
447 444 },
448 445 'plain/text' : '<HasReprMime>',
449 446 'image/png' : 'i-overwrite'
450 447 }
451 448
452 449 def _repr_png_(self):
453 450 return 'should-be-overwritten'
454 451 def _repr_html_(self):
455 452 return '<b>hi!</b>'
456 453
457 454 f = get_ipython().display_formatter
458 455 html_f = f.formatters['text/html']
459 456 save_enabled = html_f.enabled
460 457 html_f.enabled = True
461 458 obj = HasReprMime()
462 459 d, md = f.format(obj)
463 460 html_f.enabled = save_enabled
464 461
465 462 nt.assert_equal(sorted(d), ['application/json+test.v2',
466 463 'image/png',
467 464 'plain/text',
468 465 'text/html',
469 466 'text/plain'])
470 467 nt.assert_equal(md, {})
471 468
472 469 d, md = f.format(obj, include={'image/png'})
473 470 nt.assert_equal(list(d.keys()), ['image/png'],
474 471 'Include should filter out even things from repr_mimebundle')
475 472 nt.assert_equal(d['image/png'], 'i-overwrite', '_repr_mimebundle_ take precedence')
476 473
477 474
475
476 def test_pass_correct_include_exclude():
477 class Tester(object):
478
479 def __init__(self, include=None, exclude=None):
480 self.include = include
481 self.exclude = exclude
482
483 def _repr_mimebundle_(self, include, exclude, **kwargs):
484 if include and (include != self.include):
485 raise ValueError('include got modified: display() may be broken.')
486 if exclude and (exclude != self.exclude):
487 raise ValueError('exclude got modified: display() may be broken.')
488
489 return None
490
491 include = {'a', 'b', 'c'}
492 exclude = {'c', 'e' , 'f'}
493
494 f = get_ipython().display_formatter
495 f.format(Tester(include=include, exclude=exclude), include=include, exclude=exclude)
496 f.format(Tester(exclude=exclude), exclude=exclude)
497 f.format(Tester(include=include), include=include)
498
499
478 500 def test_repr_mime_meta():
479 501 class HasReprMimeMeta(object):
480 502 def _repr_mimebundle_(self, include=None, exclude=None):
481 503 data = {
482 504 'image/png': 'base64-image-data',
483 505 }
484 506 metadata = {
485 507 'image/png': {
486 508 'width': 5,
487 509 'height': 10,
488 510 }
489 511 }
490 512 return (data, metadata)
491 513
492 514 f = get_ipython().display_formatter
493 515 obj = HasReprMimeMeta()
494 516 d, md = f.format(obj)
495 517 nt.assert_equal(sorted(d), ['image/png', 'text/plain'])
496 518 nt.assert_equal(md, {
497 519 'image/png': {
498 520 'width': 5,
499 521 'height': 10,
500 522 }
501 523 })
502
503
This diff has been collapsed as it changes many lines, (1058 lines changed) Show them Hide them
@@ -1,1556 +1,976 b''
1 1 {
2 2 "cells": [
3 3 {
4 4 "cell_type": "markdown",
5 5 "metadata": {},
6 6 "source": [
7 7 "# Custom Display Logic"
8 8 ]
9 9 },
10 10 {
11 11 "cell_type": "markdown",
12 12 "metadata": {},
13 13 "source": [
14 14 "## Overview"
15 15 ]
16 16 },
17 17 {
18 18 "cell_type": "markdown",
19 19 "metadata": {},
20 20 "source": [
21 21 "As described in the [Rich Output](Rich Output.ipynb) tutorial, the IPython display system can display rich representations of objects in the following formats:\n",
22 22 "\n",
23 23 "* JavaScript\n",
24 24 "* HTML\n",
25 25 "* PNG\n",
26 26 "* JPEG\n",
27 27 "* SVG\n",
28 28 "* LaTeX\n",
29 29 "* PDF\n",
30 30 "\n",
31 31 "This Notebook shows how you can add custom display logic to your own classes, so that they can be displayed using these rich representations. There are two ways of accomplishing this:\n",
32 32 "\n",
33 33 "1. Implementing special display methods such as `_repr_html_` when you define your class.\n",
34 34 "2. Registering a display function for a particular existing class.\n",
35 35 "\n",
36 36 "This Notebook describes and illustrates both approaches."
37 37 ]
38 38 },
39 39 {
40 40 "cell_type": "markdown",
41 41 "metadata": {},
42 42 "source": [
43 43 "Import the IPython display functions."
44 44 ]
45 45 },
46 46 {
47 47 "cell_type": "code",
48 48 "execution_count": 1,
49 49 "metadata": {
50 "collapsed": false
50 "collapsed": true
51 51 },
52 52 "outputs": [],
53 53 "source": [
54 54 "from IPython.display import (\n",
55 55 " display, display_html, display_png, display_svg\n",
56 56 ")"
57 57 ]
58 58 },
59 59 {
60 60 "cell_type": "markdown",
61 61 "metadata": {},
62 62 "source": [
63 63 "Parts of this notebook need the matplotlib inline backend:"
64 64 ]
65 65 },
66 66 {
67 67 "cell_type": "code",
68 68 "execution_count": 2,
69 69 "metadata": {
70 "collapsed": false
70 "collapsed": true
71 71 },
72 72 "outputs": [],
73 73 "source": [
74 "%matplotlib inline\n",
75 74 "import numpy as np\n",
76 "import matplotlib.pyplot as plt"
75 "import matplotlib.pyplot as plt\n",
76 "plt.ion()"
77 77 ]
78 78 },
79 79 {
80 80 "cell_type": "markdown",
81 81 "metadata": {},
82 82 "source": [
83 83 "## Special display methods"
84 84 ]
85 85 },
86 86 {
87 87 "cell_type": "markdown",
88 88 "metadata": {},
89 89 "source": [
90 90 "The main idea of the first approach is that you have to implement special display methods when you define your class, one for each representation you want to use. Here is a list of the names of the special methods and the values they must return:\n",
91 91 "\n",
92 92 "* `_repr_html_`: return raw HTML as a string\n",
93 93 "* `_repr_json_`: return a JSONable dict\n",
94 94 "* `_repr_jpeg_`: return raw JPEG data\n",
95 95 "* `_repr_png_`: return raw PNG data\n",
96 96 "* `_repr_svg_`: return raw SVG data as a string\n",
97 "* `_repr_latex_`: return LaTeX commands in a string surrounded by \"$\"."
97 "* `_repr_latex_`: return LaTeX commands in a string surrounded by \"$\".\n",
98 "* `_repr_mimebundle_`: return a full mimebundle containing the mapping from all mimetypes to data "
98 99 ]
99 100 },
100 101 {
101 102 "cell_type": "markdown",
102 103 "metadata": {},
103 104 "source": [
104 105 "As an illustration, we build a class that holds data generated by sampling a Gaussian distribution with given mean and standard deviation. Here is the definition of the `Gaussian` class, which has a custom PNG and LaTeX representation."
105 106 ]
106 107 },
107 108 {
108 109 "cell_type": "code",
109 110 "execution_count": 3,
110 111 "metadata": {
111 "collapsed": false
112 "collapsed": true
112 113 },
113 114 "outputs": [],
114 115 "source": [
115 116 "from IPython.core.pylabtools import print_figure\n",
116 117 "from IPython.display import Image, SVG, Math\n",
117 118 "\n",
118 119 "class Gaussian(object):\n",
119 120 " \"\"\"A simple object holding data sampled from a Gaussian distribution.\n",
120 121 " \"\"\"\n",
121 122 " def __init__(self, mean=0.0, std=1, size=1000):\n",
122 123 " self.data = np.random.normal(mean, std, size)\n",
123 124 " self.mean = mean\n",
124 125 " self.std = std\n",
125 126 " self.size = size\n",
126 127 " # For caching plots that may be expensive to compute\n",
127 128 " self._png_data = None\n",
128 129 " \n",
129 130 " def _figure_data(self, format):\n",
130 131 " fig, ax = plt.subplots()\n",
131 132 " ax.hist(self.data, bins=50)\n",
132 133 " ax.set_title(self._repr_latex_())\n",
133 134 " ax.set_xlim(-10.0,10.0)\n",
134 135 " data = print_figure(fig, format)\n",
135 136 " # We MUST close the figure, otherwise IPython's display machinery\n",
136 137 " # will pick it up and send it as output, resulting in a double display\n",
137 138 " plt.close(fig)\n",
138 139 " return data\n",
139 140 " \n",
140 141 " def _repr_png_(self):\n",
141 142 " if self._png_data is None:\n",
142 143 " self._png_data = self._figure_data('png')\n",
143 144 " return self._png_data\n",
144 145 " \n",
145 146 " def _repr_latex_(self):\n",
146 147 " return r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,\n",
147 148 " self.std, self.size)"
148 149 ]
149 150 },
150 151 {
151 152 "cell_type": "markdown",
152 153 "metadata": {},
153 154 "source": [
154 155 "Create an instance of the Gaussian distribution and return it to display the default representation:"
155 156 ]
156 157 },
157 158 {
158 159 "cell_type": "code",
159 160 "execution_count": 4,
160 "metadata": {
161 "collapsed": false
162 },
161 "metadata": {},
163 162 "outputs": [
164 163 {
165 164 "data": {
166 "image/png": [
167 "iVBORw0KGgoAAAANSUhEUgAAAlEAAAGLCAYAAADnMccKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n",
168 "AAALEgAACxIB0t1+/AAAGsJJREFUeJzt3X2QndddH/DvsUQs5cXIRoCNA9mGGIR5Dy9KiBMnMmnq\n",
169 "BAbamjOdYIOBafEMGd4MocEGUrAbG1Sgw7sLwWAI5bhT6tC0abCN4rQlSjEhmVAbG1yRRHgTYgsp\n",
170 "xEKOlKd/3LvmeiOvdo/26t6VPp9/ds9znufe32rvaL/znHOeU4ZhCAAAa3PWrAsAANiIhCgAgA5C\n",
171 "FABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRsIGVUraMv5ZSyq5Z1zMPSinnllK+atZ1AKc/\n",
172 "IQo2oFLKV5ZS3pPkQClla5IfTPIXp+i9P7eUclMp5d+XUv6glPIVp+J9n6KWraWUXy6lvHjp2DAM\n",
173 "B5K8opTyvFnVtRrHq32i77NLKb9SSvmuUsqvllIWTrYPWH9CFMypUsofl1JecZzjm5Jcn+Tnkrwo\n",
174 "yRcleWwYhvefgprOSnJtktcNw/A9SX4zydtKKdun/d7HqeU7k7w+yRVJyrLun0zyE6e6ptU6Qe1J\n",
175 "cluS24Zh+IUkv5rkd9ahD1hnQhTMoXEo+fKM/sgu97IkvzgMw68Ow/AnSb4/ya+fotIuSvI1ST5r\n",
176 "3P6dJM9I8o2n6P2fMAzDrwzD8ENJPnqcvseT3F9KedFaX7eUcnYp5UdKKftLKfeVUspE36tLKfeX\n",
177 "Un6/lPJPp1F7KeXzknzpMAz/c3zuO5N8finlczr7ntNbJ7AyIQrm08VJfiPJPy+lPG1Z38uS/GGS\n",
178 "lFLOS/IpwzB87BTV9XdJnp3kgiQZhuHo+Ni5p+j91+ItSV691ouGYTiS0Z2s25JcmImAOAzDm5L8\n",
179 "xjAMXz8Mw++tV6HLfEmSDyw79sGM7jr29H3NFGoEIkTBvPqKJD+S5ONJXrms7+xhGD4+/v5lSd59\n",
180 "qooahmH/MAzbh2H442Q0ByfJeUn+6FTVsAbvSfLCzmtfnOSOjIbEfnBZ3ydOpqhV+Iwkh5cdeyzJ\n",
181 "+Uk+vaPvM6dQI5Bk86wLAI7r3GEY9pdS3pTkqiT/JUlKKV+Q5P9OnPeFSf58+cWllG9J8vnDMFw3\n",
182 "bv/LJOcPw/ATE+dsS/LTOf6cnEk/MwzDe5+i77uSvGVpCOl4SinfkeS7M7p7tX1c7+NJXj4Mw4fX\n",
183 "sZYnGYbh4+PJ25uGYTi2mmsmfFWSmzK6k/OXpZQXD8PwjlLKjiz7955C7edm9O8z6fEkz0qytbMP\n",
184 "mAIhCubM+LEFS38MfzPJO0spnzkMw4eS/OMkbeL07UnedZyX+Wfja5d8U5KfnzxhGIa/TfLtJ1Hn\n",
185 "FyV5RZLLVjjnRzO6Q/L8jELGHyV5zTAMe9ezlhUsDTV+ZI3XbRqGYUjygVLK7yR5bZJ3ZHTn77cn\n",
186 "T5xC7Z80TyrJ05M8muMHtdX0AVNgOA/mz2VJ7kmSYRjeneT+JNeM+549DMPDE+c+LcnRyYvHq/cu\n",
187 "SXLXuL0lyQsynke1Hkopz8roTs0rh2E47h/p8V2zK5N8zzAMx8bzp/YlOZUTnR/PGv+fK6V8ZpLF\n",
188 "iUM/leTyUsrFGd0hPLSO9R3Pw0meuezYM8Y1LXb0fWgKNQJxJwrm0aXDMLx2ov2LSf5tKeWX8snD\n",
189 "NY8k2bbs2FckeWgYhoPj9ouTvC/Jx0op5y2FnlLKuUn+XfqGoW7K6I7Sw+PVa/9iGIbly+lfleRt\n",
190 "wzB8Yvx+mzMaJvu+5W9wkrWs5FMz+jdai8uSvG2pMQzD+0opb83osRL3Lj95CrW/M6PJ+0uvvzmj\n",
191 "4Pm+JB/r7AOmQIiCOVBKOSej0PFQkr9e1v3GJD+U5Pcy+mM96QMZTUSe9LXj11ny6ozubO0av/aj\n",
192 "yRMPpVzzMFQp5bUZzRXaMZ4j9DkZ3T1JKeUrk5wzDMPdSf4m41V8Y9+V5JeHYfjg8tfsrWWyrKc4\n",
193 "PkzOh1pW31N57ngV3qSfTLIno2dzLX+Dda19GIYPlFL+Xyll53jY8+VJ/mQYhvvHP0NXH7D+hCiY\n",
194 "Dy/MaK7Ngxk9H+oJ4wnS35Nkd8ZDdBPuSfIDy45dluRYKeXqJJ+S5O7xsc8bhuHOkylyPER3Y5JN\n",
195 "kyVmNME9Sb45o3lDX5bRIwLeMJ7U/swkHxmG4baTef9ltXxrksuTfHaSnymlvCPJDyytXBw/rfvP\n",
196 "ll326ozC5Jcd5/Wen9Gw6TeUUs4ahuHHn/gBh+GeUsp/T7J3+XXTqD3JtyS5vpTygozuLH7zxOW9\n",
197 "fcA6K6O5k8CsjR+W+KGJYbjVXnfnMAxfO/5+S5L9Ga3E+/jKV05HKeU7hmH4tVm897I6viXJJ4Zh\n",
198 "+K1lx+eiPmDjW9WdqFrr1yX5vNbaT9daL05yS5JjGU94ba1JYnCShmF4oPPSVkp5+TAMf5DRhPI/\n",
199 "nVWAGvvUGb73pMszejzEcvNSH7DBnXDVSq31mUle2Fr76fGh3UmuaK1dmuSBjFbfALPzxiTfON7X\n",
200 "7oszfqbULJRSXpXkpIYM16mOf5LkzeMVgZPH56I+4PSwmjtRNyS5qNb6n5L8WJLHWmtLy39vS3Lz\n",
201 "+CswA8MwHC2l3JDkW4dh+JkZ1/KWWb5/8sRquX80DMMvLe+bh/qA08eKd6JqrRcl2dRae1WS12T0\n",
202 "sL7J5cKPZLTlAzBDwzA8PAzDqdqEeK4Nw3DgeAEKYL2d6E7U5Un+c5K01hZrrR9J8mkT/duzwtNw\n",
203 "77rrLnOlAIAN47LLLjvRM9+ecKIQ9UhGy4H/sNb6rIw2uTxYa72gtfZwRpM2V5xfsJZiOLPVWl/f\n",
204 "Wnv9rOtg/vmssBY+L6zWWm/+nChE/cckv1RrvWfcfl1Ge1DdXms9luS+1trutZcJALCxrRiiWmvH\n",
205 "kvyr43RdMp1yAAA2BhsQAwB0EKIAADoIUcyTPbMugA1jz6wLYEPZM+sCOD1Nde+8u+66a7A6DwDY\n",
206 "CNaaW9yJAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAA\n",
207 "OghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA6bZ10AwOli\n",
208 "74P7b108dGRhqX3+OWfv23nRhVfPriJgmoQogHWyeOjIwg1377t0qX39roUZVgNMm+E8AIAOQhQA\n",
209 "QAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOnlgOMGO2i4GNSYgCmDHbxcDGZDgP\n",
210 "AKCDEAUA0EGIAgDoIEQBAHQwsRxgzmzbunnHHfc+tCexUg/mmRAFMGcOHD665cbxaj0r9WB+Gc4D\n",
211 "AOggRAEAdBCiAAA6CFEAAB1MLAeYgcn98jadVXbMuBygwwlDVK310STvGTffmuT3k9yS5FiS+5Nc\n",
212 "01obplYhwGlocr+863YtHJx1PcDareZO1N7W2uVLjVrrf0tyRWttsdZ6bZIrk9w2rQIBAObRakLU\n",
213 "F9da70ny8STfnuSx1triuO+2JDdHiAIAzjCrmVj+3NbaS5K8LsmtSR6Z6HskyXlTqAsAYK6dMES1\n",
214 "1h4ff31XkseTfNpE9/Ykj06nNACA+bViiKq17qy1XjH+/vlJ9ifZUmu9YHzKVUnunG6JAADz50Rz\n",
215 "ou5L8sO11tdkdMfpmoyG726vtR5Lcl9rbfeUawQAmDsrhqjW2qEk37Ds8IeTXDK1igAANgBPLAcA\n",
216 "6CBEAQB0sO0LwJRs27p5xx33PrQnSc4/5+x9Oy+68OrZVgSsJyEKYEoOHD665cbx1i7X71qYcTXA\n",
217 "ejOcBwDQQYgCAOggRAEAdBCiAAA6mFgOcApMrtRLkk1nlR0zLAdYB0IUwCkwuVIvSa7btXBwlvUA\n",
218 "J89wHgBAByEKAKCDEAUA0EGIAgDoYGI5wBxbvqrPHnwwP4QogDm2fFWfPfhgfhjOAwDoIEQBAHQQ\n",
219 "ogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDo4InlABvU3gf337p46MjCUtuWMHBqCVEA\n",
220 "G9TioSMLN9gSBmbGcB4AQAchCgCggxAFANBBiAIA6GBiOcAGsm3r5h133PvQniTZdFbZMeNy4Iwm\n",
221 "RAFsIAcOH91y43hF3nW7Fg7Ouh44kxnOAwDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCD\n",
222 "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHk1J9Van5Pk\n",
223 "niTflOTvktyS5FiS+5Nc01obplYhAMAcOuGdqFrrWUlel+RNSUqS3UmuaK1dmuSBJFdOtUIAgDm0\n",
224 "muG8a5P8SpK/H5//WGttcdx3W5JdU6oNAGBurRiiaq1fnaS01t49cf6jE6c8kuS8KdUGADC3TjQn\n",
225 "aleSr6m1vjDJjiSvSvL+if7teXKoAgA4I6wYolprNy19X2v9sSRvTfKjtdYLWmsPJ7kqyZ3TLREA\n",
226 "YP6sanXeMtcmub3WeizJfa213etcEwDA3Ft1iGqt/ZuJ5iVTqAUAYMPwsE0AgA5CFABAByEKAKCD\n",
227 "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHnWBQAwHXsf\n",
228 "3H/r4qEjC0ly/jln79t50YVXz7YiOL0IUQCnqcVDRxZuuHvfpUly/a6FGVcDpx/DeQAAHYQoAIAO\n",
229 "QhQAQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOtn0BOE1s27p5xx33PrRnqb3p\n",
230 "rLJjhuXAaU+IAjhNHDh8dMuN473ykuS6XQsHZ1kPnO4M5wEAdBCiAAA6CFEAAB3MiQI4CXsf3H/r\n",
231 "4qEjC8l8T+RePun8/HPO3rfzoguvnl1FsPEJUQAnYfHQkYUbxpO553ki9/JJ59fvWphhNXB6MJwH\n",
232 "ANBBiAIA6CBEAQB0EKIAADqYWA6wBpOr8ZL5XpHXa/JntIoPnpoQBbAGk6vxkvlekddr8me0ig+e\n",
233 "muE8AIAOQhQAQAchCgCggxAFANDBxHKAFZwJq/GAPkIUwArOhNV4QB/DeQAAHYQoAIAOQhQAQAch\n",
234 "CgCggxAFANBhxdV5tdbNSX4tyfOSPJbku5OUJLckOZbk/iTXtNaGKdcJADBXTnQn6hlJ3thae1GS\n",
235 "b0/yw0l2J7mitXZpkgeSXDndEgEA5s+Kd6JaaweTvH3cXEjy4SRbWmuL42O3Jbl5/BUA4Iyxqodt\n",
236 "1lr/R0ZDei9O8vqJrkeSnLf+ZQEAzLdVTSxvrb0iyeVJfj5PDk3bkzw6hboAAObaiiGq1vrCWutL\n",
237 "xs2PJHl6ki211gvGx65KcucU6wMAmEsnGs77yyRvrLW+PqNVef86ycEkt9dajyW5r7W2e7olAgDM\n",
238 "nxNNLP9wkq87Ttcl0ykHAGBj8LBNAIAOQhQAQIdVPeIAgNPX3gf337p46MjCUnvTWWXHDMuBDUOI\n",
239 "AjjDLR46snDD3fsuXWpft2vh4CzrgY3CcB4AQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAA\n",
240 "HYQoAIAOQhQAQAchCgCgg21fgDPS5H5x559z9r6dF1149WwrAjYaIQo4I03uF3f9roUZVwNsRIbz\n",
241 "AAA6CFEAAB2EKACADkIUAEAHIQoAoIMQBQDQQYgCAOggRAEAdBCiAAA6eGI5cMbbtnXzjjvufWjP\n",
242 "Uts2MMBqCFHAGe/A4aNbbhxvAZPYBgZYHcN5AAAdhCgAgA5CFABAByEKAKCDieUAy0yu1tt0Vtkx\n",
243 "43KAOSVEASwzuVrvul0LB2ddDzCfDOcBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGI\n",
244 "AgDoIEQBAHTwxHKAM5CtbeDkCVEAZyBb28DJM5wHANBBiAIA6CBEAQB0EKIAADqYWA5Al70P7r91\n",
245 "8dCRhaX2+eecvW/nRRdePbuK4NQSogDosnjoyMIN4xV+SXL9roUZVgOn3oohqtZ6VpJfSPKFGQ39\n",
246 "/UiSDyW5JcmxJPcnuaa1Nky5TgCAuXKiOVFfkuSB1tpLkrwqyeuS7E5yRWvt0iQPJLlyuiUCAMyf\n",
247 "Fe9Etdb+NMmfjptPT/K3SUprbXF87LYkN4+/AgCcMVa1Oq/Wel6S/5DkZ5McmOh6JMl5U6gLAGCu\n",
248 "nXBiea31M5K8Mcn3Jflgku+f6N6e5NHplAbAvJlckWfPPc50K96JqrV+VpJbk7ymtfZga+1wkq21\n",
249 "1gvGp1yV5M7plgjAvFhakXfD3fsuPfqJYcus64FZOtGdqGuTPCfJr9dak9Fdp2uT3F5rPZbkvtba\n",
250 "7umWCAAwf040sfzajELTcpdMpxwAgI3Bti8AAB2EKACADrZ9AeApbdu6eccd9z60Z6ltRR78AyEK\n",
251 "gKd04PDRLTdO7I933a6Fg7OsB+aJ4TwAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghR\n",
252 "AAAdhCgAgA6eWA6ctvY+uP/WxUNHFpLk/HPO3rfzoguvnm1FwOlEiAJOW4uHjizcMN6y5PpdCzOu\n",
253 "BjjdGM4DAOggRAEAdBCiAAA6CFEAAB1MLAdgXWzbunnHHfc+tGepbUUkpzshCoB1ceDw0S03jldD\n",
254 "JlZEcvoznAcA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQB\n",
255 "AHQQogAAOghRAAAdhCgAgA5CFABAh82zLgBgvex9cP+ti4eOLCy1N51VdsywHOA0J0QBp43FQ0cW\n",
256 "brh736VL7et2LRycZT3A6c1wHgBAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5C\n",
257 "FABAByEKAKCDbV+AM8K2rZt33HHvQ3uW2vbVA07WCUNUrXVbkjcleXtr7eZa68VJbklyLMn9Sa5p\n",
258 "rQ3TLRPg5Bw4fHTLjfbVA9bRaobzbkrylon27iRXtNYuTfJAkiunURgAwDw7YYhqrV2T5H1JUmvd\n",
259 "muSx1triuPu2JLumVx4AwHxa68Tyc5M8OtF+JMl561cOAMDGsNaJ5Qfy5NC0PU8OVQBTtffB/bcu\n",
260 "HjqysNQ+/5yz9+286MKrZ1cRT2VyMr/fE6ejNYWo1trhWuvWWusFrbWHk1yV5M7plAbwyRYPHVm4\n",
261 "YWKC+PW7FmZYDSuZnMzv98TpaC0hamkF3rVJbq+1HktyX2tt9/qXBQAw31YVolprb0/y9vH39ye5\n",
262 "ZJpFAQDMO08sBwDoIEQBAHSw7QuwoU2uALOVC3AqCVHAhja5AsxWLsCpZDgPAKCDEAUA0EGIAgDo\n",
263 "IEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgA\n",
264 "gA6bZ10AwEr2Prj/1sVDRxaW2pvOKjtmWA7AE4QoYK4tHjqycMPd+y5dal+3a+HgLOsBWGI4DwCg\n",
265 "gxAFANBBiAIA6CBEAQB0MLEcmLnlK/DOP+fsfTsvuvDq2VXEetu2dfOOO+59aM9Se6Xf8eTnwWeB\n",
266 "eSZEATO3fAXe9bsWZlgN03Dg8NEtN67ydzz5efBZYJ4ZzgMA6CBEAQB0EKIAADoIUQAAHUwsB+CU\n",
267 "m1ytt9IKvLWs6oNTTYgC4JSbXK230gq8tazqg1PNcB4AQAchCgCggxAFANBBiAIA6GBiOQAbxmpX\n",
268 "9S1nf0amQYgCYMNY7aq+5ezPyDQYzgMA6CBEAQB0EKIAADqYEwWcEmuZ2Ds5eXjTWWXHKSkQYI2E\n",
269 "KOCUWMvE3snJw9ftWjg4/eoA1s5wHgBAByEKAKCDEAUA0MGcKGDVDhw4sDXJxROHPn7uuee+d1b1\n",
270 "AMySEMXcqLW+tLW2Z9Z1sKKFO/7sb+58919/9Owk+fov2P7+Z33ksXcurbo7/1lPe/biRx//4NLJ\n",
271 "ttZgNSZXYyarX5G5/LrJz9vkatC/P/zYtmc84xnnr2fNkAhRzJeXJtkz4xo4gfv/5mPlf//Vwa1J\n",
272 "svNzzjnyscePPbHq7rpdCwdvvHvf5y6da2sNVmNyNWay+hWZy6+b/LwtXw1qlSfT0B2iaq0/leQF\n",
273 "Gc2r+v7W2t51qwoAYM51TSyvtb4iySdaay9O8sokP7muVQEAzLne1XkvS/JbSdJaO5jkz2qtz1m3\n",
274 "qgAA5lzvcN55SR6ZaH9kfOyvTroiYK699LnnPvZZ55z90SR53qc9/WkPHzoy65IAZqIMw7Dmi2qt\n",
275 "NyV5U2vtveP2Lya5qbX2/snz7rrrrrW/OADAjFx22WVltef23om6K8k3J3lvrXVbkouXB6i1FgIA\n",
276 "sJF0zYlqrf1BktRa35HkLUl+cD2LAgCYd13DeQAAZzp75wEAdBCiAAA6CFEAAB2mtnderfUlSX43\n",
277 "yZe21j48Pva9Sb4po/D2htbam6f1/mxMtdarM1qo8OHxoe9trb1ndhUxb2w5xVrUWh9NsvR/yFtb\n",
278 "azfPsh7my/gJA29K8vbW2s211ouT3JLkWJL7k1zTWnvKyeNTCVG11s9O8m1J7k5Sxsd2JHlBa+1F\n",
279 "tdbNSe6utb6ttfb306iBDWtI8uOttd+ddSHMn8ktp2qtn5rkzUkuPcFlnNn2ttYun3URzK2bMnrK\n",
280 "wDPH7d1JrmitLdZar01yZZLbnuriqQzntdY+0Fr7tiSPZ/RHMUlemuS3x/1Hk/zXJDun8f5seD9Q\n",
281 "a31XrXX3rAth7thyirX64lrrPbXWu2qtz551McyX1to1Sd6XJLXWrUkea60tjrtvS7JrpetP6k5U\n",
282 "rfXzk/zsssMfaq1dfZzTz0vy3on20lYxnIGe6rOT5Dtba78xPufnaq0vX3ouGcSWU6zdc1trj9da\n",
283 "vzrJG5JcNeuCmFvnJnl0ov1ITpBTTipEtdb+PMlqb5M+mmT7RPvTk/zFybw/G9cqPzu/l+TLkwhR\n",
284 "LFn6f+Svx+3teXKogidprT0+/vquWuv2E53PGe1AnhyatufJoeqTnIrVeUtbv9yd5NVJUmv9lCSv\n",
285 "TGJCKE9Sa31trfUzxs2vS3LvLOth7ixtObU0IfS4W05BktRad9Zarxh///z8Q/iGT9JaO5xka631\n",
286 "gvGhq5LcudI1pyJEDUnSWnsgyR/VWv9XknuS/FRrzfbvLPd/kry51vr2JI+21vbMuB7miC2nWKP7\n",
287 "klxVa92T5Pokr5ttOcyxpfnb1ya5ffw36Hmttd9e6SLbvgAAdPCwTQCADkIUAEAHIQoAoIMQBQDQ\n",
288 "QYgCAOggRAEAdBCiAAA6CFEAAB2EKACADv8fn0xUCxJB1sMAAAAASUVORK5CYII=\n"
289 ],
165 "image/png": "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\n1ADDXpIa8P8BEb7Ae9JKdQAAAAAASUVORK5CYII=\n",
290 166 "text/latex": [
291 167 "$\\mathcal{N}(\\mu=2, \\sigma=1),\\ N=1000$"
292 168 ],
293 169 "text/plain": [
294 "<__main__.Gaussian at 0x10665a4e0>"
170 "<__main__.Gaussian at 0x116fe76d8>"
295 171 ]
296 172 },
297 173 "execution_count": 4,
298 174 "metadata": {},
299 175 "output_type": "execute_result"
300 176 }
301 177 ],
302 178 "source": [
303 179 "x = Gaussian(2.0, 1.0)\n",
304 180 "x"
305 181 ]
306 182 },
307 183 {
308 184 "cell_type": "markdown",
309 185 "metadata": {},
310 186 "source": [
311 187 "You can also pass the object to the `display` function to display the default representation:"
312 188 ]
313 189 },
314 190 {
315 191 "cell_type": "code",
316 192 "execution_count": 5,
317 "metadata": {
318 "collapsed": false
319 },
193 "metadata": {},
320 194 "outputs": [
321 195 {
322 196 "data": {
323 "image/png": [
324 "iVBORw0KGgoAAAANSUhEUgAAAlEAAAGLCAYAAADnMccKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n",
325 "AAALEgAACxIB0t1+/AAAGsJJREFUeJzt3X2QndddH/DvsUQs5cXIRoCNA9mGGIR5Dy9KiBMnMmnq\n",
326 "BAbamjOdYIOBafEMGd4MocEGUrAbG1Sgw7sLwWAI5bhT6tC0abCN4rQlSjEhmVAbG1yRRHgTYgsp\n",
327 "xEKOlKd/3LvmeiOvdo/26t6VPp9/ds9znufe32rvaL/znHOeU4ZhCAAAa3PWrAsAANiIhCgAgA5C\n",
328 "FABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRsIGVUraMv5ZSyq5Z1zMPSinnllK+atZ1AKc/\n",
329 "IQo2oFLKV5ZS3pPkQClla5IfTPIXp+i9P7eUclMp5d+XUv6glPIVp+J9n6KWraWUXy6lvHjp2DAM\n",
330 "B5K8opTyvFnVtRrHq32i77NLKb9SSvmuUsqvllIWTrYPWH9CFMypUsofl1JecZzjm5Jcn+Tnkrwo\n",
331 "yRcleWwYhvefgprOSnJtktcNw/A9SX4zydtKKdun/d7HqeU7k7w+yRVJyrLun0zyE6e6ptU6Qe1J\n",
332 "cluS24Zh+IUkv5rkd9ahD1hnQhTMoXEo+fKM/sgu97IkvzgMw68Ow/AnSb4/ya+fotIuSvI1ST5r\n",
333 "3P6dJM9I8o2n6P2fMAzDrwzD8ENJPnqcvseT3F9KedFaX7eUcnYp5UdKKftLKfeVUspE36tLKfeX\n",
334 "Un6/lPJPp1F7KeXzknzpMAz/c3zuO5N8finlczr7ntNbJ7AyIQrm08VJfiPJPy+lPG1Z38uS/GGS\n",
335 "lFLOS/IpwzB87BTV9XdJnp3kgiQZhuHo+Ni5p+j91+ItSV691ouGYTiS0Z2s25JcmImAOAzDm5L8\n",
336 "xjAMXz8Mw++tV6HLfEmSDyw79sGM7jr29H3NFGoEIkTBvPqKJD+S5ONJXrms7+xhGD4+/v5lSd59\n",
337 "qooahmH/MAzbh2H442Q0ByfJeUn+6FTVsAbvSfLCzmtfnOSOjIbEfnBZ3ydOpqhV+Iwkh5cdeyzJ\n",
338 "+Uk+vaPvM6dQI5Bk86wLAI7r3GEY9pdS3pTkqiT/JUlKKV+Q5P9OnPeFSf58+cWllG9J8vnDMFw3\n",
339 "bv/LJOcPw/ATE+dsS/LTOf6cnEk/MwzDe5+i77uSvGVpCOl4SinfkeS7M7p7tX1c7+NJXj4Mw4fX\n",
340 "sZYnGYbh4+PJ25uGYTi2mmsmfFWSmzK6k/OXpZQXD8PwjlLKjiz7955C7edm9O8z6fEkz0qytbMP\n",
341 "mAIhCubM+LEFS38MfzPJO0spnzkMw4eS/OMkbeL07UnedZyX+Wfja5d8U5KfnzxhGIa/TfLtJ1Hn\n",
342 "FyV5RZLLVjjnRzO6Q/L8jELGHyV5zTAMe9ezlhUsDTV+ZI3XbRqGYUjygVLK7yR5bZJ3ZHTn77cn\n",
343 "T5xC7Z80TyrJ05M8muMHtdX0AVNgOA/mz2VJ7kmSYRjeneT+JNeM+549DMPDE+c+LcnRyYvHq/cu\n",
344 "SXLXuL0lyQsynke1Hkopz8roTs0rh2E47h/p8V2zK5N8zzAMx8bzp/YlOZUTnR/PGv+fK6V8ZpLF\n",
345 "iUM/leTyUsrFGd0hPLSO9R3Pw0meuezYM8Y1LXb0fWgKNQJxJwrm0aXDMLx2ov2LSf5tKeWX8snD\n",
346 "NY8k2bbs2FckeWgYhoPj9ouTvC/Jx0op5y2FnlLKuUn+XfqGoW7K6I7Sw+PVa/9iGIbly+lfleRt\n",
347 "wzB8Yvx+mzMaJvu+5W9wkrWs5FMz+jdai8uSvG2pMQzD+0opb83osRL3Lj95CrW/M6PJ+0uvvzmj\n",
348 "4Pm+JB/r7AOmQIiCOVBKOSej0PFQkr9e1v3GJD+U5Pcy+mM96QMZTUSe9LXj11ny6ozubO0av/aj\n",
349 "yRMPpVzzMFQp5bUZzRXaMZ4j9DkZ3T1JKeUrk5wzDMPdSf4m41V8Y9+V5JeHYfjg8tfsrWWyrKc4\n",
350 "PkzOh1pW31N57ngV3qSfTLIno2dzLX+Dda19GIYPlFL+Xyll53jY8+VJ/mQYhvvHP0NXH7D+hCiY\n",
351 "Dy/MaK7Ngxk9H+oJ4wnS35Nkd8ZDdBPuSfIDy45dluRYKeXqJJ+S5O7xsc8bhuHOkylyPER3Y5JN\n",
352 "kyVmNME9Sb45o3lDX5bRIwLeMJ7U/swkHxmG4baTef9ltXxrksuTfHaSnymlvCPJDyytXBw/rfvP\n",
353 "ll326ozC5Jcd5/Wen9Gw6TeUUs4ahuHHn/gBh+GeUsp/T7J3+XXTqD3JtyS5vpTygozuLH7zxOW9\n",
354 "fcA6K6O5k8CsjR+W+KGJYbjVXnfnMAxfO/5+S5L9Ga3E+/jKV05HKeU7hmH4tVm897I6viXJJ4Zh\n",
355 "+K1lx+eiPmDjW9WdqFrr1yX5vNbaT9daL05yS5JjGU94ba1JYnCShmF4oPPSVkp5+TAMf5DRhPI/\n",
356 "nVWAGvvUGb73pMszejzEcvNSH7DBnXDVSq31mUle2Fr76fGh3UmuaK1dmuSBjFbfALPzxiTfON7X\n",
357 "7oszfqbULJRSXpXkpIYM16mOf5LkzeMVgZPH56I+4PSwmjtRNyS5qNb6n5L8WJLHWmtLy39vS3Lz\n",
358 "+CswA8MwHC2l3JDkW4dh+JkZ1/KWWb5/8sRquX80DMMvLe+bh/qA08eKd6JqrRcl2dRae1WS12T0\n",
359 "sL7J5cKPZLTlAzBDwzA8PAzDqdqEeK4Nw3DgeAEKYL2d6E7U5Un+c5K01hZrrR9J8mkT/duzwtNw\n",
360 "77rrLnOlAIAN47LLLjvRM9+ecKIQ9UhGy4H/sNb6rIw2uTxYa72gtfZwRpM2V5xfsJZiOLPVWl/f\n",
361 "Wnv9rOtg/vmssBY+L6zWWm/+nChE/cckv1RrvWfcfl1Ge1DdXms9luS+1trutZcJALCxrRiiWmvH\n",
362 "kvyr43RdMp1yAAA2BhsQAwB0EKIAADoIUcyTPbMugA1jz6wLYEPZM+sCOD1Nde+8u+66a7A6DwDY\n",
363 "CNaaW9yJAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAA\n",
364 "OghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA6bZ10AwOli\n",
365 "74P7b108dGRhqX3+OWfv23nRhVfPriJgmoQogHWyeOjIwg1377t0qX39roUZVgNMm+E8AIAOQhQA\n",
366 "QAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOnlgOMGO2i4GNSYgCmDHbxcDGZDgP\n",
367 "AKCDEAUA0EGIAgDoIEQBAHQwsRxgzmzbunnHHfc+tCexUg/mmRAFMGcOHD665cbxaj0r9WB+Gc4D\n",
368 "AOggRAEAdBCiAAA6CFEAAB1MLAeYgcn98jadVXbMuBygwwlDVK310STvGTffmuT3k9yS5FiS+5Nc\n",
369 "01obplYhwGlocr+863YtHJx1PcDareZO1N7W2uVLjVrrf0tyRWttsdZ6bZIrk9w2rQIBAObRakLU\n",
370 "F9da70ny8STfnuSx1triuO+2JDdHiAIAzjCrmVj+3NbaS5K8LsmtSR6Z6HskyXlTqAsAYK6dMES1\n",
371 "1h4ff31XkseTfNpE9/Ykj06nNACA+bViiKq17qy1XjH+/vlJ9ifZUmu9YHzKVUnunG6JAADz50Rz\n",
372 "ou5L8sO11tdkdMfpmoyG726vtR5Lcl9rbfeUawQAmDsrhqjW2qEk37Ds8IeTXDK1igAANgBPLAcA\n",
373 "6CBEAQB0sO0LwJRs27p5xx33PrQnSc4/5+x9Oy+68OrZVgSsJyEKYEoOHD665cbx1i7X71qYcTXA\n",
374 "ejOcBwDQQYgCAOggRAEAdBCiAAA6mFgOcApMrtRLkk1nlR0zLAdYB0IUwCkwuVIvSa7btXBwlvUA\n",
375 "J89wHgBAByEKAKCDEAUA0EGIAgDoYGI5wBxbvqrPHnwwP4QogDm2fFWfPfhgfhjOAwDoIEQBAHQQ\n",
376 "ogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDo4InlABvU3gf337p46MjCUtuWMHBqCVEA\n",
377 "G9TioSMLN9gSBmbGcB4AQAchCgCggxAFANBBiAIA6GBiOcAGsm3r5h133PvQniTZdFbZMeNy4Iwm\n",
378 "RAFsIAcOH91y43hF3nW7Fg7Ouh44kxnOAwDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCD\n",
379 "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHk1J9Van5Pk\n",
380 "niTflOTvktyS5FiS+5Nc01obplYhAMAcOuGdqFrrWUlel+RNSUqS3UmuaK1dmuSBJFdOtUIAgDm0\n",
381 "muG8a5P8SpK/H5//WGttcdx3W5JdU6oNAGBurRiiaq1fnaS01t49cf6jE6c8kuS8KdUGADC3TjQn\n",
382 "aleSr6m1vjDJjiSvSvL+if7teXKoAgA4I6wYolprNy19X2v9sSRvTfKjtdYLWmsPJ7kqyZ3TLREA\n",
383 "YP6sanXeMtcmub3WeizJfa213etcEwDA3Ft1iGqt/ZuJ5iVTqAUAYMPwsE0AgA5CFABAByEKAKCD\n",
384 "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHnWBQAwHXsf\n",
385 "3H/r4qEjC0ly/jln79t50YVXz7YiOL0IUQCnqcVDRxZuuHvfpUly/a6FGVcDpx/DeQAAHYQoAIAO\n",
386 "QhQAQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOtn0BOE1s27p5xx33PrRnqb3p\n",
387 "rLJjhuXAaU+IAjhNHDh8dMuN473ykuS6XQsHZ1kPnO4M5wEAdBCiAAA6CFEAAB3MiQI4CXsf3H/r\n",
388 "4qEjC8l8T+RePun8/HPO3rfzoguvnl1FsPEJUQAnYfHQkYUbxpO553ki9/JJ59fvWphhNXB6MJwH\n",
389 "ANBBiAIA6CBEAQB0EKIAADqYWA6wBpOr8ZL5XpHXa/JntIoPnpoQBbAGk6vxkvlekddr8me0ig+e\n",
390 "muE8AIAOQhQAQAchCgCggxAFANDBxHKAFZwJq/GAPkIUwArOhNV4QB/DeQAAHYQoAIAOQhQAQAch\n",
391 "CgCggxAFANBhxdV5tdbNSX4tyfOSPJbku5OUJLckOZbk/iTXtNaGKdcJADBXTnQn6hlJ3thae1GS\n",
392 "b0/yw0l2J7mitXZpkgeSXDndEgEA5s+Kd6JaaweTvH3cXEjy4SRbWmuL42O3Jbl5/BUA4Iyxqodt\n",
393 "1lr/R0ZDei9O8vqJrkeSnLf+ZQEAzLdVTSxvrb0iyeVJfj5PDk3bkzw6hboAAObaiiGq1vrCWutL\n",
394 "xs2PJHl6ki211gvGx65KcucU6wMAmEsnGs77yyRvrLW+PqNVef86ycEkt9dajyW5r7W2e7olAgDM\n",
395 "nxNNLP9wkq87Ttcl0ykHAGBj8LBNAIAOQhQAQIdVPeIAgNPX3gf337p46MjCUnvTWWXHDMuBDUOI\n",
396 "AjjDLR46snDD3fsuXWpft2vh4CzrgY3CcB4AQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAA\n",
397 "HYQoAIAOQhQAQAchCgCgg21fgDPS5H5x559z9r6dF1149WwrAjYaIQo4I03uF3f9roUZVwNsRIbz\n",
398 "AAA6CFEAAB2EKACADkIUAEAHIQoAoIMQBQDQQYgCAOggRAEAdBCiAAA6eGI5cMbbtnXzjjvufWjP\n",
399 "Uts2MMBqCFHAGe/A4aNbbhxvAZPYBgZYHcN5AAAdhCgAgA5CFABAByEKAKCDieUAy0yu1tt0Vtkx\n",
400 "43KAOSVEASwzuVrvul0LB2ddDzCfDOcBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGI\n",
401 "AgDoIEQBAHTwxHKAM5CtbeDkCVEAZyBb28DJM5wHANBBiAIA6CBEAQB0EKIAADqYWA5Al70P7r91\n",
402 "8dCRhaX2+eecvW/nRRdePbuK4NQSogDosnjoyMIN4xV+SXL9roUZVgOn3oohqtZ6VpJfSPKFGQ39\n",
403 "/UiSDyW5JcmxJPcnuaa1Nky5TgCAuXKiOVFfkuSB1tpLkrwqyeuS7E5yRWvt0iQPJLlyuiUCAMyf\n",
404 "Fe9Etdb+NMmfjptPT/K3SUprbXF87LYkN4+/AgCcMVa1Oq/Wel6S/5DkZ5McmOh6JMl5U6gLAGCu\n",
405 "nXBiea31M5K8Mcn3Jflgku+f6N6e5NHplAbAvJlckWfPPc50K96JqrV+VpJbk7ymtfZga+1wkq21\n",
406 "1gvGp1yV5M7plgjAvFhakXfD3fsuPfqJYcus64FZOtGdqGuTPCfJr9dak9Fdp2uT3F5rPZbkvtba\n",
407 "7umWCAAwf040sfzajELTcpdMpxwAgI3Bti8AAB2EKACADrZ9AeApbdu6eccd9z60Z6ltRR78AyEK\n",
408 "gKd04PDRLTdO7I933a6Fg7OsB+aJ4TwAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghR\n",
409 "AAAdhCgAgA6eWA6ctvY+uP/WxUNHFpLk/HPO3rfzoguvnm1FwOlEiAJOW4uHjizcMN6y5PpdCzOu\n",
410 "BjjdGM4DAOggRAEAdBCiAAA6CFEAAB1MLAdgXWzbunnHHfc+tGepbUUkpzshCoB1ceDw0S03jldD\n",
411 "JlZEcvoznAcA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQB\n",
412 "AHQQogAAOghRAAAdhCgAgA5CFABAh82zLgBgvex9cP+ti4eOLCy1N51VdsywHOA0J0QBp43FQ0cW\n",
413 "brh736VL7et2LRycZT3A6c1wHgBAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5C\n",
414 "FABAByEKAKCDbV+AM8K2rZt33HHvQ3uW2vbVA07WCUNUrXVbkjcleXtr7eZa68VJbklyLMn9Sa5p\n",
415 "rQ3TLRPg5Bw4fHTLjfbVA9bRaobzbkrylon27iRXtNYuTfJAkiunURgAwDw7YYhqrV2T5H1JUmvd\n",
416 "muSx1triuPu2JLumVx4AwHxa68Tyc5M8OtF+JMl561cOAMDGsNaJ5Qfy5NC0PU8OVQBTtffB/bcu\n",
417 "HjqysNQ+/5yz9+286MKrZ1cRT2VyMr/fE6ejNYWo1trhWuvWWusFrbWHk1yV5M7plAbwyRYPHVm4\n",
418 "YWKC+PW7FmZYDSuZnMzv98TpaC0hamkF3rVJbq+1HktyX2tt9/qXBQAw31YVolprb0/y9vH39ye5\n",
419 "ZJpFAQDMO08sBwDoIEQBAHSw7QuwoU2uALOVC3AqCVHAhja5AsxWLsCpZDgPAKCDEAUA0EGIAgDo\n",
420 "IEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgA\n",
421 "gA6bZ10AwEr2Prj/1sVDRxaW2pvOKjtmWA7AE4QoYK4tHjqycMPd+y5dal+3a+HgLOsBWGI4DwCg\n",
422 "gxAFANBBiAIA6CBEAQB0MLEcmLnlK/DOP+fsfTsvuvDq2VXEetu2dfOOO+59aM9Se6Xf8eTnwWeB\n",
423 "eSZEATO3fAXe9bsWZlgN03Dg8NEtN67ydzz5efBZYJ4ZzgMA6CBEAQB0EKIAADoIUQAAHUwsB+CU\n",
424 "m1ytt9IKvLWs6oNTTYgC4JSbXK230gq8tazqg1PNcB4AQAchCgCggxAFANBBiAIA6GBiOQAbxmpX\n",
425 "9S1nf0amQYgCYMNY7aq+5ezPyDQYzgMA6CBEAQB0EKIAADqYEwWcEmuZ2Ds5eXjTWWXHKSkQYI2E\n",
426 "KOCUWMvE3snJw9ftWjg4/eoA1s5wHgBAByEKAKCDEAUA0MGcKGDVDhw4sDXJxROHPn7uuee+d1b1\n",
427 "AMySEMXcqLW+tLW2Z9Z1sKKFO/7sb+58919/9Owk+fov2P7+Z33ksXcurbo7/1lPe/biRx//4NLJ\n",
428 "ttZgNSZXYyarX5G5/LrJz9vkatC/P/zYtmc84xnnr2fNkAhRzJeXJtkz4xo4gfv/5mPlf//Vwa1J\n",
429 "svNzzjnyscePPbHq7rpdCwdvvHvf5y6da2sNVmNyNWay+hWZy6+b/LwtXw1qlSfT0B2iaq0/leQF\n",
430 "Gc2r+v7W2t51qwoAYM51TSyvtb4iySdaay9O8sokP7muVQEAzLne1XkvS/JbSdJaO5jkz2qtz1m3\n",
431 "qgAA5lzvcN55SR6ZaH9kfOyvTroiYK699LnnPvZZ55z90SR53qc9/WkPHzoy65IAZqIMw7Dmi2qt\n",
432 "NyV5U2vtveP2Lya5qbX2/snz7rrrrrW/OADAjFx22WVltef23om6K8k3J3lvrXVbkouXB6i1FgIA\n",
433 "sJF0zYlqrf1BktRa35HkLUl+cD2LAgCYd13DeQAAZzp75wEAdBCiAAA6CFEAAB2mtnderfUlSX43\n",
434 "yZe21j48Pva9Sb4po/D2htbam6f1/mxMtdarM1qo8OHxoe9trb1ndhUxb2w5xVrUWh9NsvR/yFtb\n",
435 "azfPsh7my/gJA29K8vbW2s211ouT3JLkWJL7k1zTWnvKyeNTCVG11s9O8m1J7k5Sxsd2JHlBa+1F\n",
436 "tdbNSe6utb6ttfb306iBDWtI8uOttd+ddSHMn8ktp2qtn5rkzUkuPcFlnNn2ttYun3URzK2bMnrK\n",
437 "wDPH7d1JrmitLdZar01yZZLbnuriqQzntdY+0Fr7tiSPZ/RHMUlemuS3x/1Hk/zXJDun8f5seD9Q\n",
438 "a31XrXX3rAth7thyirX64lrrPbXWu2qtz551McyX1to1Sd6XJLXWrUkea60tjrtvS7JrpetP6k5U\n",
439 "rfXzk/zsssMfaq1dfZzTz0vy3on20lYxnIGe6rOT5Dtba78xPufnaq0vX3ouGcSWU6zdc1trj9da\n",
440 "vzrJG5JcNeuCmFvnJnl0ov1ITpBTTipEtdb+PMlqb5M+mmT7RPvTk/zFybw/G9cqPzu/l+TLkwhR\n",
441 "LFn6f+Svx+3teXKogidprT0+/vquWuv2E53PGe1AnhyatufJoeqTnIrVeUtbv9yd5NVJUmv9lCSv\n",
442 "TGJCKE9Sa31trfUzxs2vS3LvLOth7ixtObU0IfS4W05BktRad9Zarxh///z8Q/iGT9JaO5xka631\n",
443 "gvGhq5LcudI1pyJEDUnSWnsgyR/VWv9XknuS/FRrzfbvLPd/kry51vr2JI+21vbMuB7miC2nWKP7\n",
444 "klxVa92T5Pokr5ttOcyxpfnb1ya5ffw36Hmttd9e6SLbvgAAdPCwTQCADkIUAEAHIQoAoIMQBQDQ\n",
445 "QYgCAOggRAEAdBCiAAA6CFEAAB2EKACADv8fn0xUCxJB1sMAAAAASUVORK5CYII=\n"
446 ],
197 "image/png": "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\n1ADDXpIa8P8BEb7Ae9JKdQAAAAAASUVORK5CYII=\n",
447 198 "text/latex": [
448 199 "$\\mathcal{N}(\\mu=2, \\sigma=1),\\ N=1000$"
449 200 ],
450 201 "text/plain": [
451 "<__main__.Gaussian at 0x10665a4e0>"
202 "<__main__.Gaussian at 0x116fe76d8>"
452 203 ]
453 204 },
454 205 "metadata": {},
455 206 "output_type": "display_data"
456 207 }
457 208 ],
458 209 "source": [
459 210 "display(x)"
460 211 ]
461 212 },
462 213 {
463 214 "cell_type": "markdown",
464 215 "metadata": {},
465 216 "source": [
466 217 "Use `display_png` to view the PNG representation:"
467 218 ]
468 219 },
469 220 {
470 221 "cell_type": "code",
471 222 "execution_count": 6,
472 "metadata": {
473 "collapsed": false
474 },
223 "metadata": {},
475 224 "outputs": [
476 225 {
477 226 "data": {
478 "image/png": [
479 "iVBORw0KGgoAAAANSUhEUgAAAlEAAAGLCAYAAADnMccKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n",
480 "AAALEgAACxIB0t1+/AAAGsJJREFUeJzt3X2QndddH/DvsUQs5cXIRoCNA9mGGIR5Dy9KiBMnMmnq\n",
481 "BAbamjOdYIOBafEMGd4MocEGUrAbG1Sgw7sLwWAI5bhT6tC0abCN4rQlSjEhmVAbG1yRRHgTYgsp\n",
482 "xEKOlKd/3LvmeiOvdo/26t6VPp9/ds9znufe32rvaL/znHOeU4ZhCAAAa3PWrAsAANiIhCgAgA5C\n",
483 "FABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRsIGVUraMv5ZSyq5Z1zMPSinnllK+atZ1AKc/\n",
484 "IQo2oFLKV5ZS3pPkQClla5IfTPIXp+i9P7eUclMp5d+XUv6glPIVp+J9n6KWraWUXy6lvHjp2DAM\n",
485 "B5K8opTyvFnVtRrHq32i77NLKb9SSvmuUsqvllIWTrYPWH9CFMypUsofl1JecZzjm5Jcn+Tnkrwo\n",
486 "yRcleWwYhvefgprOSnJtktcNw/A9SX4zydtKKdun/d7HqeU7k7w+yRVJyrLun0zyE6e6ptU6Qe1J\n",
487 "cluS24Zh+IUkv5rkd9ahD1hnQhTMoXEo+fKM/sgu97IkvzgMw68Ow/AnSb4/ya+fotIuSvI1ST5r\n",
488 "3P6dJM9I8o2n6P2fMAzDrwzD8ENJPnqcvseT3F9KedFaX7eUcnYp5UdKKftLKfeVUspE36tLKfeX\n",
489 "Un6/lPJPp1F7KeXzknzpMAz/c3zuO5N8finlczr7ntNbJ7AyIQrm08VJfiPJPy+lPG1Z38uS/GGS\n",
490 "lFLOS/IpwzB87BTV9XdJnp3kgiQZhuHo+Ni5p+j91+ItSV691ouGYTiS0Z2s25JcmImAOAzDm5L8\n",
491 "xjAMXz8Mw++tV6HLfEmSDyw79sGM7jr29H3NFGoEIkTBvPqKJD+S5ONJXrms7+xhGD4+/v5lSd59\n",
492 "qooahmH/MAzbh2H442Q0ByfJeUn+6FTVsAbvSfLCzmtfnOSOjIbEfnBZ3ydOpqhV+Iwkh5cdeyzJ\n",
493 "+Uk+vaPvM6dQI5Bk86wLAI7r3GEY9pdS3pTkqiT/JUlKKV+Q5P9OnPeFSf58+cWllG9J8vnDMFw3\n",
494 "bv/LJOcPw/ATE+dsS/LTOf6cnEk/MwzDe5+i77uSvGVpCOl4SinfkeS7M7p7tX1c7+NJXj4Mw4fX\n",
495 "sZYnGYbh4+PJ25uGYTi2mmsmfFWSmzK6k/OXpZQXD8PwjlLKjiz7955C7edm9O8z6fEkz0qytbMP\n",
496 "mAIhCubM+LEFS38MfzPJO0spnzkMw4eS/OMkbeL07UnedZyX+Wfja5d8U5KfnzxhGIa/TfLtJ1Hn\n",
497 "FyV5RZLLVjjnRzO6Q/L8jELGHyV5zTAMe9ezlhUsDTV+ZI3XbRqGYUjygVLK7yR5bZJ3ZHTn77cn\n",
498 "T5xC7Z80TyrJ05M8muMHtdX0AVNgOA/mz2VJ7kmSYRjeneT+JNeM+549DMPDE+c+LcnRyYvHq/cu\n",
499 "SXLXuL0lyQsynke1Hkopz8roTs0rh2E47h/p8V2zK5N8zzAMx8bzp/YlOZUTnR/PGv+fK6V8ZpLF\n",
500 "iUM/leTyUsrFGd0hPLSO9R3Pw0meuezYM8Y1LXb0fWgKNQJxJwrm0aXDMLx2ov2LSf5tKeWX8snD\n",
501 "NY8k2bbs2FckeWgYhoPj9ouTvC/Jx0op5y2FnlLKuUn+XfqGoW7K6I7Sw+PVa/9iGIbly+lfleRt\n",
502 "wzB8Yvx+mzMaJvu+5W9wkrWs5FMz+jdai8uSvG2pMQzD+0opb83osRL3Lj95CrW/M6PJ+0uvvzmj\n",
503 "4Pm+JB/r7AOmQIiCOVBKOSej0PFQkr9e1v3GJD+U5Pcy+mM96QMZTUSe9LXj11ny6ozubO0av/aj\n",
504 "yRMPpVzzMFQp5bUZzRXaMZ4j9DkZ3T1JKeUrk5wzDMPdSf4m41V8Y9+V5JeHYfjg8tfsrWWyrKc4\n",
505 "PkzOh1pW31N57ngV3qSfTLIno2dzLX+Dda19GIYPlFL+Xyll53jY8+VJ/mQYhvvHP0NXH7D+hCiY\n",
506 "Dy/MaK7Ngxk9H+oJ4wnS35Nkd8ZDdBPuSfIDy45dluRYKeXqJJ+S5O7xsc8bhuHOkylyPER3Y5JN\n",
507 "kyVmNME9Sb45o3lDX5bRIwLeMJ7U/swkHxmG4baTef9ltXxrksuTfHaSnymlvCPJDyytXBw/rfvP\n",
508 "ll326ozC5Jcd5/Wen9Gw6TeUUs4ahuHHn/gBh+GeUsp/T7J3+XXTqD3JtyS5vpTygozuLH7zxOW9\n",
509 "fcA6K6O5k8CsjR+W+KGJYbjVXnfnMAxfO/5+S5L9Ga3E+/jKV05HKeU7hmH4tVm897I6viXJJ4Zh\n",
510 "+K1lx+eiPmDjW9WdqFrr1yX5vNbaT9daL05yS5JjGU94ba1JYnCShmF4oPPSVkp5+TAMf5DRhPI/\n",
511 "nVWAGvvUGb73pMszejzEcvNSH7DBnXDVSq31mUle2Fr76fGh3UmuaK1dmuSBjFbfALPzxiTfON7X\n",
512 "7oszfqbULJRSXpXkpIYM16mOf5LkzeMVgZPH56I+4PSwmjtRNyS5qNb6n5L8WJLHWmtLy39vS3Lz\n",
513 "+CswA8MwHC2l3JDkW4dh+JkZ1/KWWb5/8sRquX80DMMvLe+bh/qA08eKd6JqrRcl2dRae1WS12T0\n",
514 "sL7J5cKPZLTlAzBDwzA8PAzDqdqEeK4Nw3DgeAEKYL2d6E7U5Un+c5K01hZrrR9J8mkT/duzwtNw\n",
515 "77rrLnOlAIAN47LLLjvRM9+ecKIQ9UhGy4H/sNb6rIw2uTxYa72gtfZwRpM2V5xfsJZiOLPVWl/f\n",
516 "Wnv9rOtg/vmssBY+L6zWWm/+nChE/cckv1RrvWfcfl1Ge1DdXms9luS+1trutZcJALCxrRiiWmvH\n",
517 "kvyr43RdMp1yAAA2BhsQAwB0EKIAADoIUcyTPbMugA1jz6wLYEPZM+sCOD1Nde+8u+66a7A6DwDY\n",
518 "CNaaW9yJAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAA\n",
519 "OghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA6bZ10AwOli\n",
520 "74P7b108dGRhqX3+OWfv23nRhVfPriJgmoQogHWyeOjIwg1377t0qX39roUZVgNMm+E8AIAOQhQA\n",
521 "QAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOnlgOMGO2i4GNSYgCmDHbxcDGZDgP\n",
522 "AKCDEAUA0EGIAgDoIEQBAHQwsRxgzmzbunnHHfc+tCexUg/mmRAFMGcOHD665cbxaj0r9WB+Gc4D\n",
523 "AOggRAEAdBCiAAA6CFEAAB1MLAeYgcn98jadVXbMuBygwwlDVK310STvGTffmuT3k9yS5FiS+5Nc\n",
524 "01obplYhwGlocr+863YtHJx1PcDareZO1N7W2uVLjVrrf0tyRWttsdZ6bZIrk9w2rQIBAObRakLU\n",
525 "F9da70ny8STfnuSx1triuO+2JDdHiAIAzjCrmVj+3NbaS5K8LsmtSR6Z6HskyXlTqAsAYK6dMES1\n",
526 "1h4ff31XkseTfNpE9/Ykj06nNACA+bViiKq17qy1XjH+/vlJ9ifZUmu9YHzKVUnunG6JAADz50Rz\n",
527 "ou5L8sO11tdkdMfpmoyG726vtR5Lcl9rbfeUawQAmDsrhqjW2qEk37Ds8IeTXDK1igAANgBPLAcA\n",
528 "6CBEAQB0sO0LwJRs27p5xx33PrQnSc4/5+x9Oy+68OrZVgSsJyEKYEoOHD665cbx1i7X71qYcTXA\n",
529 "ejOcBwDQQYgCAOggRAEAdBCiAAA6mFgOcApMrtRLkk1nlR0zLAdYB0IUwCkwuVIvSa7btXBwlvUA\n",
530 "J89wHgBAByEKAKCDEAUA0EGIAgDoYGI5wBxbvqrPHnwwP4QogDm2fFWfPfhgfhjOAwDoIEQBAHQQ\n",
531 "ogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDo4InlABvU3gf337p46MjCUtuWMHBqCVEA\n",
532 "G9TioSMLN9gSBmbGcB4AQAchCgCggxAFANBBiAIA6GBiOcAGsm3r5h133PvQniTZdFbZMeNy4Iwm\n",
533 "RAFsIAcOH91y43hF3nW7Fg7Ouh44kxnOAwDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCD\n",
534 "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHk1J9Van5Pk\n",
535 "niTflOTvktyS5FiS+5Nc01obplYhAMAcOuGdqFrrWUlel+RNSUqS3UmuaK1dmuSBJFdOtUIAgDm0\n",
536 "muG8a5P8SpK/H5//WGttcdx3W5JdU6oNAGBurRiiaq1fnaS01t49cf6jE6c8kuS8KdUGADC3TjQn\n",
537 "aleSr6m1vjDJjiSvSvL+if7teXKoAgA4I6wYolprNy19X2v9sSRvTfKjtdYLWmsPJ7kqyZ3TLREA\n",
538 "YP6sanXeMtcmub3WeizJfa213etcEwDA3Ft1iGqt/ZuJ5iVTqAUAYMPwsE0AgA5CFABAByEKAKCD\n",
539 "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHnWBQAwHXsf\n",
540 "3H/r4qEjC0ly/jln79t50YVXz7YiOL0IUQCnqcVDRxZuuHvfpUly/a6FGVcDpx/DeQAAHYQoAIAO\n",
541 "QhQAQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOtn0BOE1s27p5xx33PrRnqb3p\n",
542 "rLJjhuXAaU+IAjhNHDh8dMuN473ykuS6XQsHZ1kPnO4M5wEAdBCiAAA6CFEAAB3MiQI4CXsf3H/r\n",
543 "4qEjC8l8T+RePun8/HPO3rfzoguvnl1FsPEJUQAnYfHQkYUbxpO553ki9/JJ59fvWphhNXB6MJwH\n",
544 "ANBBiAIA6CBEAQB0EKIAADqYWA6wBpOr8ZL5XpHXa/JntIoPnpoQBbAGk6vxkvlekddr8me0ig+e\n",
545 "muE8AIAOQhQAQAchCgCggxAFANDBxHKAFZwJq/GAPkIUwArOhNV4QB/DeQAAHYQoAIAOQhQAQAch\n",
546 "CgCggxAFANBhxdV5tdbNSX4tyfOSPJbku5OUJLckOZbk/iTXtNaGKdcJADBXTnQn6hlJ3thae1GS\n",
547 "b0/yw0l2J7mitXZpkgeSXDndEgEA5s+Kd6JaaweTvH3cXEjy4SRbWmuL42O3Jbl5/BUA4Iyxqodt\n",
548 "1lr/R0ZDei9O8vqJrkeSnLf+ZQEAzLdVTSxvrb0iyeVJfj5PDk3bkzw6hboAAObaiiGq1vrCWutL\n",
549 "xs2PJHl6ki211gvGx65KcucU6wMAmEsnGs77yyRvrLW+PqNVef86ycEkt9dajyW5r7W2e7olAgDM\n",
550 "nxNNLP9wkq87Ttcl0ykHAGBj8LBNAIAOQhQAQIdVPeIAgNPX3gf337p46MjCUnvTWWXHDMuBDUOI\n",
551 "AjjDLR46snDD3fsuXWpft2vh4CzrgY3CcB4AQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAA\n",
552 "HYQoAIAOQhQAQAchCgCgg21fgDPS5H5x559z9r6dF1149WwrAjYaIQo4I03uF3f9roUZVwNsRIbz\n",
553 "AAA6CFEAAB2EKACADkIUAEAHIQoAoIMQBQDQQYgCAOggRAEAdBCiAAA6eGI5cMbbtnXzjjvufWjP\n",
554 "Uts2MMBqCFHAGe/A4aNbbhxvAZPYBgZYHcN5AAAdhCgAgA5CFABAByEKAKCDieUAy0yu1tt0Vtkx\n",
555 "43KAOSVEASwzuVrvul0LB2ddDzCfDOcBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGI\n",
556 "AgDoIEQBAHTwxHKAM5CtbeDkCVEAZyBb28DJM5wHANBBiAIA6CBEAQB0EKIAADqYWA5Al70P7r91\n",
557 "8dCRhaX2+eecvW/nRRdePbuK4NQSogDosnjoyMIN4xV+SXL9roUZVgOn3oohqtZ6VpJfSPKFGQ39\n",
558 "/UiSDyW5JcmxJPcnuaa1Nky5TgCAuXKiOVFfkuSB1tpLkrwqyeuS7E5yRWvt0iQPJLlyuiUCAMyf\n",
559 "Fe9Etdb+NMmfjptPT/K3SUprbXF87LYkN4+/AgCcMVa1Oq/Wel6S/5DkZ5McmOh6JMl5U6gLAGCu\n",
560 "nXBiea31M5K8Mcn3Jflgku+f6N6e5NHplAbAvJlckWfPPc50K96JqrV+VpJbk7ymtfZga+1wkq21\n",
561 "1gvGp1yV5M7plgjAvFhakXfD3fsuPfqJYcus64FZOtGdqGuTPCfJr9dak9Fdp2uT3F5rPZbkvtba\n",
562 "7umWCAAwf040sfzajELTcpdMpxwAgI3Bti8AAB2EKACADrZ9AeApbdu6eccd9z60Z6ltRR78AyEK\n",
563 "gKd04PDRLTdO7I933a6Fg7OsB+aJ4TwAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghR\n",
564 "AAAdhCgAgA6eWA6ctvY+uP/WxUNHFpLk/HPO3rfzoguvnm1FwOlEiAJOW4uHjizcMN6y5PpdCzOu\n",
565 "BjjdGM4DAOggRAEAdBCiAAA6CFEAAB1MLAdgXWzbunnHHfc+tGepbUUkpzshCoB1ceDw0S03jldD\n",
566 "JlZEcvoznAcA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQB\n",
567 "AHQQogAAOghRAAAdhCgAgA5CFABAh82zLgBgvex9cP+ti4eOLCy1N51VdsywHOA0J0QBp43FQ0cW\n",
568 "brh736VL7et2LRycZT3A6c1wHgBAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5C\n",
569 "FABAByEKAKCDbV+AM8K2rZt33HHvQ3uW2vbVA07WCUNUrXVbkjcleXtr7eZa68VJbklyLMn9Sa5p\n",
570 "rQ3TLRPg5Bw4fHTLjfbVA9bRaobzbkrylon27iRXtNYuTfJAkiunURgAwDw7YYhqrV2T5H1JUmvd\n",
571 "muSx1triuPu2JLumVx4AwHxa68Tyc5M8OtF+JMl561cOAMDGsNaJ5Qfy5NC0PU8OVQBTtffB/bcu\n",
572 "HjqysNQ+/5yz9+286MKrZ1cRT2VyMr/fE6ejNYWo1trhWuvWWusFrbWHk1yV5M7plAbwyRYPHVm4\n",
573 "YWKC+PW7FmZYDSuZnMzv98TpaC0hamkF3rVJbq+1HktyX2tt9/qXBQAw31YVolprb0/y9vH39ye5\n",
574 "ZJpFAQDMO08sBwDoIEQBAHSw7QuwoU2uALOVC3AqCVHAhja5AsxWLsCpZDgPAKCDEAUA0EGIAgDo\n",
575 "IEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgA\n",
576 "gA6bZ10AwEr2Prj/1sVDRxaW2pvOKjtmWA7AE4QoYK4tHjqycMPd+y5dal+3a+HgLOsBWGI4DwCg\n",
577 "gxAFANBBiAIA6CBEAQB0MLEcmLnlK/DOP+fsfTsvuvDq2VXEetu2dfOOO+59aM9Se6Xf8eTnwWeB\n",
578 "eSZEATO3fAXe9bsWZlgN03Dg8NEtN67ydzz5efBZYJ4ZzgMA6CBEAQB0EKIAADoIUQAAHUwsB+CU\n",
579 "m1ytt9IKvLWs6oNTTYgC4JSbXK230gq8tazqg1PNcB4AQAchCgCggxAFANBBiAIA6GBiOQAbxmpX\n",
580 "9S1nf0amQYgCYMNY7aq+5ezPyDQYzgMA6CBEAQB0EKIAADqYEwWcEmuZ2Ds5eXjTWWXHKSkQYI2E\n",
581 "KOCUWMvE3snJw9ftWjg4/eoA1s5wHgBAByEKAKCDEAUA0MGcKGDVDhw4sDXJxROHPn7uuee+d1b1\n",
582 "AMySEMXcqLW+tLW2Z9Z1sKKFO/7sb+58919/9Owk+fov2P7+Z33ksXcurbo7/1lPe/biRx//4NLJ\n",
583 "ttZgNSZXYyarX5G5/LrJz9vkatC/P/zYtmc84xnnr2fNkAhRzJeXJtkz4xo4gfv/5mPlf//Vwa1J\n",
584 "svNzzjnyscePPbHq7rpdCwdvvHvf5y6da2sNVmNyNWay+hWZy6+b/LwtXw1qlSfT0B2iaq0/leQF\n",
585 "Gc2r+v7W2t51qwoAYM51TSyvtb4iySdaay9O8sokP7muVQEAzLne1XkvS/JbSdJaO5jkz2qtz1m3\n",
586 "qgAA5lzvcN55SR6ZaH9kfOyvTroiYK699LnnPvZZ55z90SR53qc9/WkPHzoy65IAZqIMw7Dmi2qt\n",
587 "NyV5U2vtveP2Lya5qbX2/snz7rrrrrW/OADAjFx22WVltef23om6K8k3J3lvrXVbkouXB6i1FgIA\n",
588 "sJF0zYlqrf1BktRa35HkLUl+cD2LAgCYd13DeQAAZzp75wEAdBCiAAA6CFEAAB2mtnderfUlSX43\n",
589 "yZe21j48Pva9Sb4po/D2htbam6f1/mxMtdarM1qo8OHxoe9trb1ndhUxb2w5xVrUWh9NsvR/yFtb\n",
590 "azfPsh7my/gJA29K8vbW2s211ouT3JLkWJL7k1zTWnvKyeNTCVG11s9O8m1J7k5Sxsd2JHlBa+1F\n",
591 "tdbNSe6utb6ttfb306iBDWtI8uOttd+ddSHMn8ktp2qtn5rkzUkuPcFlnNn2ttYun3URzK2bMnrK\n",
592 "wDPH7d1JrmitLdZar01yZZLbnuriqQzntdY+0Fr7tiSPZ/RHMUlemuS3x/1Hk/zXJDun8f5seD9Q\n",
593 "a31XrXX3rAth7thyirX64lrrPbXWu2qtz551McyX1to1Sd6XJLXWrUkea60tjrtvS7JrpetP6k5U\n",
594 "rfXzk/zsssMfaq1dfZzTz0vy3on20lYxnIGe6rOT5Dtba78xPufnaq0vX3ouGcSWU6zdc1trj9da\n",
595 "vzrJG5JcNeuCmFvnJnl0ov1ITpBTTipEtdb+PMlqb5M+mmT7RPvTk/zFybw/G9cqPzu/l+TLkwhR\n",
596 "LFn6f+Svx+3teXKogidprT0+/vquWuv2E53PGe1AnhyatufJoeqTnIrVeUtbv9yd5NVJUmv9lCSv\n",
597 "TGJCKE9Sa31trfUzxs2vS3LvLOth7ixtObU0IfS4W05BktRad9Zarxh///z8Q/iGT9JaO5xka631\n",
598 "gvGhq5LcudI1pyJEDUnSWnsgyR/VWv9XknuS/FRrzfbvLPd/kry51vr2JI+21vbMuB7miC2nWKP7\n",
599 "klxVa92T5Pokr5ttOcyxpfnb1ya5ffw36Hmttd9e6SLbvgAAdPCwTQCADkIUAEAHIQoAoIMQBQDQ\n",
600 "QYgCAOggRAEAdBCiAAA6CFEAAB2EKACADv8fn0xUCxJB1sMAAAAASUVORK5CYII=\n"
601 ]
227 "image/png": "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\n1ADDXpIa8P8BEb7Ae9JKdQAAAAAASUVORK5CYII=\n"
602 228 },
603 229 "metadata": {},
604 230 "output_type": "display_data"
605 231 }
606 232 ],
607 233 "source": [
608 234 "display_png(x)"
609 235 ]
610 236 },
611 237 {
612 238 "cell_type": "markdown",
613 239 "metadata": {},
614 240 "source": [
615 241 "<div class=\"alert alert-success\">\n",
616 242 "It is important to note a subtle different between <code>display</code> and <code>display_png</code>. The former computes <em>all</em> representations of the object, and lets the notebook UI decide which to display. The later only computes the PNG representation.\n",
617 243 "</div>"
618 244 ]
619 245 },
620 246 {
621 247 "cell_type": "markdown",
622 248 "metadata": {},
623 249 "source": [
624 250 "Create a new Gaussian with different parameters:"
625 251 ]
626 252 },
627 253 {
628 254 "cell_type": "code",
629 255 "execution_count": 7,
630 "metadata": {
631 "collapsed": false
632 },
256 "metadata": {},
633 257 "outputs": [
634 258 {
635 259 "data": {
636 "image/png": [
637 "iVBORw0KGgoAAAANSUhEUgAAAlYAAAGLCAYAAAAF7dxzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n",
638 "AAALEgAACxIB0t1+/AAAG4FJREFUeJzt3X+U5lddH/D3d3chu0LiJi64MQhTMLrGqlXEBAmuTEAK\n",
639 "2FbbeE8PJHaptU2PHEUieDiJP6qbkkD80UqhUquLgVBveqqhcsrRZN2EenRtI8gBE7M2XYGVCWV3\n",
640 "3QWyzpLNt388z8TJMDObmb3zzDwzr9c5c3a+3/v9Ps8nz+7OvnPv/d7b9X0fAADO3abVLgAAYL0Q\n",
641 "rAAAGhGsAAAaEawAABoRrAAAGhGsAAAaEawAABoRrAAAGhGsYJ3pum7r8Neu67rJ1a5nLei67sKu\n",
642 "616w2nUA659gBetE13Xf1nXdnyY53nXdtiRvTPIXI3rvr+667le6rvvhrut+teu6iVG87zx1PK/r\n",
643 "upu7rvt3Xdf9Xtd1z0+Svu+PJ3l513Vfsxp1PRkL1T6rfcHPeLltwAro+96XL19j8pXkfyd5+Tzn\n",
644 "Nyf57ST/Ism3JnlBkteNsK4DSa4cfn9Fkj9chc9mU5J3JOmGx9cmOZpkx/D4qUnet9q/h8up/Wyf\n",
645 "8XLbfPny1f5LjxWMia7rdiT5liRXz9P8kiTv6Pv+V/u+/5Mkb0jy6yOq62uTfHPf9/8zSfq+/6Mk\n",
646 "X9d13XNG8f6zXJrkO5J81fD4fUmeluR7h3WdTvJA13UvWuoLd113Xtd1P9l13ZGu6+7vuq6b1fbq\n",
647 "ruse6Lruv3dd930rUfsin/Gzl9k26t8b2DAEKxgflyV5d5J/0nXdU+e0vSTJ7ydJ13UXJXlK3/df\n",
648 "GFFd35Tkk3POfSqDoDBKn0/yrCQXJ0nf948Oz10465oPJHn1Ul+47/vpJG9NcluSSzIMPMO225O8\n",
649 "u+/7f9D3/W+tUO0LfcYvWmbbqH9vYMPYstoFAE/a85P8ZJJXJXllBkN/M87r+/6Lw+9fkuTDI6zr\n",
650 "mUlOzTn3SJKvHGEN6fv+SJIdM8dd1311kouS/OGsy/40yQuX+RYvTnJnBkOKb0wyO0Q9tszXTPKk\n",
651 "al/oM96Z5G+W0TbS3xvYSAQrGB8X9n1/pOu62zOYg/PbSdJ13dcn+bNZ131Dkj+fe3PXdT+Q5Ov6\n",
652 "vr9hePxDSXb2ff9zs67ZnuQXknRz75/jF/u+/+hMXUlOz2k/neT8hW7uuu4Hk/xIBj00O4b1nk7y\n",
653 "sr7vP3MOtcz2w0k+MDMMliR933+x67ptXddt7vv+zFled64XJLk5gx6f/9N13Yv7vv9Q13W7Mufz\n",
654 "XoHaF/uMty2zDVgBghWMgeESCjP/QP5Gkj/quu4r+75/OMl3J6mzLt+R5I/neZl/PLx3xvcnefvs\n",
655 "C/q+/+sk/3yJ5X1unnNfluTYfBd3XfdTSZ6RwST7LoNemdf1fX+wQS0z7/F3k7w8yVXzNM8MsX12\n",
656 "iS+7ue/7Psknu657X5I3JflQBj2E75194QrUvthnPF94ezJtwAowxwrGw1VJ7k2Svu8/nOSBJNcN\n",
657 "257V9/2nZ1371CSPzr6567rNSa5McvfweGsGT4j9foPaPp3k6XPOPS3Jw3MvHPauXZPkR/u+PzOc\n",
658 "S3Q4SbPJ1F3XnZ9Bz9Ir+76fL0CczhJ/9nVd95VJpmadeluSV3Rdd1kGPYknl1vvnPdZqPaFPuOp\n",
659 "4ddS277k9wZoQ48VjIfdfd+/adbxO5L8267r3pkvHeo5mmT7nHPPT/JQ3/cnhscvTvKxJF/ouu6i\n",
660 "mX/Eu667MMnPZ2lDWH+UwcTrDF9jSwZB6WPz3PeqJL/b9/1js659QZIfm3vhMmtJBsHkdX3ff3r4\n",
661 "9N4/7fv+fbPavzyDz2gprkryuzMHfd9/rOu6Dya5Mcl9I6h9sc/4C8tsA1aAYAVrVNd1F2QQRB5K\n",
662 "8ldzmn8tyU9kMIH65+e0fTKDyc6zvXT4OjNenUEP2OTwtY8ljy+kuaQhrL7vP9l13f/tuu7y4XDe\n",
663 "y5L8Sd/3Dwz/O74tyQV93+9P8v8yfPJt6IeT/Me+7z81z+suuZau696UwRyoXcO5T8/OoLdnzkv/\n",
664 "7fyqOfUt5LnDp/9me2sGa0T98krX/iQ+42W1Ae0JVrB2vTCDuTuHMli/6nHDSdg/muTWDIf3Zrk3\n",
665 "yY/POXdVkjNd1+1J8pQk+4fnvrbv+7sa1PoDSW7suu6KDHrHXjOr7dUZBLi/l8FyBW8ZTpx/epLP\n",
666 "9n1/W4P3nxlmvCmDxVJn9BlM5p+5ZiLJx+fcOru+ua/5rRkMuf6jrus29X3/s4+/cN/f23Xd/0hy\n",
667 "cO59K1F7Fv+Ml9sGNDazyi+wBg0XeHx41hDek73vrr7vXzr8fmuSIxk8AfjFxe9cGV3X/WDf9/95\n",
668 "Nd57Th0/kOSxvu/fM+f8mqgPGH+L9liVUrYnuT3JPbXWW0opV2QwafOxDIYVfqjW+mgp5W0ZTITd\n",
669 "lOQNtdZz/j84IOn7/sFl3lq7rntZ3/e/l8Gk9Y+sVqga+vJVfO/ZXpHBUhVzrZX6gDF3tidjbs5g\n",
670 "peIZJcn31lp3Z/B/wC8ppbw8yWO11hdnsGjhW1ekUmApfi3J93ZdtynJN+aJi4mOVNd1r0rSYrjx\n",
671 "XOv4+0neP3wScfb5NVEfsD4sGqxqrddl1tMjtdY31FpnnqZ5eobhKsl7hu0nkny8lGIfKlhFw/Cw\n",
672 "N8k/6/v+F/u+/5IJ1iOs5QMLLII5MsOn9P7OnKcDk6yN+oD1Y1nrWJVSXpvkkVrrn2Ww7cLsR5c/\n",
673 "OzwHrKK+7z/d9/1INmJe6/q+P973/TtXuw5g/VvyU4GllH+d5Nm11jcPTx3LYKXnmcfBd2SRNWLu\n",
674 "vvtus+UBgLFx1VVXnW1NusctKViVUt6Q5OmzQlUyeNT7NUk+Opzsflmt9ROtCmRjK6X8TK31Z1a7\n",
675 "DtY+f1ZYCn9eeLKW2iH0ZINVX0q5IMnPJTlYSnnJ8PzP11p/p5Ty0lLKhzIYWnz9UgoAAFgvzhqs\n",
676 "aq33JLlnePi0Ba75iZZFAQCMI5swAwA0IlgBADQiWLHWHVjtAhgbB1a7AMbKgdUugPVp5HsF3n33\n",
677 "3b2nAgGAcbDU3KLHCgCgEcEKAKARwQoAoBHBCgCgEcEKAKARwQoAoJElbcIMsFQHDx3ZN3VyemK+\n",
678 "tp0XnHf48ksv2TPaigBWjmAFrKipk9MTe/cf3j1f242TEyOuBmBlGQoEAGhEsAIAaESwAgBoRLAC\n",
679 "AGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBo\n",
680 "RLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESw\n",
681 "AgBoRLACAGhEsAIAaESwAgBoZMtqFwCwEg4eOrJv6uT0xHxtOy847/Dll16yZyXuBTY2wQpYl6ZO\n",
682 "Tk/s3X9493xtN05OrNi9wMZmKBAAoBHBCgCgEcEKAKARwQoAoBGT14GxtNiTe0myeVO3a4TlACQ5\n",
683 "S7AqpWxPcnuSe2qtt5RSLkvyriRnkjyQ5Lpaa19KeVuSKzLoAXtDrfXgCtcNbHCLPbmXJDdMTpwY\n",
684 "ZT0AydmHAm9O8oFZx7cmubrWujvJg0muKaW8PMljtdYXJ3llkreuSKUAAGvcoj1WtdbrSim7k1xR\n",
685 "StmW5JFa69Sw+bYktyR5OMl7htefKKV8vJTynFrrX65k4QCrYfu2LbvuvO+hAwu1W0AUNralzLG6\n",
686 "MMmxWcefTXJRki8mOTrPecEKWHeOn3p0602LDEFaQBQ2tqUEq+MZBKYZz8ggaB1LsiPJXw3P78gT\n",
687 "gxbAvPT+AOvNkw5WtdZTpZRtpZSLa62fTnJtkruSfCbJa5J8dDjZ/bJa6ydWplxgPdH7A6w3TzZY\n",
688 "9cNfr09yRynlTJL7a623Jkkp5aWllA9lMBn+9e3LBABY+84arGqt9yS5Z/j9A0munOean2hfGgDA\n",
689 "eLHyOgBAI4IVAEAjtrQBaGixJx095Qjrn2AF0NBiTzp6yhHWP0OBAACNCFYAAI0IVgAAjQhWAACN\n",
690 "CFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACN2NIG2HAW288vSTZv6naNsJzHHTx0ZN/UyemJ\n",
691 "+drsMwjjQbACNpzF9vNLkhsmJ06Msp4ZUyenJ/baZxDGmqFAAIBGBCsAgEYEKwCARgQrAIBGBCsA\n",
692 "gEYEKwCARiy3AKxZi603tVprTQEsRrAC1qzF1ptarbWmABZjKBAAoBHBCgCgEcEKAKARwQoAoBHB\n",
693 "CgCgEcEKAKARwQoAoBHrWAHn7OChI/umTk5PzNdmIU9gIxGsgHM2dXJ6Yq+FPAEMBQIAtCJYAQA0\n",
694 "IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJY\n",
695 "AQA0IlgBADSyZbULANaGg4eO7Js6OT0xX9vOC847fPmll+wZbUUA40ewApIkUyenJ/buP7x7vrYb\n",
696 "JydGXA3AeFpysCqlbE3y7iTPSLI5yU1JPpXkXUnOJHkgyXW11r5hnQAAa95y5lg9N8nxWutkktcm\n",
697 "eU2SW5NcXWvdneTBJNe0KxEAYDwsOVjVWv8sybZSyv1J7k1yc5JHaq1Tw0tuSzLZrkQAgPGw5GBV\n",
698 "SnlRki/UWr8+yXcn+fdJjs665GiSi9qUBwAwPpYzFPiiJHckj/deJclXzGrfkeTYOdYFADB2lhOs\n",
699 "HkjyXUlSSrk4gwnrW4ffJ8m1Se5qUh0AwBhZzhyr9ye5sJRyT5Lbk7wxyY8nuWN47mtqre9tWyYA\n",
700 "wNq3rHWsaq0/Ms/pK8+xFgCAsWZLGwCARgQrAIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCARpa1\n",
701 "jhWwsWzftmXXnfc9dGCh9s2bul0jLAdgzRKsgLM6furRrTftP7x7ofYbJidOjLIegLXKUCAAQCOC\n",
702 "FQBAI4IVAEAjghUAQCMmrwOMiKcrYf0TrABGxNOVsP4ZCgQAaESwAgBoRLACAGhEsAIAaESwAgBo\n",
703 "RLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaGTLahcAjMbBQ0f2TZ2cnlio\n",
704 "ffOmbtcIywFYlwQr2CCmTk5P7N1/ePdC7TdMTpwYZT0A65GhQACARgQrAIBGBCsAgEYEKwCARgQr\n",
705 "AIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCARgQrAIBGBCsAgEZswgxj5OChI/umTk5PLNS+84Lz\n",
706 "Dl9+6SV7RlcRALMJVjBGpk5OT+zdf3j3Qu03Tk6MsBoA5jIUCADQiGAFANCIYAUA0IhgBQDQiGAF\n",
707 "ANDIsp8KLKV8T5KvrbX+QinlsiTvSnImyQNJrqu19o1qBAAYC8vqsSqlPD3JC2utvzA8dWuSq2ut\n",
708 "u5M8mOSaRvUBAIyN5fZY7U1yaSnlvyb56SSP1Fqnhm23Jbll+CsAwIax5B6rUsqlSTbXWl+V5HVJ\n",
709 "3p7k6KxLjia5qE15AADjYzlDga9I8t+SZNhL9dkkXzGrfUeSY+deGgDAeFlOsDqaZDJJSinnJ9mZ\n",
710 "ZGsp5eJh+7VJ7mpTHgDA+FjOHKv/kuSdpZR7h8dvzqDX6o5Sypkk99dab21VIADAuFhysKq1nkny\n",
711 "L+dpuvLcywEAGF8WCAUAaESwAgBoRLACAGhEsAIAaESwAgBoZNmbMAOwdhw8dGTf1Mnpifnadl5w\n",
712 "3uHLL71kz2grgo1JsAJYB6ZOTk/s3X9493xtN05OjLga2LgMBQIANCJYAQA0IlgBADQiWAEANCJY\n",
713 "AQA0IlgBADQiWAEANCJYAQA0IlgBADRi5XVYR7Zv27LrzvseOjBf2+ZN3a4RlwOw4QhWsI4cP/Xo\n",
714 "1psW2NbkhsmJE6OuB2CjMRQIANCIYAUA0IhgBQDQiGAFANCIYAUA0IhgBQDQiGAFANCIdawAxsBi\n",
715 "i78mFoCFtUKwAhgDiy3+mlgAFtYKQ4EAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0I\n",
716 "VgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYA\n",
717 "AI0IVgAAjQhWAACNCFYAAI0IVgAAjWxZ7o2llOckuTfJ9yf5fJJ3JTmT5IEk19Va+yYVAgCMiWUF\n",
718 "q1LKpiRvTnJ7ki7JrUmurrVOlVKuT3JNktuaVQnryMFDR/ZNnZyeWKh95wXnHb780kv2jK4iAFpZ\n",
719 "bo/V9Ul+Jck/zGA48ZFa69Sw7bYkt0SwgnlNnZye2Lv/8O6F2m+cnBhhNQC0tOQ5VqWUb0/S1Vo/\n",
720 "POs1js265GiSixrUBgAwVpbTYzWZ5DtKKS9MsivJq5J8Ylb7jjwxaAGwirZv27LrzvseOrBQu+Fn\n",
721 "aGfJwarWevPM96WUn07ywSQ/VUq5uNb66STXJrmrXYkAnIvjpx7depPhZxiJZT8VOMf1Se4opZxJ\n",
722 "cn+t9dZGrwsAMDbOKVjVWv/NrMMrz7EWAICxZoFQAIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCA\n",
723 "RgQrAIBGBCsAgEYEKwCARgQrAIBGWu0VCDSyfduWXXfe99CB+do2b+p2jbgcAJZAsII15vipR7fe\n",
724 "tP/w7vnabpicODHqegB48gwFAgA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQi\n",
725 "WAEANCJYAQA0YksbgA1usf0pd15w3uHLL71kz2grgvElWAFscIvtT3nj5MSIq4HxZigQAKARPVYA\n",
726 "LNvBQ0f2TZ2cnpivzTAiG5FgBcCyTZ2cnthrGBEeJ1jBCljs/+I3b+p2jbgcAEZEsIIVsNj/xd8w\n",
727 "OXFi1PUAMBomrwMANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEA\n",
728 "NGJLGwAWtH3bll133vfQgYXa7X0JTyRYAbCg46ce3XrTAvteJva+hLkMBQIANCJYAQA0IlgBADQi\n",
729 "WAEANCJYAQA0IlgBADQiWAEANCJYAQA0suQFQkspm5L8hyTfkEEw+8kkDyd5V5IzSR5Icl2ttW9Y\n",
730 "JwDAmrecHqtvSvJgrfU7k7wqyZuT3Jrk6lrr7iQPJrmmXYkAAONhyT1WtdaPJPnI8PDLkvx1kq7W\n",
731 "OjU8d1uSW4a/AgBsGMueY1VKuSjJf0ryS0mOz2o6muSic6wLAGDsLCtYlVKemeQ3kvxYkg/niUFq\n",
732 "R5Jj514aAMB4WXKwKqV8VZJ9SV5Xaz1Uaz2VZFsp5eLhJdcmuatdiQAA42HJc6ySXJ/kOUl+vZSS\n",
733 "DHqnrk9yRynlTJL7a623tisRAGA8LGfy+vUZBKm5rjz3cmA8HDx0ZN/UyemJhdo3b+p2jbAcANaI\n",
734 "5fRYwYY3dXJ6Yu/+w7sXar9hcuLEKOsBYG2w8joAQCOCFQBAI4IVAEAjghUAQCMmr7Nhne3Jvp0X\n",
735 "nHf48ksv2TO6imBjWezvoL9/jCvBig3rbE/23Tg5McJqYONZ7O+gv3+MK0OBAACNCFYAAI0IVgAA\n",
736 "jQhWAACNmLwOC9i+bcuuO+976MB8bfYCBGA+ghUs4PipR7fetMATS/YCBGA+hgIBABrRYwXAilhs\n",
737 "OD0xpM76JFgBsCIWG05PDKmzPglWAIwV21GxlglWAIwV21Gxlpm8DgDQiGAFANCIYAUA0IhgBQDQ\n",
738 "iMnrjLWzPh10/lOfNfW505+ar80aOgC0Jlgx1s72dNANkxMnbtp/+HkLta1cZQBsRIYCAQAaEawA\n",
739 "ABoRrAAAGhGsAAAaEawAABoRrAAAGhGsAAAaEawAABoRrAAAGhGsAAAasaUNAGvO9m1bdt1530MH\n",
740 "5muzzydrmWAFwJpz/NSjW29aYB9Q+3yylhkKBABoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaMRy\n",
741 "C4zEwUNH9k2dnJ6Yr23nBecdvvzSS/aMtiJgI1rsZ1Gy+M+jc7mXjUOwYiSmTk5P7F1gTZobJydG\n",
742 "XA2wUS32syhZ/OfRudzLxmEoEACgET1WrHmLdb/b2gKYy3Y4rCbBijVvse53W1sAc9kOh9VkKBAA\n",
743 "oBE9Vqy6xbrt/+bUI9uf9rSn7RxxScAGdS7DiIvd64nBjUOwYtUt1m2f6LoHRudchhEXu9cTgxtH\n",
744 "02BVSnlbkisyGGJ8Q631YMvX59wcP378/Ic/d/r7Huv7br7287ZsOvq8S575O6OuCwDWi2bBqpTy\n",
745 "8iSP1VpfXEr58iTvT7JgLwSr4qs++ODRt//B4b8+f77GPc+/+CPPuyQLBquzLo53/lOfNfW505+a\n",
746 "r82TOMBGttgwYWJh0vWkZY/VS5K8J0lqrSdKKR8vpTyn1vqXDd+Dc/SZz58+c/j438zb9sgXHzu9\n",
747 "2L1nWxzvhsmJEzftP/y8hdqWVCjAOnK2KQ8WJl0/Wgari5IcnXX82eE5wWoN+a7nXnhq5/lP/fx8\n",
748 "bc++cOtTRl0PAKwnXd/3TV6olHJzkttrrR8dHr8jyc211k/Mvu7uu+9u84YAACNw1VVXzTs3eT4t\n",
749 "e6zuTvKaJB8tpWxPctncULXU4gAAxkmzBUJrrb+XJKWUDyX5QJI3tnptAIBx0GwoEABgo7OlDQBA\n",
750 "I4IVAEAjghUAQCMj3SuwlPKdSX4zyTfXWj8zPPf6JN+fQch7S631/aOsibWvlLIng4chPjM89fpa\n",
751 "65+uXkWsNbbTYilKKceSzPwM+WCt9ZbVrIe1Zbiywe1J7qm13lJKuSzJu5KcSfJAkutqrQtOUB9Z\n",
752 "sCqlfHWS1ybZn6QbntuV5Ipa64tKKVuS7C+l/G6tdf6lwdmo+iQ/W2v9zdUuhLXHdlosw8Fa6ytW\n",
753 "uwjWrJszWN3g6cPjW5NcXWudKqVcn+SaJLctdPPIhgJrrZ+stb42yekM/qFMku9K8t5h+6NJfifJ\n",
754 "5aOqibHy46WUPy6l3LrahbDmPGE7rSQfL6U8Z3VLYo37xlLKvaWUu0spz1rtYlhbaq3XJflYkpRS\n",
755 "tiV5pNY6NWy+LcnkYvc377EqpXxdkl+ac/rhWuueeS6/KMlHZx3PbIPDBrTQn50k/6rW+u7hNb9c\n",
756 "SnnZzLppENtpsXTPrbWeLqV8e5K3JLl2tQtizbowybFZx0dzlpzSPFjVWv88yZPtYj2WZMes42ck\n",
757 "+YvWNTEenuSfnd9K8i1JBCtmzPwc+avh8Y48MWjBE9RaTw9//eNSyo6zXc+GdjxPDFI78sSg9SVW\n",
758 "66nAmW1t9id5dZKUUp6S5JVJTDrlCUopbyqlPHN4+D1J7lvNelhzZrbTmpl0Ou92WpAkpZTLSylX\n",
759 "D7//1vxtIIcvUWs9lWRbKeXi4alrk9y12D2rFaz6JKm1PpjkD0spf5Dk3iRvq7VOr1JNrF3/K8n7\n",
760 "Syn3JDlWaz2wyvWwhthOiyW6P8m1pZQDSW5M8ubVLYc1bGY++PVJ7hj+G/Q1tdb3LnaTLW0AABqx\n",
761 "QCgAQCOCFQBAI4IVAEAjghUAQCOCFQBAI4IVAEAjghUAQCOCFQBAI4IVAEAj/x8Ld0kx4zM3zgAA\n",
762 "AABJRU5ErkJggg==\n"
763 ],
260 "image/png": "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\nLnYAAAAASUVORK5CYII=\n",
764 261 "text/latex": [
765 262 "$\\mathcal{N}(\\mu=0, \\sigma=2),\\ N=2000$"
766 263 ],
767 264 "text/plain": [
768 "<__main__.Gaussian at 0x106ab8c18>"
265 "<__main__.Gaussian at 0x116fe7668>"
769 266 ]
770 267 },
771 268 "execution_count": 7,
772 269 "metadata": {},
773 270 "output_type": "execute_result"
774 271 }
775 272 ],
776 273 "source": [
777 274 "x2 = Gaussian(0, 2, 2000)\n",
778 275 "x2"
779 276 ]
780 277 },
781 278 {
782 279 "cell_type": "markdown",
783 280 "metadata": {},
784 281 "source": [
785 282 "You can then compare the two Gaussians by displaying their histograms:"
786 283 ]
787 284 },
788 285 {
789 286 "cell_type": "code",
790 287 "execution_count": 8,
791 "metadata": {
792 "collapsed": false
793 },
288 "metadata": {},
794 289 "outputs": [
795 290 {
796 291 "data": {
797 "image/png": [
798 "iVBORw0KGgoAAAANSUhEUgAAAlEAAAGLCAYAAADnMccKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n",
799 "AAALEgAACxIB0t1+/AAAGsJJREFUeJzt3X2QndddH/DvsUQs5cXIRoCNA9mGGIR5Dy9KiBMnMmnq\n",
800 "BAbamjOdYIOBafEMGd4MocEGUrAbG1Sgw7sLwWAI5bhT6tC0abCN4rQlSjEhmVAbG1yRRHgTYgsp\n",
801 "xEKOlKd/3LvmeiOvdo/26t6VPp9/ds9znufe32rvaL/znHOeU4ZhCAAAa3PWrAsAANiIhCgAgA5C\n",
802 "FABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRsIGVUraMv5ZSyq5Z1zMPSinnllK+atZ1AKc/\n",
803 "IQo2oFLKV5ZS3pPkQClla5IfTPIXp+i9P7eUclMp5d+XUv6glPIVp+J9n6KWraWUXy6lvHjp2DAM\n",
804 "B5K8opTyvFnVtRrHq32i77NLKb9SSvmuUsqvllIWTrYPWH9CFMypUsofl1JecZzjm5Jcn+Tnkrwo\n",
805 "yRcleWwYhvefgprOSnJtktcNw/A9SX4zydtKKdun/d7HqeU7k7w+yRVJyrLun0zyE6e6ptU6Qe1J\n",
806 "cluS24Zh+IUkv5rkd9ahD1hnQhTMoXEo+fKM/sgu97IkvzgMw68Ow/AnSb4/ya+fotIuSvI1ST5r\n",
807 "3P6dJM9I8o2n6P2fMAzDrwzD8ENJPnqcvseT3F9KedFaX7eUcnYp5UdKKftLKfeVUspE36tLKfeX\n",
808 "Un6/lPJPp1F7KeXzknzpMAz/c3zuO5N8finlczr7ntNbJ7AyIQrm08VJfiPJPy+lPG1Z38uS/GGS\n",
809 "lFLOS/IpwzB87BTV9XdJnp3kgiQZhuHo+Ni5p+j91+ItSV691ouGYTiS0Z2s25JcmImAOAzDm5L8\n",
810 "xjAMXz8Mw++tV6HLfEmSDyw79sGM7jr29H3NFGoEIkTBvPqKJD+S5ONJXrms7+xhGD4+/v5lSd59\n",
811 "qooahmH/MAzbh2H442Q0ByfJeUn+6FTVsAbvSfLCzmtfnOSOjIbEfnBZ3ydOpqhV+Iwkh5cdeyzJ\n",
812 "+Uk+vaPvM6dQI5Bk86wLAI7r3GEY9pdS3pTkqiT/JUlKKV+Q5P9OnPeFSf58+cWllG9J8vnDMFw3\n",
813 "bv/LJOcPw/ATE+dsS/LTOf6cnEk/MwzDe5+i77uSvGVpCOl4SinfkeS7M7p7tX1c7+NJXj4Mw4fX\n",
814 "sZYnGYbh4+PJ25uGYTi2mmsmfFWSmzK6k/OXpZQXD8PwjlLKjiz7955C7edm9O8z6fEkz0qytbMP\n",
815 "mAIhCubM+LEFS38MfzPJO0spnzkMw4eS/OMkbeL07UnedZyX+Wfja5d8U5KfnzxhGIa/TfLtJ1Hn\n",
816 "FyV5RZLLVjjnRzO6Q/L8jELGHyV5zTAMe9ezlhUsDTV+ZI3XbRqGYUjygVLK7yR5bZJ3ZHTn77cn\n",
817 "T5xC7Z80TyrJ05M8muMHtdX0AVNgOA/mz2VJ7kmSYRjeneT+JNeM+549DMPDE+c+LcnRyYvHq/cu\n",
818 "SXLXuL0lyQsynke1Hkopz8roTs0rh2E47h/p8V2zK5N8zzAMx8bzp/YlOZUTnR/PGv+fK6V8ZpLF\n",
819 "iUM/leTyUsrFGd0hPLSO9R3Pw0meuezYM8Y1LXb0fWgKNQJxJwrm0aXDMLx2ov2LSf5tKeWX8snD\n",
820 "NY8k2bbs2FckeWgYhoPj9ouTvC/Jx0op5y2FnlLKuUn+XfqGoW7K6I7Sw+PVa/9iGIbly+lfleRt\n",
821 "wzB8Yvx+mzMaJvu+5W9wkrWs5FMz+jdai8uSvG2pMQzD+0opb83osRL3Lj95CrW/M6PJ+0uvvzmj\n",
822 "4Pm+JB/r7AOmQIiCOVBKOSej0PFQkr9e1v3GJD+U5Pcy+mM96QMZTUSe9LXj11ny6ozubO0av/aj\n",
823 "yRMPpVzzMFQp5bUZzRXaMZ4j9DkZ3T1JKeUrk5wzDMPdSf4m41V8Y9+V5JeHYfjg8tfsrWWyrKc4\n",
824 "PkzOh1pW31N57ngV3qSfTLIno2dzLX+Dda19GIYPlFL+Xyll53jY8+VJ/mQYhvvHP0NXH7D+hCiY\n",
825 "Dy/MaK7Ngxk9H+oJ4wnS35Nkd8ZDdBPuSfIDy45dluRYKeXqJJ+S5O7xsc8bhuHOkylyPER3Y5JN\n",
826 "kyVmNME9Sb45o3lDX5bRIwLeMJ7U/swkHxmG4baTef9ltXxrksuTfHaSnymlvCPJDyytXBw/rfvP\n",
827 "ll326ozC5Jcd5/Wen9Gw6TeUUs4ahuHHn/gBh+GeUsp/T7J3+XXTqD3JtyS5vpTygozuLH7zxOW9\n",
828 "fcA6K6O5k8CsjR+W+KGJYbjVXnfnMAxfO/5+S5L9Ga3E+/jKV05HKeU7hmH4tVm897I6viXJJ4Zh\n",
829 "+K1lx+eiPmDjW9WdqFrr1yX5vNbaT9daL05yS5JjGU94ba1JYnCShmF4oPPSVkp5+TAMf5DRhPI/\n",
830 "nVWAGvvUGb73pMszejzEcvNSH7DBnXDVSq31mUle2Fr76fGh3UmuaK1dmuSBjFbfALPzxiTfON7X\n",
831 "7oszfqbULJRSXpXkpIYM16mOf5LkzeMVgZPH56I+4PSwmjtRNyS5qNb6n5L8WJLHWmtLy39vS3Lz\n",
832 "+CswA8MwHC2l3JDkW4dh+JkZ1/KWWb5/8sRquX80DMMvLe+bh/qA08eKd6JqrRcl2dRae1WS12T0\n",
833 "sL7J5cKPZLTlAzBDwzA8PAzDqdqEeK4Nw3DgeAEKYL2d6E7U5Un+c5K01hZrrR9J8mkT/duzwtNw\n",
834 "77rrLnOlAIAN47LLLjvRM9+ecKIQ9UhGy4H/sNb6rIw2uTxYa72gtfZwRpM2V5xfsJZiOLPVWl/f\n",
835 "Wnv9rOtg/vmssBY+L6zWWm/+nChE/cckv1RrvWfcfl1Ge1DdXms9luS+1trutZcJALCxrRiiWmvH\n",
836 "kvyr43RdMp1yAAA2BhsQAwB0EKIAADoIUcyTPbMugA1jz6wLYEPZM+sCOD1Nde+8u+66a7A6DwDY\n",
837 "CNaaW9yJAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAA\n",
838 "OghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA6bZ10AwOli\n",
839 "74P7b108dGRhqX3+OWfv23nRhVfPriJgmoQogHWyeOjIwg1377t0qX39roUZVgNMm+E8AIAOQhQA\n",
840 "QAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOnlgOMGO2i4GNSYgCmDHbxcDGZDgP\n",
841 "AKCDEAUA0EGIAgDoIEQBAHQwsRxgzmzbunnHHfc+tCexUg/mmRAFMGcOHD665cbxaj0r9WB+Gc4D\n",
842 "AOggRAEAdBCiAAA6CFEAAB1MLAeYgcn98jadVXbMuBygwwlDVK310STvGTffmuT3k9yS5FiS+5Nc\n",
843 "01obplYhwGlocr+863YtHJx1PcDareZO1N7W2uVLjVrrf0tyRWttsdZ6bZIrk9w2rQIBAObRakLU\n",
844 "F9da70ny8STfnuSx1triuO+2JDdHiAIAzjCrmVj+3NbaS5K8LsmtSR6Z6HskyXlTqAsAYK6dMES1\n",
845 "1h4ff31XkseTfNpE9/Ykj06nNACA+bViiKq17qy1XjH+/vlJ9ifZUmu9YHzKVUnunG6JAADz50Rz\n",
846 "ou5L8sO11tdkdMfpmoyG726vtR5Lcl9rbfeUawQAmDsrhqjW2qEk37Ds8IeTXDK1igAANgBPLAcA\n",
847 "6CBEAQB0sO0LwJRs27p5xx33PrQnSc4/5+x9Oy+68OrZVgSsJyEKYEoOHD665cbx1i7X71qYcTXA\n",
848 "ejOcBwDQQYgCAOggRAEAdBCiAAA6mFgOcApMrtRLkk1nlR0zLAdYB0IUwCkwuVIvSa7btXBwlvUA\n",
849 "J89wHgBAByEKAKCDEAUA0EGIAgDoYGI5wBxbvqrPHnwwP4QogDm2fFWfPfhgfhjOAwDoIEQBAHQQ\n",
850 "ogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDo4InlABvU3gf337p46MjCUtuWMHBqCVEA\n",
851 "G9TioSMLN9gSBmbGcB4AQAchCgCggxAFANBBiAIA6GBiOcAGsm3r5h133PvQniTZdFbZMeNy4Iwm\n",
852 "RAFsIAcOH91y43hF3nW7Fg7Ouh44kxnOAwDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCD\n",
853 "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHk1J9Van5Pk\n",
854 "niTflOTvktyS5FiS+5Nc01obplYhAMAcOuGdqFrrWUlel+RNSUqS3UmuaK1dmuSBJFdOtUIAgDm0\n",
855 "muG8a5P8SpK/H5//WGttcdx3W5JdU6oNAGBurRiiaq1fnaS01t49cf6jE6c8kuS8KdUGADC3TjQn\n",
856 "aleSr6m1vjDJjiSvSvL+if7teXKoAgA4I6wYolprNy19X2v9sSRvTfKjtdYLWmsPJ7kqyZ3TLREA\n",
857 "YP6sanXeMtcmub3WeizJfa213etcEwDA3Ft1iGqt/ZuJ5iVTqAUAYMPwsE0AgA5CFABAByEKAKCD\n",
858 "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHnWBQAwHXsf\n",
859 "3H/r4qEjC0ly/jln79t50YVXz7YiOL0IUQCnqcVDRxZuuHvfpUly/a6FGVcDpx/DeQAAHYQoAIAO\n",
860 "QhQAQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOtn0BOE1s27p5xx33PrRnqb3p\n",
861 "rLJjhuXAaU+IAjhNHDh8dMuN473ykuS6XQsHZ1kPnO4M5wEAdBCiAAA6CFEAAB3MiQI4CXsf3H/r\n",
862 "4qEjC8l8T+RePun8/HPO3rfzoguvnl1FsPEJUQAnYfHQkYUbxpO553ki9/JJ59fvWphhNXB6MJwH\n",
863 "ANBBiAIA6CBEAQB0EKIAADqYWA6wBpOr8ZL5XpHXa/JntIoPnpoQBbAGk6vxkvlekddr8me0ig+e\n",
864 "muE8AIAOQhQAQAchCgCggxAFANDBxHKAFZwJq/GAPkIUwArOhNV4QB/DeQAAHYQoAIAOQhQAQAch\n",
865 "CgCggxAFANBhxdV5tdbNSX4tyfOSPJbku5OUJLckOZbk/iTXtNaGKdcJADBXTnQn6hlJ3thae1GS\n",
866 "b0/yw0l2J7mitXZpkgeSXDndEgEA5s+Kd6JaaweTvH3cXEjy4SRbWmuL42O3Jbl5/BUA4Iyxqodt\n",
867 "1lr/R0ZDei9O8vqJrkeSnLf+ZQEAzLdVTSxvrb0iyeVJfj5PDk3bkzw6hboAAObaiiGq1vrCWutL\n",
868 "xs2PJHl6ki211gvGx65KcucU6wMAmEsnGs77yyRvrLW+PqNVef86ycEkt9dajyW5r7W2e7olAgDM\n",
869 "nxNNLP9wkq87Ttcl0ykHAGBj8LBNAIAOQhQAQIdVPeIAgNPX3gf337p46MjCUnvTWWXHDMuBDUOI\n",
870 "AjjDLR46snDD3fsuXWpft2vh4CzrgY3CcB4AQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAA\n",
871 "HYQoAIAOQhQAQAchCgCgg21fgDPS5H5x559z9r6dF1149WwrAjYaIQo4I03uF3f9roUZVwNsRIbz\n",
872 "AAA6CFEAAB2EKACADkIUAEAHIQoAoIMQBQDQQYgCAOggRAEAdBCiAAA6eGI5cMbbtnXzjjvufWjP\n",
873 "Uts2MMBqCFHAGe/A4aNbbhxvAZPYBgZYHcN5AAAdhCgAgA5CFABAByEKAKCDieUAy0yu1tt0Vtkx\n",
874 "43KAOSVEASwzuVrvul0LB2ddDzCfDOcBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGI\n",
875 "AgDoIEQBAHTwxHKAM5CtbeDkCVEAZyBb28DJM5wHANBBiAIA6CBEAQB0EKIAADqYWA5Al70P7r91\n",
876 "8dCRhaX2+eecvW/nRRdePbuK4NQSogDosnjoyMIN4xV+SXL9roUZVgOn3oohqtZ6VpJfSPKFGQ39\n",
877 "/UiSDyW5JcmxJPcnuaa1Nky5TgCAuXKiOVFfkuSB1tpLkrwqyeuS7E5yRWvt0iQPJLlyuiUCAMyf\n",
878 "Fe9Etdb+NMmfjptPT/K3SUprbXF87LYkN4+/AgCcMVa1Oq/Wel6S/5DkZ5McmOh6JMl5U6gLAGCu\n",
879 "nXBiea31M5K8Mcn3Jflgku+f6N6e5NHplAbAvJlckWfPPc50K96JqrV+VpJbk7ymtfZga+1wkq21\n",
880 "1gvGp1yV5M7plgjAvFhakXfD3fsuPfqJYcus64FZOtGdqGuTPCfJr9dak9Fdp2uT3F5rPZbkvtba\n",
881 "7umWCAAwf040sfzajELTcpdMpxwAgI3Bti8AAB2EKACADrZ9AeApbdu6eccd9z60Z6ltRR78AyEK\n",
882 "gKd04PDRLTdO7I933a6Fg7OsB+aJ4TwAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghR\n",
883 "AAAdhCgAgA6eWA6ctvY+uP/WxUNHFpLk/HPO3rfzoguvnm1FwOlEiAJOW4uHjizcMN6y5PpdCzOu\n",
884 "BjjdGM4DAOggRAEAdBCiAAA6CFEAAB1MLAdgXWzbunnHHfc+tGepbUUkpzshCoB1ceDw0S03jldD\n",
885 "JlZEcvoznAcA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQB\n",
886 "AHQQogAAOghRAAAdhCgAgA5CFABAh82zLgBgvex9cP+ti4eOLCy1N51VdsywHOA0J0QBp43FQ0cW\n",
887 "brh736VL7et2LRycZT3A6c1wHgBAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5C\n",
888 "FABAByEKAKCDbV+AM8K2rZt33HHvQ3uW2vbVA07WCUNUrXVbkjcleXtr7eZa68VJbklyLMn9Sa5p\n",
889 "rQ3TLRPg5Bw4fHTLjfbVA9bRaobzbkrylon27iRXtNYuTfJAkiunURgAwDw7YYhqrV2T5H1JUmvd\n",
890 "muSx1triuPu2JLumVx4AwHxa68Tyc5M8OtF+JMl561cOAMDGsNaJ5Qfy5NC0PU8OVQBTtffB/bcu\n",
891 "HjqysNQ+/5yz9+286MKrZ1cRT2VyMr/fE6ejNYWo1trhWuvWWusFrbWHk1yV5M7plAbwyRYPHVm4\n",
892 "YWKC+PW7FmZYDSuZnMzv98TpaC0hamkF3rVJbq+1HktyX2tt9/qXBQAw31YVolprb0/y9vH39ye5\n",
893 "ZJpFAQDMO08sBwDoIEQBAHSw7QuwoU2uALOVC3AqCVHAhja5AsxWLsCpZDgPAKCDEAUA0EGIAgDo\n",
894 "IEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgA\n",
895 "gA6bZ10AwEr2Prj/1sVDRxaW2pvOKjtmWA7AE4QoYK4tHjqycMPd+y5dal+3a+HgLOsBWGI4DwCg\n",
896 "gxAFANBBiAIA6CBEAQB0MLEcmLnlK/DOP+fsfTsvuvDq2VXEetu2dfOOO+59aM9Se6Xf8eTnwWeB\n",
897 "eSZEATO3fAXe9bsWZlgN03Dg8NEtN67ydzz5efBZYJ4ZzgMA6CBEAQB0EKIAADoIUQAAHUwsB+CU\n",
898 "m1ytt9IKvLWs6oNTTYgC4JSbXK230gq8tazqg1PNcB4AQAchCgCggxAFANBBiAIA6GBiOQAbxmpX\n",
899 "9S1nf0amQYgCYMNY7aq+5ezPyDQYzgMA6CBEAQB0EKIAADqYEwWcEmuZ2Ds5eXjTWWXHKSkQYI2E\n",
900 "KOCUWMvE3snJw9ftWjg4/eoA1s5wHgBAByEKAKCDEAUA0MGcKGDVDhw4sDXJxROHPn7uuee+d1b1\n",
901 "AMySEMXcqLW+tLW2Z9Z1sKKFO/7sb+58919/9Owk+fov2P7+Z33ksXcurbo7/1lPe/biRx//4NLJ\n",
902 "ttZgNSZXYyarX5G5/LrJz9vkatC/P/zYtmc84xnnr2fNkAhRzJeXJtkz4xo4gfv/5mPlf//Vwa1J\n",
903 "svNzzjnyscePPbHq7rpdCwdvvHvf5y6da2sNVmNyNWay+hWZy6+b/LwtXw1qlSfT0B2iaq0/leQF\n",
904 "Gc2r+v7W2t51qwoAYM51TSyvtb4iySdaay9O8sokP7muVQEAzLne1XkvS/JbSdJaO5jkz2qtz1m3\n",
905 "qgAA5lzvcN55SR6ZaH9kfOyvTroiYK699LnnPvZZ55z90SR53qc9/WkPHzoy65IAZqIMw7Dmi2qt\n",
906 "NyV5U2vtveP2Lya5qbX2/snz7rrrrrW/OADAjFx22WVltef23om6K8k3J3lvrXVbkouXB6i1FgIA\n",
907 "sJF0zYlqrf1BktRa35HkLUl+cD2LAgCYd13DeQAAZzp75wEAdBCiAAA6CFEAAB2mtnderfUlSX43\n",
908 "yZe21j48Pva9Sb4po/D2htbam6f1/mxMtdarM1qo8OHxoe9trb1ndhUxb2w5xVrUWh9NsvR/yFtb\n",
909 "azfPsh7my/gJA29K8vbW2s211ouT3JLkWJL7k1zTWnvKyeNTCVG11s9O8m1J7k5Sxsd2JHlBa+1F\n",
910 "tdbNSe6utb6ttfb306iBDWtI8uOttd+ddSHMn8ktp2qtn5rkzUkuPcFlnNn2ttYun3URzK2bMnrK\n",
911 "wDPH7d1JrmitLdZar01yZZLbnuriqQzntdY+0Fr7tiSPZ/RHMUlemuS3x/1Hk/zXJDun8f5seD9Q\n",
912 "a31XrXX3rAth7thyirX64lrrPbXWu2qtz551McyX1to1Sd6XJLXWrUkea60tjrtvS7JrpetP6k5U\n",
913 "rfXzk/zsssMfaq1dfZzTz0vy3on20lYxnIGe6rOT5Dtba78xPufnaq0vX3ouGcSWU6zdc1trj9da\n",
914 "vzrJG5JcNeuCmFvnJnl0ov1ITpBTTipEtdb+PMlqb5M+mmT7RPvTk/zFybw/G9cqPzu/l+TLkwhR\n",
915 "LFn6f+Svx+3teXKogidprT0+/vquWuv2E53PGe1AnhyatufJoeqTnIrVeUtbv9yd5NVJUmv9lCSv\n",
916 "TGJCKE9Sa31trfUzxs2vS3LvLOth7ixtObU0IfS4W05BktRad9Zarxh///z8Q/iGT9JaO5xka631\n",
917 "gvGhq5LcudI1pyJEDUnSWnsgyR/VWv9XknuS/FRrzfbvLPd/kry51vr2JI+21vbMuB7miC2nWKP7\n",
918 "klxVa92T5Pokr5ttOcyxpfnb1ya5ffw36Hmttd9e6SLbvgAAdPCwTQCADkIUAEAHIQoAoIMQBQDQ\n",
919 "QYgCAOggRAEAdBCiAAA6CFEAAB2EKACADv8fn0xUCxJB1sMAAAAASUVORK5CYII=\n"
920 ]
292 "image/png": "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\n1ADDXpIa8P8BEb7Ae9JKdQAAAAAASUVORK5CYII=\n"
921 293 },
922 294 "metadata": {},
923 295 "output_type": "display_data"
924 296 },
925 297 {
926 298 "data": {
927 "image/png": [
928 "iVBORw0KGgoAAAANSUhEUgAAAlYAAAGLCAYAAAAF7dxzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n",
929 "AAALEgAACxIB0t1+/AAAG4FJREFUeJzt3X+U5lddH/D3d3chu0LiJi64MQhTMLrGqlXEBAmuTEAK\n",
930 "2FbbeE8PJHaptU2PHEUieDiJP6qbkkD80UqhUquLgVBveqqhcsrRZN2EenRtI8gBE7M2XYGVCWV3\n",
931 "3QWyzpLNt388z8TJMDObmb3zzDwzr9c5c3a+3/v9Ps8nz+7OvnPv/d7b9X0fAADO3abVLgAAYL0Q\n",
932 "rAAAGhGsAAAaEawAABoRrAAAGhGsAAAaEawAABoRrAAAGhGsYJ3pum7r8Neu67rJ1a5nLei67sKu\n",
933 "616w2nUA659gBetE13Xf1nXdnyY53nXdtiRvTPIXI3rvr+667le6rvvhrut+teu6iVG87zx1PK/r\n",
934 "upu7rvt3Xdf9Xtd1z0+Svu+PJ3l513Vfsxp1PRkL1T6rfcHPeLltwAro+96XL19j8pXkfyd5+Tzn\n",
935 "Nyf57ST/Ism3JnlBkteNsK4DSa4cfn9Fkj9chc9mU5J3JOmGx9cmOZpkx/D4qUnet9q/h8up/Wyf\n",
936 "8XLbfPny1f5LjxWMia7rdiT5liRXz9P8kiTv6Pv+V/u+/5Mkb0jy6yOq62uTfHPf9/8zSfq+/6Mk\n",
937 "X9d13XNG8f6zXJrkO5J81fD4fUmeluR7h3WdTvJA13UvWuoLd113Xtd1P9l13ZGu6+7vuq6b1fbq\n",
938 "ruse6Lruv3dd930rUfsin/Gzl9k26t8b2DAEKxgflyV5d5J/0nXdU+e0vSTJ7ydJ13UXJXlK3/df\n",
939 "GFFd35Tkk3POfSqDoDBKn0/yrCQXJ0nf948Oz10465oPJHn1Ul+47/vpJG9NcluSSzIMPMO225O8\n",
940 "u+/7f9D3/W+tUO0LfcYvWmbbqH9vYMPYstoFAE/a85P8ZJJXJXllBkN/M87r+/6Lw+9fkuTDI6zr\n",
941 "mUlOzTn3SJKvHGEN6fv+SJIdM8dd1311kouS/OGsy/40yQuX+RYvTnJnBkOKb0wyO0Q9tszXTPKk\n",
942 "al/oM96Z5G+W0TbS3xvYSAQrGB8X9n1/pOu62zOYg/PbSdJ13dcn+bNZ131Dkj+fe3PXdT+Q5Ov6\n",
943 "vr9hePxDSXb2ff9zs67ZnuQXknRz75/jF/u+/+hMXUlOz2k/neT8hW7uuu4Hk/xIBj00O4b1nk7y\n",
944 "sr7vP3MOtcz2w0k+MDMMliR933+x67ptXddt7vv+zFled64XJLk5gx6f/9N13Yv7vv9Q13W7Mufz\n",
945 "XoHaF/uMty2zDVgBghWMgeESCjP/QP5Gkj/quu4r+75/OMl3J6mzLt+R5I/neZl/PLx3xvcnefvs\n",
946 "C/q+/+sk/3yJ5X1unnNfluTYfBd3XfdTSZ6RwST7LoNemdf1fX+wQS0z7/F3k7w8yVXzNM8MsX12\n",
947 "iS+7ue/7Psknu657X5I3JflQBj2E75194QrUvthnPF94ezJtwAowxwrGw1VJ7k2Svu8/nOSBJNcN\n",
948 "257V9/2nZ1371CSPzr6567rNSa5McvfweGsGT4j9foPaPp3k6XPOPS3Jw3MvHPauXZPkR/u+PzOc\n",
949 "S3Q4SbPJ1F3XnZ9Bz9Ir+76fL0CczhJ/9nVd95VJpmadeluSV3Rdd1kGPYknl1vvnPdZqPaFPuOp\n",
950 "4ddS277k9wZoQ48VjIfdfd+/adbxO5L8267r3pkvHeo5mmT7nHPPT/JQ3/cnhscvTvKxJF/ouu6i\n",
951 "mX/Eu667MMnPZ2lDWH+UwcTrDF9jSwZB6WPz3PeqJL/b9/1js659QZIfm3vhMmtJBsHkdX3ff3r4\n",
952 "9N4/7fv+fbPavzyDz2gprkryuzMHfd9/rOu6Dya5Mcl9I6h9sc/4C8tsA1aAYAVrVNd1F2QQRB5K\n",
953 "8ldzmn8tyU9kMIH65+e0fTKDyc6zvXT4OjNenUEP2OTwtY8ljy+kuaQhrL7vP9l13f/tuu7y4XDe\n",
954 "y5L8Sd/3Dwz/O74tyQV93+9P8v8yfPJt6IeT/Me+7z81z+suuZau696UwRyoXcO5T8/OoLdnzkv/\n",
955 "7fyqOfUt5LnDp/9me2sGa0T98krX/iQ+42W1Ae0JVrB2vTCDuTuHMli/6nHDSdg/muTWDIf3Zrk3\n",
956 "yY/POXdVkjNd1+1J8pQk+4fnvrbv+7sa1PoDSW7suu6KDHrHXjOr7dUZBLi/l8FyBW8ZTpx/epLP\n",
957 "9n1/W4P3nxlmvCmDxVJn9BlM5p+5ZiLJx+fcOru+ua/5rRkMuf6jrus29X3/s4+/cN/f23Xd/0hy\n",
958 "cO59K1F7Fv+Ml9sGNDazyi+wBg0XeHx41hDek73vrr7vXzr8fmuSIxk8AfjFxe9cGV3X/WDf9/95\n",
959 "Nd57Th0/kOSxvu/fM+f8mqgPGH+L9liVUrYnuT3JPbXWW0opV2QwafOxDIYVfqjW+mgp5W0ZTITd\n",
960 "lOQNtdZz/j84IOn7/sFl3lq7rntZ3/e/l8Gk9Y+sVqga+vJVfO/ZXpHBUhVzrZX6gDF3tidjbs5g\n",
961 "peIZJcn31lp3Z/B/wC8ppbw8yWO11hdnsGjhW1ekUmApfi3J93ZdtynJN+aJi4mOVNd1r0rSYrjx\n",
962 "XOv4+0neP3wScfb5NVEfsD4sGqxqrddl1tMjtdY31FpnnqZ5eobhKsl7hu0nkny8lGIfKlhFw/Cw\n",
963 "N8k/6/v+F/u+/5IJ1iOs5QMLLII5MsOn9P7OnKcDk6yN+oD1Y1nrWJVSXpvkkVrrn2Ww7cLsR5c/\n",
964 "OzwHrKK+7z/d9/1INmJe6/q+P973/TtXuw5g/VvyU4GllH+d5Nm11jcPTx3LYKXnmcfBd2SRNWLu\n",
965 "vvtus+UBgLFx1VVXnW1NusctKViVUt6Q5OmzQlUyeNT7NUk+Opzsflmt9ROtCmRjK6X8TK31Z1a7\n",
966 "DtY+f1ZYCn9eeLKW2iH0ZINVX0q5IMnPJTlYSnnJ8PzP11p/p5Ty0lLKhzIYWnz9UgoAAFgvzhqs\n",
967 "aq33JLlnePi0Ba75iZZFAQCMI5swAwA0IlgBADQiWLHWHVjtAhgbB1a7AMbKgdUugPVp5HsF3n33\n",
968 "3b2nAgGAcbDU3KLHCgCgEcEKAKARwQoAoBHBCgCgEcEKAKARwQoAoJElbcIMsFQHDx3ZN3VyemK+\n",
969 "tp0XnHf48ksv2TPaigBWjmAFrKipk9MTe/cf3j1f242TEyOuBmBlGQoEAGhEsAIAaESwAgBoRLAC\n",
970 "AGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBo\n",
971 "RLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESw\n",
972 "AgBoRLACAGhEsAIAaESwAgBoZMtqFwCwEg4eOrJv6uT0xHxtOy847/Dll16yZyXuBTY2wQpYl6ZO\n",
973 "Tk/s3X9493xtN05OrNi9wMZmKBAAoBHBCgCgEcEKAKARwQoAoBGT14GxtNiTe0myeVO3a4TlACQ5\n",
974 "S7AqpWxPcnuSe2qtt5RSLkvyriRnkjyQ5Lpaa19KeVuSKzLoAXtDrfXgCtcNbHCLPbmXJDdMTpwY\n",
975 "ZT0AydmHAm9O8oFZx7cmubrWujvJg0muKaW8PMljtdYXJ3llkreuSKUAAGvcoj1WtdbrSim7k1xR\n",
976 "StmW5JFa69Sw+bYktyR5OMl7htefKKV8vJTynFrrX65k4QCrYfu2LbvuvO+hAwu1W0AUNralzLG6\n",
977 "MMmxWcefTXJRki8mOTrPecEKWHeOn3p0602LDEFaQBQ2tqUEq+MZBKYZz8ggaB1LsiPJXw3P78gT\n",
978 "gxbAvPT+AOvNkw5WtdZTpZRtpZSLa62fTnJtkruSfCbJa5J8dDjZ/bJa6ydWplxgPdH7A6w3TzZY\n",
979 "9cNfr09yRynlTJL7a623Jkkp5aWllA9lMBn+9e3LBABY+84arGqt9yS5Z/j9A0munOean2hfGgDA\n",
980 "eLHyOgBAI4IVAEAjtrQBaGixJx095Qjrn2AF0NBiTzp6yhHWP0OBAACNCFYAAI0IVgAAjQhWAACN\n",
981 "CFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACN2NIG2HAW288vSTZv6naNsJzHHTx0ZN/UyemJ\n",
982 "+drsMwjjQbACNpzF9vNLkhsmJ06Msp4ZUyenJ/baZxDGmqFAAIBGBCsAgEYEKwCARgQrAIBGBCsA\n",
983 "gEYEKwCARiy3AKxZi603tVprTQEsRrAC1qzF1ptarbWmABZjKBAAoBHBCgCgEcEKAKARwQoAoBHB\n",
984 "CgCgEcEKAKARwQoAoBHrWAHn7OChI/umTk5PzNdmIU9gIxGsgHM2dXJ6Yq+FPAEMBQIAtCJYAQA0\n",
985 "IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJY\n",
986 "AQA0IlgBADSyZbULANaGg4eO7Js6OT0xX9vOC847fPmll+wZbUUA40ewApIkUyenJ/buP7x7vrYb\n",
987 "JydGXA3AeFpysCqlbE3y7iTPSLI5yU1JPpXkXUnOJHkgyXW11r5hnQAAa95y5lg9N8nxWutkktcm\n",
988 "eU2SW5NcXWvdneTBJNe0KxEAYDwsOVjVWv8sybZSyv1J7k1yc5JHaq1Tw0tuSzLZrkQAgPGw5GBV\n",
989 "SnlRki/UWr8+yXcn+fdJjs665GiSi9qUBwAwPpYzFPiiJHckj/deJclXzGrfkeTYOdYFADB2lhOs\n",
990 "HkjyXUlSSrk4gwnrW4ffJ8m1Se5qUh0AwBhZzhyr9ye5sJRyT5Lbk7wxyY8nuWN47mtqre9tWyYA\n",
991 "wNq3rHWsaq0/Ms/pK8+xFgCAsWZLGwCARgQrAIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCARpa1\n",
992 "jhWwsWzftmXXnfc9dGCh9s2bul0jLAdgzRKsgLM6furRrTftP7x7ofYbJidOjLIegLXKUCAAQCOC\n",
993 "FQBAI4IVAEAjghUAQCMmrwOMiKcrYf0TrABGxNOVsP4ZCgQAaESwAgBoRLACAGhEsAIAaESwAgBo\n",
994 "RLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaGTLahcAjMbBQ0f2TZ2cnlio\n",
995 "ffOmbtcIywFYlwQr2CCmTk5P7N1/ePdC7TdMTpwYZT0A65GhQACARgQrAIBGBCsAgEYEKwCARgQr\n",
996 "AIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCARgQrAIBGBCsAgEZswgxj5OChI/umTk5PLNS+84Lz\n",
997 "Dl9+6SV7RlcRALMJVjBGpk5OT+zdf3j3Qu03Tk6MsBoA5jIUCADQiGAFANCIYAUA0IhgBQDQiGAF\n",
998 "ANDIsp8KLKV8T5KvrbX+QinlsiTvSnImyQNJrqu19o1qBAAYC8vqsSqlPD3JC2utvzA8dWuSq2ut\n",
999 "u5M8mOSaRvUBAIyN5fZY7U1yaSnlvyb56SSP1Fqnhm23Jbll+CsAwIax5B6rUsqlSTbXWl+V5HVJ\n",
1000 "3p7k6KxLjia5qE15AADjYzlDga9I8t+SZNhL9dkkXzGrfUeSY+deGgDAeFlOsDqaZDJJSinnJ9mZ\n",
1001 "ZGsp5eJh+7VJ7mpTHgDA+FjOHKv/kuSdpZR7h8dvzqDX6o5Sypkk99dab21VIADAuFhysKq1nkny\n",
1002 "L+dpuvLcywEAGF8WCAUAaESwAgBoRLACAGhEsAIAaESwAgBoZNmbMAOwdhw8dGTf1Mnpifnadl5w\n",
1003 "3uHLL71kz2grgo1JsAJYB6ZOTk/s3X9493xtN05OjLga2LgMBQIANCJYAQA0IlgBADQiWAEANCJY\n",
1004 "AQA0IlgBADQiWAEANCJYAQA0IlgBADRi5XVYR7Zv27LrzvseOjBf2+ZN3a4RlwOw4QhWsI4cP/Xo\n",
1005 "1psW2NbkhsmJE6OuB2CjMRQIANCIYAUA0IhgBQDQiGAFANCIYAUA0IhgBQDQiGAFANCIdawAxsBi\n",
1006 "i78mFoCFtUKwAhgDiy3+mlgAFtYKQ4EAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0I\n",
1007 "VgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYA\n",
1008 "AI0IVgAAjQhWAACNCFYAAI0IVgAAjWxZ7o2llOckuTfJ9yf5fJJ3JTmT5IEk19Va+yYVAgCMiWUF\n",
1009 "q1LKpiRvTnJ7ki7JrUmurrVOlVKuT3JNktuaVQnryMFDR/ZNnZyeWKh95wXnHb780kv2jK4iAFpZ\n",
1010 "bo/V9Ul+Jck/zGA48ZFa69Sw7bYkt0SwgnlNnZye2Lv/8O6F2m+cnBhhNQC0tOQ5VqWUb0/S1Vo/\n",
1011 "POs1js265GiSixrUBgAwVpbTYzWZ5DtKKS9MsivJq5J8Ylb7jjwxaAGwirZv27LrzvseOrBQu+Fn\n",
1012 "aGfJwarWevPM96WUn07ywSQ/VUq5uNb66STXJrmrXYkAnIvjpx7depPhZxiJZT8VOMf1Se4opZxJ\n",
1013 "cn+t9dZGrwsAMDbOKVjVWv/NrMMrz7EWAICxZoFQAIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCA\n",
1014 "RgQrAIBGBCsAgEYEKwCARgQrAIBGWu0VCDSyfduWXXfe99CB+do2b+p2jbgcAJZAsII15vipR7fe\n",
1015 "tP/w7vnabpicODHqegB48gwFAgA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQi\n",
1016 "WAEANCJYAQA0YksbgA1usf0pd15w3uHLL71kz2grgvElWAFscIvtT3nj5MSIq4HxZigQAKARPVYA\n",
1017 "LNvBQ0f2TZ2cnpivzTAiG5FgBcCyTZ2cnthrGBEeJ1jBCljs/+I3b+p2jbgcAEZEsIIVsNj/xd8w\n",
1018 "OXFi1PUAMBomrwMANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEA\n",
1019 "NGJLGwAWtH3bll133vfQgYXa7X0JTyRYAbCg46ce3XrTAvteJva+hLkMBQIANCJYAQA0IlgBADQi\n",
1020 "WAEANCJYAQA0IlgBADQiWAEANCJYAQA0suQFQkspm5L8hyTfkEEw+8kkDyd5V5IzSR5Icl2ttW9Y\n",
1021 "JwDAmrecHqtvSvJgrfU7k7wqyZuT3Jrk6lrr7iQPJrmmXYkAAONhyT1WtdaPJPnI8PDLkvx1kq7W\n",
1022 "OjU8d1uSW4a/AgBsGMueY1VKuSjJf0ryS0mOz2o6muSic6wLAGDsLCtYlVKemeQ3kvxYkg/niUFq\n",
1023 "R5Jj514aAMB4WXKwKqV8VZJ9SV5Xaz1Uaz2VZFsp5eLhJdcmuatdiQAA42HJc6ySXJ/kOUl+vZSS\n",
1024 "DHqnrk9yRynlTJL7a623tisRAGA8LGfy+vUZBKm5rjz3cmA8HDx0ZN/UyemJhdo3b+p2jbAcANaI\n",
1025 "5fRYwYY3dXJ6Yu/+w7sXar9hcuLEKOsBYG2w8joAQCOCFQBAI4IVAEAjghUAQCMmr7Nhne3Jvp0X\n",
1026 "nHf48ksv2TO6imBjWezvoL9/jCvBig3rbE/23Tg5McJqYONZ7O+gv3+MK0OBAACNCFYAAI0IVgAA\n",
1027 "jQhWAACNmLwOC9i+bcuuO+976MB8bfYCBGA+ghUs4PipR7fetMATS/YCBGA+hgIBABrRYwXAilhs\n",
1028 "OD0xpM76JFgBsCIWG05PDKmzPglWAIwV21GxlglWAIwV21Gxlpm8DgDQiGAFANCIYAUA0IhgBQDQ\n",
1029 "iMnrjLWzPh10/lOfNfW505+ar80aOgC0Jlgx1s72dNANkxMnbtp/+HkLta1cZQBsRIYCAQAaEawA\n",
1030 "ABoRrAAAGhGsAAAaEawAABoRrAAAGhGsAAAaEawAABoRrAAAGhGsAAAasaUNAGvO9m1bdt1530MH\n",
1031 "5muzzydrmWAFwJpz/NSjW29aYB9Q+3yylhkKBABoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaMRy\n",
1032 "C4zEwUNH9k2dnJ6Yr23nBecdvvzSS/aMtiJgI1rsZ1Gy+M+jc7mXjUOwYiSmTk5P7F1gTZobJydG\n",
1033 "XA2wUS32syhZ/OfRudzLxmEoEACgET1WrHmLdb/b2gKYy3Y4rCbBijVvse53W1sAc9kOh9VkKBAA\n",
1034 "oBE9Vqy6xbrt/+bUI9uf9rSn7RxxScAGdS7DiIvd64nBjUOwYtUt1m2f6LoHRudchhEXu9cTgxtH\n",
1035 "02BVSnlbkisyGGJ8Q631YMvX59wcP378/Ic/d/r7Huv7br7287ZsOvq8S575O6OuCwDWi2bBqpTy\n",
1036 "8iSP1VpfXEr58iTvT7JgLwSr4qs++ODRt//B4b8+f77GPc+/+CPPuyQLBquzLo53/lOfNfW505+a\n",
1037 "r82TOMBGttgwYWJh0vWkZY/VS5K8J0lqrSdKKR8vpTyn1vqXDd+Dc/SZz58+c/j438zb9sgXHzu9\n",
1038 "2L1nWxzvhsmJEzftP/y8hdqWVCjAOnK2KQ8WJl0/Wgari5IcnXX82eE5wWoN+a7nXnhq5/lP/fx8\n",
1039 "bc++cOtTRl0PAKwnXd/3TV6olHJzkttrrR8dHr8jyc211k/Mvu7uu+9u84YAACNw1VVXzTs3eT4t\n",
1040 "e6zuTvKaJB8tpWxPctncULXU4gAAxkmzBUJrrb+XJKWUDyX5QJI3tnptAIBx0GwoEABgo7OlDQBA\n",
1041 "I4IVAEAjghUAQCMj3SuwlPKdSX4zyTfXWj8zPPf6JN+fQch7S631/aOsibWvlLIng4chPjM89fpa\n",
1042 "65+uXkWsNbbTYilKKceSzPwM+WCt9ZbVrIe1Zbiywe1J7qm13lJKuSzJu5KcSfJAkutqrQtOUB9Z\n",
1043 "sCqlfHWS1ybZn6QbntuV5Ipa64tKKVuS7C+l/G6tdf6lwdmo+iQ/W2v9zdUuhLXHdlosw8Fa6ytW\n",
1044 "uwjWrJszWN3g6cPjW5NcXWudKqVcn+SaJLctdPPIhgJrrZ+stb42yekM/qFMku9K8t5h+6NJfifJ\n",
1045 "5aOqibHy46WUPy6l3LrahbDmPGE7rSQfL6U8Z3VLYo37xlLKvaWUu0spz1rtYlhbaq3XJflYkpRS\n",
1046 "tiV5pNY6NWy+LcnkYvc377EqpXxdkl+ac/rhWuueeS6/KMlHZx3PbIPDBrTQn50k/6rW+u7hNb9c\n",
1047 "SnnZzLppENtpsXTPrbWeLqV8e5K3JLl2tQtizbowybFZx0dzlpzSPFjVWv88yZPtYj2WZMes42ck\n",
1048 "+YvWNTEenuSfnd9K8i1JBCtmzPwc+avh8Y48MWjBE9RaTw9//eNSyo6zXc+GdjxPDFI78sSg9SVW\n",
1049 "66nAmW1t9id5dZKUUp6S5JVJTDrlCUopbyqlPHN4+D1J7lvNelhzZrbTmpl0Ou92WpAkpZTLSylX\n",
1050 "D7//1vxtIIcvUWs9lWRbKeXi4alrk9y12D2rFaz6JKm1PpjkD0spf5Dk3iRvq7VOr1JNrF3/K8n7\n",
1051 "Syn3JDlWaz2wyvWwhthOiyW6P8m1pZQDSW5M8ubVLYc1bGY++PVJ7hj+G/Q1tdb3LnaTLW0AABqx\n",
1052 "QCgAQCOCFQBAI4IVAEAjghUAQCOCFQBAI4IVAEAjghUAQCOCFQBAI4IVAEAj/x8Ld0kx4zM3zgAA\n",
1053 "AABJRU5ErkJggg==\n"
1054 ]
299 "image/png": "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\nLnYAAAAASUVORK5CYII=\n"
1055 300 },
1056 301 "metadata": {},
1057 302 "output_type": "display_data"
1058 303 }
1059 304 ],
1060 305 "source": [
1061 306 "display_png(x)\n",
1062 307 "display_png(x2)"
1063 308 ]
1064 309 },
1065 310 {
1066 311 "cell_type": "markdown",
1067 312 "metadata": {},
1068 313 "source": [
1069 314 "Note that like `print`, you can call any of the `display` functions multiple times in a cell."
1070 315 ]
1071 316 },
1072 317 {
1073 318 "cell_type": "markdown",
1074 319 "metadata": {},
1075 320 "source": [
1076 321 "## Adding IPython display support to existing objects"
1077 322 ]
1078 323 },
1079 324 {
1080 325 "cell_type": "markdown",
1081 326 "metadata": {},
1082 327 "source": [
1083 328 "When you are directly writing your own classes, you can adapt them for display in IPython by following the above approach. But in practice, you often need to work with existing classes that you can't easily modify. We now illustrate how to add rich output capabilities to existing objects. We will use the NumPy polynomials and change their default representation to be a formatted LaTeX expression."
1084 329 ]
1085 330 },
1086 331 {
1087 332 "cell_type": "markdown",
1088 333 "metadata": {},
1089 334 "source": [
1090 335 "First, consider how a NumPy polynomial object renders by default:"
1091 336 ]
1092 337 },
1093 338 {
1094 339 "cell_type": "code",
1095 340 "execution_count": 9,
1096 "metadata": {
1097 "collapsed": false
1098 },
341 "metadata": {},
1099 342 "outputs": [
1100 343 {
1101 344 "data": {
1102 345 "text/plain": [
1103 346 "Polynomial([ 1., 2., 3.], [-10., 10.], [-1, 1])"
1104 347 ]
1105 348 },
1106 349 "execution_count": 9,
1107 350 "metadata": {},
1108 351 "output_type": "execute_result"
1109 352 }
1110 353 ],
1111 354 "source": [
1112 355 "p = np.polynomial.Polynomial([1,2,3], [-10, 10])\n",
1113 356 "p"
1114 357 ]
1115 358 },
1116 359 {
1117 360 "cell_type": "markdown",
1118 361 "metadata": {},
1119 362 "source": [
1120 363 "Next, define a function that pretty-prints a polynomial as a LaTeX string:"
1121 364 ]
1122 365 },
1123 366 {
1124 367 "cell_type": "code",
1125 368 "execution_count": 10,
1126 369 "metadata": {
1127 "collapsed": false
370 "collapsed": true
1128 371 },
1129 372 "outputs": [],
1130 373 "source": [
1131 374 "def poly_to_latex(p):\n",
1132 375 " terms = ['%.2g' % p.coef[0]]\n",
1133 376 " if len(p) > 1:\n",
1134 377 " term = 'x'\n",
1135 378 " c = p.coef[1]\n",
1136 379 " if c!=1:\n",
1137 380 " term = ('%.2g ' % c) + term\n",
1138 381 " terms.append(term)\n",
1139 382 " if len(p) > 2:\n",
1140 383 " for i in range(2, len(p)):\n",
1141 384 " term = 'x^%d' % i\n",
1142 385 " c = p.coef[i]\n",
1143 386 " if c!=1:\n",
1144 387 " term = ('%.2g ' % c) + term\n",
1145 388 " terms.append(term)\n",
1146 389 " px = '$P(x)=%s$' % '+'.join(terms)\n",
1147 390 " dom = r', $x \\in [%.2g,\\ %.2g]$' % tuple(p.domain)\n",
1148 391 " return px+dom"
1149 392 ]
1150 393 },
1151 394 {
1152 395 "cell_type": "markdown",
1153 396 "metadata": {},
1154 397 "source": [
1155 398 "This produces, on our polynomial ``p``, the following:"
1156 399 ]
1157 400 },
1158 401 {
1159 402 "cell_type": "code",
1160 403 "execution_count": 11,
1161 "metadata": {
1162 "collapsed": false
1163 },
404 "metadata": {},
1164 405 "outputs": [
1165 406 {
1166 407 "data": {
1167 408 "text/plain": [
1168 409 "'$P(x)=1+2 x+3 x^2$, $x \\\\in [-10,\\\\ 10]$'"
1169 410 ]
1170 411 },
1171 412 "execution_count": 11,
1172 413 "metadata": {},
1173 414 "output_type": "execute_result"
1174 415 }
1175 416 ],
1176 417 "source": [
1177 418 "poly_to_latex(p)"
1178 419 ]
1179 420 },
1180 421 {
1181 422 "cell_type": "markdown",
1182 423 "metadata": {},
1183 424 "source": [
1184 425 "You can render this string using the `Latex` class:"
1185 426 ]
1186 427 },
1187 428 {
1188 429 "cell_type": "code",
1189 430 "execution_count": 12,
1190 "metadata": {
1191 "collapsed": false
1192 },
431 "metadata": {},
1193 432 "outputs": [
1194 433 {
1195 434 "data": {
1196 435 "text/latex": [
1197 436 "$P(x)=1+2 x+3 x^2$, $x \\in [-10,\\ 10]$"
1198 437 ],
1199 438 "text/plain": [
1200 439 "<IPython.core.display.Latex object>"
1201 440 ]
1202 441 },
1203 442 "execution_count": 12,
1204 443 "metadata": {},
1205 444 "output_type": "execute_result"
1206 445 }
1207 446 ],
1208 447 "source": [
1209 448 "from IPython.display import Latex\n",
1210 449 "Latex(poly_to_latex(p))"
1211 450 ]
1212 451 },
1213 452 {
1214 453 "cell_type": "markdown",
1215 454 "metadata": {},
1216 455 "source": [
1217 456 "However, you can configure IPython to do this automatically by registering the `Polynomial` class and the `poly_to_latex` function with an IPython display formatter. Let's look at the default formatters provided by IPython:"
1218 457 ]
1219 458 },
1220 459 {
1221 460 "cell_type": "code",
1222 461 "execution_count": 13,
1223 "metadata": {
1224 "collapsed": false
1225 },
462 "metadata": {},
1226 463 "outputs": [
1227 464 {
1228 465 "name": "stdout",
1229 466 "output_type": "stream",
1230 467 "text": [
468 " text/plain : PlainTextFormatter\n",
469 " text/html : HTMLFormatter\n",
470 " text/markdown : MarkdownFormatter\n",
471 " image/svg+xml : SVGFormatter\n",
1231 472 " image/png : PNGFormatter\n",
1232 473 " application/pdf : PDFFormatter\n",
1233 " text/html : HTMLFormatter\n",
1234 474 " image/jpeg : JPEGFormatter\n",
1235 " text/plain : PlainTextFormatter\n",
1236 " text/markdown : MarkdownFormatter\n",
1237 " application/json : JSONFormatter\n",
1238 " application/javascript : JavascriptFormatter\n",
1239 475 " text/latex : LatexFormatter\n",
1240 " image/svg+xml : SVGFormatter\n"
476 " application/json : JSONFormatter\n",
477 " application/javascript : JavascriptFormatter\n"
1241 478 ]
1242 479 }
1243 480 ],
1244 481 "source": [
1245 482 "ip = get_ipython()\n",
1246 483 "for mime, formatter in ip.display_formatter.formatters.items():\n",
1247 484 " print('%24s : %s' % (mime, formatter.__class__.__name__))"
1248 485 ]
1249 486 },
1250 487 {
1251 488 "cell_type": "markdown",
1252 489 "metadata": {},
1253 490 "source": [
1254 491 "The `formatters` attribute is a dictionary keyed by MIME types. To define a custom LaTeX display function, you want a handle on the `text/latex` formatter:"
1255 492 ]
1256 493 },
1257 494 {
1258 495 "cell_type": "code",
1259 496 "execution_count": 14,
1260 497 "metadata": {
1261 "collapsed": false
498 "collapsed": true
1262 499 },
1263 500 "outputs": [],
1264 501 "source": [
1265 502 "ip = get_ipython()\n",
1266 503 "latex_f = ip.display_formatter.formatters['text/latex']"
1267 504 ]
1268 505 },
1269 506 {
1270 507 "cell_type": "markdown",
1271 508 "metadata": {},
1272 509 "source": [
1273 510 "The formatter object has a couple of methods for registering custom display functions for existing types."
1274 511 ]
1275 512 },
1276 513 {
1277 514 "cell_type": "code",
1278 515 "execution_count": 15,
1279 "metadata": {
1280 "collapsed": false
1281 },
516 "metadata": {},
1282 517 "outputs": [
1283 518 {
1284 519 "name": "stdout",
1285 520 "output_type": "stream",
1286 521 "text": [
1287 522 "Help on method for_type in module IPython.core.formatters:\n",
1288 523 "\n",
1289 524 "for_type(typ, func=None) method of IPython.core.formatters.LatexFormatter instance\n",
1290 525 " Add a format function for a given type.\n",
1291 526 " \n",
1292 527 " Parameters\n",
1293 528 " -----------\n",
1294 529 " typ : type or '__module__.__name__' string for a type\n",
1295 530 " The class of the object that will be formatted using `func`.\n",
1296 531 " func : callable\n",
1297 532 " A callable for computing the format data.\n",
1298 533 " `func` will be called with the object to be formatted,\n",
1299 534 " and will return the raw data in this formatter's format.\n",
1300 535 " Subclasses may use a different call signature for the\n",
1301 536 " `func` argument.\n",
1302 537 " \n",
1303 538 " If `func` is None or not specified, there will be no change,\n",
1304 539 " only returning the current value.\n",
1305 540 " \n",
1306 541 " Returns\n",
1307 542 " -------\n",
1308 543 " oldfunc : callable\n",
1309 544 " The currently registered callable.\n",
1310 545 " If you are registering a new formatter,\n",
1311 546 " this will be the previous value (to enable restoring later).\n",
1312 547 "\n"
1313 548 ]
1314 549 }
1315 550 ],
1316 551 "source": [
1317 552 "help(latex_f.for_type)"
1318 553 ]
1319 554 },
1320 555 {
1321 556 "cell_type": "code",
1322 557 "execution_count": 16,
1323 "metadata": {
1324 "collapsed": false
1325 },
558 "metadata": {},
1326 559 "outputs": [
1327 560 {
1328 561 "name": "stdout",
1329 562 "output_type": "stream",
1330 563 "text": [
1331 564 "Help on method for_type_by_name in module IPython.core.formatters:\n",
1332 565 "\n",
1333 566 "for_type_by_name(type_module, type_name, func=None) method of IPython.core.formatters.LatexFormatter instance\n",
1334 567 " Add a format function for a type specified by the full dotted\n",
1335 568 " module and name of the type, rather than the type of the object.\n",
1336 569 " \n",
1337 570 " Parameters\n",
1338 571 " ----------\n",
1339 572 " type_module : str\n",
1340 573 " The full dotted name of the module the type is defined in, like\n",
1341 574 " ``numpy``.\n",
1342 575 " type_name : str\n",
1343 576 " The name of the type (the class name), like ``dtype``\n",
1344 577 " func : callable\n",
1345 578 " A callable for computing the format data.\n",
1346 579 " `func` will be called with the object to be formatted,\n",
1347 580 " and will return the raw data in this formatter's format.\n",
1348 581 " Subclasses may use a different call signature for the\n",
1349 582 " `func` argument.\n",
1350 583 " \n",
1351 584 " If `func` is None or unspecified, there will be no change,\n",
1352 585 " only returning the current value.\n",
1353 586 " \n",
1354 587 " Returns\n",
1355 588 " -------\n",
1356 589 " oldfunc : callable\n",
1357 590 " The currently registered callable.\n",
1358 591 " If you are registering a new formatter,\n",
1359 592 " this will be the previous value (to enable restoring later).\n",
1360 593 "\n"
1361 594 ]
1362 595 }
1363 596 ],
1364 597 "source": [
1365 598 "help(latex_f.for_type_by_name)"
1366 599 ]
1367 600 },
1368 601 {
1369 602 "cell_type": "markdown",
1370 603 "metadata": {},
1371 604 "source": [
1372 605 "In this case, we will use `for_type_by_name` to register `poly_to_latex` as the display function for the `Polynomial` type:"
1373 606 ]
1374 607 },
1375 608 {
1376 609 "cell_type": "code",
1377 610 "execution_count": 17,
1378 611 "metadata": {
1379 "collapsed": false
612 "collapsed": true
1380 613 },
1381 614 "outputs": [],
1382 615 "source": [
1383 616 "latex_f.for_type_by_name('numpy.polynomial.polynomial',\n",
1384 617 " 'Polynomial', poly_to_latex)"
1385 618 ]
1386 619 },
1387 620 {
1388 621 "cell_type": "markdown",
1389 622 "metadata": {},
1390 623 "source": [
1391 624 "Once the custom display function has been registered, all NumPy `Polynomial` instances will be represented by their LaTeX form instead:"
1392 625 ]
1393 626 },
1394 627 {
1395 628 "cell_type": "code",
1396 629 "execution_count": 18,
1397 "metadata": {
1398 "collapsed": false
1399 },
630 "metadata": {},
1400 631 "outputs": [
1401 632 {
1402 633 "data": {
1403 634 "text/latex": [
1404 635 "$P(x)=1+2 x+3 x^2$, $x \\in [-10,\\ 10]$"
1405 636 ],
1406 637 "text/plain": [
1407 638 "Polynomial([ 1., 2., 3.], [-10., 10.], [-1, 1])"
1408 639 ]
1409 640 },
1410 641 "execution_count": 18,
1411 642 "metadata": {},
1412 643 "output_type": "execute_result"
1413 644 }
1414 645 ],
1415 646 "source": [
1416 647 "p"
1417 648 ]
1418 649 },
1419 650 {
1420 651 "cell_type": "code",
1421 652 "execution_count": 19,
1422 "metadata": {
1423 "collapsed": false
1424 },
653 "metadata": {},
1425 654 "outputs": [
1426 655 {
1427 656 "data": {
1428 657 "text/latex": [
1429 658 "$P(x)=-20+71 x+-15 x^2+x^3$, $x \\in [-1,\\ 1]$"
1430 659 ],
1431 660 "text/plain": [
1432 661 "Polynomial([-20., 71., -15., 1.], [-1, 1], [-1, 1])"
1433 662 ]
1434 663 },
1435 664 "execution_count": 19,
1436 665 "metadata": {},
1437 666 "output_type": "execute_result"
1438 667 }
1439 668 ],
1440 669 "source": [
1441 670 "p2 = np.polynomial.Polynomial([-20, 71, -15, 1])\n",
1442 671 "p2"
1443 672 ]
1444 673 },
1445 674 {
1446 675 "cell_type": "markdown",
1447 676 "metadata": {},
1448 677 "source": [
678 "## Custom Mimetypes with `_repr_mimebundle_`\n",
679 "\n",
680 "Available on IPython 5.4+ and 6.1+.\n",
681 "\n",
682 "For objects needing full control over the `repr` protocol may decide to implement the `_repr_mimebundle_(include, exclude)` method.\n",
683 "Unlike the other `_repr_*_` methods must return many representation of the object in a mapping object which keys are _mimetypes_ and value are associated data. The `_repr_mimebundle_()` method, may also return a second mapping from _mimetypes_ to metadata. \n",
684 "\n",
685 "Example:"
686 ]
687 },
688 {
689 "cell_type": "code",
690 "execution_count": 20,
691 "metadata": {
692 "collapsed": true
693 },
694 "outputs": [],
695 "source": [
696 "class Gaussian(object):\n",
697 " \"\"\"A simple object holding data sampled from a Gaussian distribution.\n",
698 " \"\"\"\n",
699 " def __init__(self, mean=0.0, std=1, size=1000):\n",
700 " self.data = np.random.normal(mean, std, size)\n",
701 " self.mean = mean\n",
702 " self.std = std\n",
703 " self.size = size\n",
704 " # For caching plots that may be expensive to compute\n",
705 " self._png_data = None\n",
706 " \n",
707 " def _figure_data(self, format):\n",
708 " fig, ax = plt.subplots()\n",
709 " ax.hist(self.data, bins=50)\n",
710 " ax.set_xlim(-10.0,10.0)\n",
711 " data = print_figure(fig, format)\n",
712 " # We MUST close the figure, otherwise IPython's display machinery\n",
713 " # will pick it up and send it as output, resulting in a double display\n",
714 " plt.close(fig)\n",
715 " return data\n",
716 " \n",
717 " def _compute_mathml(self):\n",
718 " return \"\"\"\n",
719 " <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n",
720 " <mrow class=\"MJX-TeXAtom-ORD\">\n",
721 " <mi class=\"MJX-tex-caligraphic\" mathvariant=\"script\">N</mi>\n",
722 " </mrow>\n",
723 " <mo stretchy=\"false\">(</mo>\n",
724 " <mi>&#x03BC;<!-- ΞΌ --></mi>\n",
725 " <mo>=</mo>\n",
726 " <mn>{mu}</mn>\n",
727 " <mo>,</mo>\n",
728 " <mi>&#x03C3;<!-- Οƒ --></mi>\n",
729 " <mo>=</mo>\n",
730 " <mn>{sigma}</mn>\n",
731 " <mo stretchy=\"false\">)</mo>\n",
732 " <mo>,</mo>\n",
733 " <mtext>&#xA0;</mtext>\n",
734 " <mi>N</mi>\n",
735 " <mo>=</mo>\n",
736 " <mn>{N}</mn>\n",
737 " </math>\n",
738 " \"\"\".format(N=self.size, mu=self.mean, sigma=self.std)\n",
739 " \n",
740 " def _repr_mimebundle_(self, include, exclude, **kwargs):\n",
741 " \"\"\"\n",
742 " repr_mimebundle shoudl accept include, exclude and **kwargs\n",
743 " \"\"\"\n",
744 " if self._png_data is None:\n",
745 " self._png_data = self._figure_data('png')\n",
746 " math = r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,\n",
747 " self.std, self.size)\n",
748 " data = {'image/png':self._png_data,\n",
749 " 'text/latex':math,\n",
750 " 'application/mathml+xml': self._compute_mathml()\n",
751 " }\n",
752 " if include:\n",
753 " data = {k:v for (k,v) in data.items() if k in include}\n",
754 " if exclude:\n",
755 " data = {k:v for (k,v) in data.items() if k not in exclude}\n",
756 " return data"
757 ]
758 },
759 {
760 "cell_type": "code",
761 "execution_count": 21,
762 "metadata": {},
763 "outputs": [
764 {
765 "data": {
766 "application/mathml+xml": "\n <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n <mrow class=\"MJX-TeXAtom-ORD\">\n <mi class=\"MJX-tex-caligraphic\" mathvariant=\"script\">N</mi>\n </mrow>\n <mo stretchy=\"false\">(</mo>\n <mi>&#x03BC;<!-- ΞΌ --></mi>\n <mo>=</mo>\n <mn>0.0</mn>\n <mo>,</mo>\n <mi>&#x03C3;<!-- Οƒ --></mi>\n <mo>=</mo>\n <mn>1</mn>\n <mo stretchy=\"false\">)</mo>\n <mo>,</mo>\n <mtext>&#xA0;</mtext>\n <mi>N</mi>\n <mo>=</mo>\n <mn>1000</mn>\n </math>\n ",
767 "image/png": "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\nDfgfS9fLKUqMYTsAAAAASUVORK5CYII=\n",
768 "text/latex": [
769 "$\\mathcal{N}(\\mu=0, \\sigma=1),\\ N=1000$"
770 ],
771 "text/plain": [
772 "<__main__.Gaussian at 0x11a614e80>"
773 ]
774 },
775 "metadata": {},
776 "output_type": "display_data"
777 }
778 ],
779 "source": [
780 "# that is deffinitively wrong as it shoudl show the PNG. \n",
781 "display(Gaussian())"
782 ]
783 },
784 {
785 "cell_type": "markdown",
786 "metadata": {},
787 "source": [
788 "In the above example, the 3 mimetypes are embeded in the notebook document this allowing custom extensions and converters to display the representation(s) of their choice.\n",
789 "\n",
790 "For example, converting this noetebook to _epub_ may decide to use the MathML representation as most ebook reader cannot run mathjax (unlike browsers). \n",
791 "\n",
792 "\n",
793 "### Implementation guidelines\n",
794 "\n",
795 "The `_repr_mimebundle_` methods is also given two keywords parameters : `include` and `exclude`. Each can be a containers (e.g.:`list`, `set` ...) of mimetypes to return or `None`, This allows implementation to avoid computing potentially unnecessary and expensive mimetypes representations. \n",
796 "\n",
797 "When `include` is non-empty (empty `list` or None), `_repr_mimebundle_` may decide to returns only the mimetypes in include.\n",
798 "When `exclude` is non-empty, `_repr_mimebundle_` may decide to not return any mimetype in exclude. \n",
799 "If both `include` and `exclude` and overlap, mimetypes present in exclude may not be returned. \n",
800 "\n",
801 "If implementations decide to ignore the `include` and `exclude` logic and always returns a full mimebundles, the IPython kernel will take care of removing non-desired representations.\n",
802 "\n",
803 "The `_repr_mimebundle_` method should accept arbitrary keyword arguments for future compatiility.\n"
804 ]
805 },
806 {
807 "cell_type": "code",
808 "execution_count": 22,
809 "metadata": {},
810 "outputs": [
811 {
812 "data": {
813 "text/latex": [
814 "$\\mathcal{N}(\\mu=0, \\sigma=1),\\ N=1000$"
815 ]
816 },
817 "metadata": {},
818 "output_type": "display_data"
819 }
820 ],
821 "source": [
822 "display(Gaussian(), include={'text/latex'}) # only show latex"
823 ]
824 },
825 {
826 "cell_type": "code",
827 "execution_count": 23,
828 "metadata": {},
829 "outputs": [
830 {
831 "data": {
832 "application/mathml+xml": "\n <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n <mrow class=\"MJX-TeXAtom-ORD\">\n <mi class=\"MJX-tex-caligraphic\" mathvariant=\"script\">N</mi>\n </mrow>\n <mo stretchy=\"false\">(</mo>\n <mi>&#x03BC;<!-- ΞΌ --></mi>\n <mo>=</mo>\n <mn>0.0</mn>\n <mo>,</mo>\n <mi>&#x03C3;<!-- Οƒ --></mi>\n <mo>=</mo>\n <mn>1</mn>\n <mo stretchy=\"false\">)</mo>\n <mo>,</mo>\n <mtext>&#xA0;</mtext>\n <mi>N</mi>\n <mo>=</mo>\n <mn>1000</mn>\n </math>\n ",
833 "text/latex": [
834 "$\\mathcal{N}(\\mu=0, \\sigma=1),\\ N=1000$"
835 ],
836 "text/plain": [
837 "<__main__.Gaussian at 0x116fe7550>"
838 ]
839 },
840 "metadata": {},
841 "output_type": "display_data"
842 }
843 ],
844 "source": [
845 "display(Gaussian(), exclude={'image/png'}) # exclude png"
846 ]
847 },
848 {
849 "cell_type": "code",
850 "execution_count": 24,
851 "metadata": {},
852 "outputs": [
853 {
854 "data": {
855 "text/plain": [
856 "<__main__.Gaussian at 0x11a8a0b38>"
857 ]
858 },
859 "metadata": {},
860 "output_type": "display_data"
861 }
862 ],
863 "source": [
864 "display(Gaussian(), include={'text/plain', 'image/png'}, exclude={'image/png'}) # keep only plain/text"
865 ]
866 },
867 {
868 "cell_type": "markdown",
869 "metadata": {},
870 "source": [
1449 871 "## More complex display with `_ipython_display_`"
1450 872 ]
1451 873 },
1452 874 {
1453 875 "cell_type": "markdown",
1454 876 "metadata": {},
1455 877 "source": [
1456 878 "Rich output special methods and functions can only display one object or MIME type at a time. Sometimes this is not enough if you want to display multiple objects or MIME types at once. An example of this would be to use an HTML representation to put some HTML elements in the DOM and then use a JavaScript representation to add events to those elements.\n",
1457 879 "\n",
1458 880 "**IPython 2.0** recognizes another display method, `_ipython_display_`, which allows your objects to take complete control of displaying themselves. If this method is defined, IPython will call it, and make no effort to display the object using the above described `_repr_*_` methods for custom display functions. It's a way for you to say \"Back off, IPython, I can display this myself.\" Most importantly, your `_ipython_display_` method can make multiple calls to the top-level `display` functions to accomplish its goals.\n",
1459 881 "\n",
1460 882 "Here is an object that uses `display_html` and `display_javascript` to make a plot using the [Flot](http://www.flotcharts.org/) JavaScript plotting library:"
1461 883 ]
1462 884 },
1463 885 {
1464 886 "cell_type": "code",
1465 "execution_count": 20,
887 "execution_count": 25,
1466 888 "metadata": {
1467 "collapsed": false
889 "collapsed": true
1468 890 },
1469 891 "outputs": [],
1470 892 "source": [
1471 893 "import json\n",
1472 894 "import uuid\n",
1473 895 "from IPython.display import display_javascript, display_html, display\n",
1474 896 "\n",
1475 897 "class FlotPlot(object):\n",
1476 898 " def __init__(self, x, y):\n",
1477 899 " self.x = x\n",
1478 900 " self.y = y\n",
1479 901 " self.uuid = str(uuid.uuid4())\n",
1480 902 " \n",
1481 903 " def _ipython_display_(self):\n",
1482 904 " json_data = json.dumps(list(zip(self.x, self.y)))\n",
1483 905 " display_html('<div id=\"{}\" style=\"height: 300px; width:80%;\"></div>'.format(self.uuid),\n",
1484 906 " raw=True\n",
1485 907 " )\n",
1486 908 " display_javascript(\"\"\"\n",
1487 909 " require([\"//cdnjs.cloudflare.com/ajax/libs/flot/0.8.2/jquery.flot.min.js\"], function() {\n",
1488 910 " var line = JSON.parse(\"%s\");\n",
1489 911 " console.log(line);\n",
1490 912 " $.plot(\"#%s\", [line]);\n",
1491 913 " });\n",
1492 914 " \"\"\" % (json_data, self.uuid), raw=True)\n"
1493 915 ]
1494 916 },
1495 917 {
1496 918 "cell_type": "code",
1497 "execution_count": 21,
1498 "metadata": {
1499 "collapsed": false
1500 },
919 "execution_count": 26,
920 "metadata": {},
1501 921 "outputs": [
1502 922 {
1503 923 "data": {
1504 924 "text/html": [
1505 "<div id=\"4ad544ff-a161-4493-ba2c-f99531e317bd\" style=\"height: 300px; width:80%;\"></div>"
925 "<div id=\"c6929609-3cb6-4443-9574-d9f71791a987\" style=\"height: 300px; width:80%;\"></div>"
1506 926 ]
1507 927 },
1508 928 "metadata": {},
1509 929 "output_type": "display_data"
1510 930 },
1511 931 {
1512 932 "data": {
1513 933 "application/javascript": [
1514 934 "\n",
1515 935 " require([\"//cdnjs.cloudflare.com/ajax/libs/flot/0.8.2/jquery.flot.min.js\"], function() {\n",
1516 936 " var line = JSON.parse(\"[[0.0, 0.0], [0.20408163265306123, 0.20266793654820095], [0.40816326530612246, 0.39692414892492234], [0.6122448979591837, 0.5747060412161791], [0.8163265306122449, 0.7286347834693503], [1.0204081632653061, 0.8523215697196184], [1.2244897959183674, 0.9406327851124867], [1.4285714285714286, 0.9899030763721239], [1.6326530612244898, 0.9980874821347183], [1.836734693877551, 0.9648463089837632], [2.0408163265306123, 0.8915592304110037], [2.2448979591836737, 0.7812680235262639], [2.4489795918367347, 0.6385503202266021], [2.6530612244897958, 0.469329612777201], [2.857142857142857, 0.28062939951435684], [3.0612244897959187, 0.0802816748428135], [3.2653061224489797, -0.12339813736217871], [3.4693877551020407, -0.3219563150726187], [3.673469387755102, -0.5071517094845144], [3.8775510204081636, -0.6712977935519321], [4.081632653061225, -0.8075816909683364], [4.285714285714286, -0.9103469443107828], [4.4897959183673475, -0.9753282860670456], [4.6938775510204085, -0.9998286683840896], [4.8979591836734695, -0.9828312039256306], [5.1020408163265305, -0.9250413717382029], [5.3061224489795915, -0.8288577363730427], [5.510204081632653, -0.6982723955653996], [5.714285714285714, -0.5387052883861563], [5.918367346938775, -0.35677924089893803], [6.122448979591837, -0.16004508604325057], [6.326530612244898, 0.04333173336868346], [6.530612244897959, 0.2449100710119793], [6.73469387755102, 0.4363234264718193], [6.938775510204081, 0.6096271964908323], [7.142857142857143, 0.7576284153927202], [7.346938775510204, 0.8741842988197335], [7.551020408163265, 0.9544571997387519], [7.755102040816327, 0.9951153947776636], [7.959183673469388, 0.9944713672636168], [8.16326530612245, 0.9525518475314604], [8.36734693877551, 0.8710967034823207], [8.571428571428571, 0.7534867274396376], [8.775510204081632, 0.6046033165061543], [8.979591836734695, 0.43062587038273736], [9.183673469387756, 0.23877531564403087], [9.387755102040817, 0.03701440148506237], [9.591836734693878, -0.1662827938487564], [9.795918367346939, -0.3626784288265488], [10.0, -0.5440211108893699]]\");\n",
1517 937 " console.log(line);\n",
1518 " $.plot(\"#4ad544ff-a161-4493-ba2c-f99531e317bd\", [line]);\n",
938 " $.plot(\"#c6929609-3cb6-4443-9574-d9f71791a987\", [line]);\n",
1519 939 " });\n",
1520 940 " "
1521 941 ]
1522 942 },
1523 943 "metadata": {},
1524 944 "output_type": "display_data"
1525 945 }
1526 946 ],
1527 947 "source": [
1528 948 "import numpy as np\n",
1529 949 "x = np.linspace(0,10)\n",
1530 950 "y = np.sin(x)\n",
1531 951 "FlotPlot(x, np.sin(x))"
1532 952 ]
1533 953 }
1534 954 ],
1535 955 "metadata": {
1536 956 "kernelspec": {
1537 957 "display_name": "Python 3",
1538 958 "language": "python",
1539 959 "name": "python3"
1540 960 },
1541 961 "language_info": {
1542 962 "codemirror_mode": {
1543 963 "name": "ipython",
1544 964 "version": 3
1545 965 },
1546 966 "file_extension": ".py",
1547 967 "mimetype": "text/x-python",
1548 968 "name": "python",
1549 969 "nbconvert_exporter": "python",
1550 970 "pygments_lexer": "ipython3",
1551 "version": "3.4.2"
971 "version": "3.6.0"
1552 972 }
1553 973 },
1554 974 "nbformat": 4,
1555 "nbformat_minor": 0
975 "nbformat_minor": 1
1556 976 }
General Comments 0
You need to be logged in to leave comments. Login now