{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Научная графика в Python\n", "\n", "Автор: Шабанов Павел Александрович\n", "\n", "E-mail: pa.shabanov@gmail.com\n", "\n", "URL: [Заметки по программированию в науках о Земле](http://progeoru.blogspot.ru/)\n", "\n", "Дата последнего обновления: 12.03.2017" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Глава 3 Текст и шрифты\n", "\n", "### Содержание главы\n", "\n", "1. Файл настройки matplotlibrc;\n", "\n", "2. Текст на рисунке;\n", "\n", "3. Наборы шрифтов. Стили и форматы;\n", "\n", "4. Кириллица и matplotlib. Подписи по-русски;\n", "\n", "5. Работа с математическими формулами. Поддержка LaTex.\n", "\n", "Текст является одним из базовых графических элементов рисунка в matplotlib. Подписи координатных осей и их делений, заголовки, пояснительные подписи на графиках и диаграммах - это всё текст. В Matplotlib возможна поддержка кириллицы для создания научной графики с подписями на русском языке. Одним из весомых преимуществ matplotlib при работе с текстом является простая поддержка математических формул с помощью LaTex. \n", "\n", "### Электронные ресурсы:\n", "\n", "+ [Инструкция по конфигурации файла настройки matplotlibrc](http://matplotlib.org/users/customizing.html);\n", "\n", "+ [Об особенностях использования LaTeX в matplotlib](http://matplotlib.org/users/usetex.html);\n", "\n", "+ [О работе с текстом в matplotlib](http://matplotlib.org/users/text_intro.html);\n", "\n", "+ [О свойствах текста](http://matplotlib.org/users/text_props.html)." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Преамбула\n", "%matplotlib inline\n", "\n", "import os\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "def save(name='', fmt='png'):\n", " pwd = os.getcwd()\n", " iPath = './pictures/{}'.format(fmt)\n", " if not os.path.exists(iPath):\n", " os.mkdir(iPath)\n", " os.chdir(iPath)\n", " plt.savefig('{}.{}'.format(name, fmt), fmt='png')\n", " os.chdir(pwd)\n", " #plt.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1 Файл настройки `matplotlibrc`\n", "\n", "В matplotlib существует файл настройки в котором хранятся значения по умолчанию для разных свойств графических элементов. Он называется `matplotlibrc`. Он инициализируется при каждой загрузке модуля matplotlib. Изменив содержание файла `matplotlibrc` можно сохранить пользовательские настройки для работы при следующих загрузках модуля matplotlib. Чтобы узнать какой именно файл настройки используется при инициализации, можно воспользоваться специальной функцией `matplotlib.matplotlib_fname()`.\n", "\n", "Для работы с настройками в интерактивном режиме, то есть из консоли или в скрипте, существует `matplotlib.rcParams`. C помощью `matplotlib.rcParams` можно, во-первых, установить все параметры рисования (шрифты, толшина/тип линий, оформление рамок) на необходимые значения, а во-вторых, увидеть, собственно, список настроек, то есть список того, что можно изменить." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "C:\\Users\\pasha\\Anaconda2\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc\n" ] }, { "data": { "text/plain": [ "RcParams({u'_internal.classic_mode': False,\n", " u'agg.path.chunksize': 0,\n", " u'animation.avconv_args': [],\n", " u'animation.avconv_path': u'avconv',\n", " u'animation.bitrate': -1,\n", " u'animation.codec': u'h264',\n", " u'animation.convert_args': [],\n", " u'animation.convert_path': u'convert',\n", " u'animation.ffmpeg_args': [],\n", " u'animation.ffmpeg_path': u'ffmpeg',\n", " u'animation.frame_format': u'png',\n", " u'animation.html': u'none',\n", " u'animation.mencoder_args': [],\n", " u'animation.mencoder_path': u'mencoder',\n", " u'animation.writer': u'ffmpeg',\n", " u'axes.autolimit_mode': u'data',\n", " u'axes.axisbelow': u'line',\n", " u'axes.edgecolor': u'k',\n", " u'axes.facecolor': u'w',\n", " u'axes.formatter.limits': [-7, 7],\n", " u'axes.formatter.offset_threshold': 4,\n", " u'axes.formatter.use_locale': False,\n", " u'axes.formatter.use_mathtext': False,\n", " u'axes.formatter.useoffset': True,\n", " u'axes.grid': False,\n", " u'axes.grid.axis': u'both',\n", " u'axes.grid.which': u'major',\n", " u'axes.hold': None,\n", " u'axes.labelcolor': u'k',\n", " u'axes.labelpad': 4.0,\n", " u'axes.labelsize': u'medium',\n", " u'axes.labelweight': u'normal',\n", " u'axes.linewidth': 0.8,\n", " u'axes.prop_cycle': cycler(u'color', [u'#1f77b4', u'#ff7f0e', u'#2ca02c', u'#d62728', u'#9467bd', u'#8c564b', u'#e377c2', u'#7f7f7f', u'#bcbd22', u'#17becf']),\n", " u'axes.spines.bottom': True,\n", " u'axes.spines.left': True,\n", " u'axes.spines.right': True,\n", " u'axes.spines.top': True,\n", " u'axes.titlepad': 6.0,\n", " u'axes.titlesize': u'large',\n", " u'axes.titleweight': u'normal',\n", " u'axes.unicode_minus': True,\n", " u'axes.xmargin': 0.05,\n", " u'axes.ymargin': 0.05,\n", " u'axes3d.grid': True,\n", " u'backend': 'module://ipykernel.pylab.backend_inline',\n", " u'backend.qt4': u'PyQt4',\n", " u'backend.qt5': u'PyQt5',\n", " u'backend_fallback': True,\n", " u'boxplot.bootstrap': None,\n", " u'boxplot.boxprops.color': u'k',\n", " u'boxplot.boxprops.linestyle': u'-',\n", " u'boxplot.boxprops.linewidth': 1.0,\n", " u'boxplot.capprops.color': u'k',\n", " u'boxplot.capprops.linestyle': u'-',\n", " u'boxplot.capprops.linewidth': 1.0,\n", " u'boxplot.flierprops.color': u'k',\n", " u'boxplot.flierprops.linestyle': u'none',\n", " u'boxplot.flierprops.linewidth': 1.0,\n", " u'boxplot.flierprops.marker': u'o',\n", " u'boxplot.flierprops.markeredgecolor': u'k',\n", " u'boxplot.flierprops.markerfacecolor': u'none',\n", " u'boxplot.flierprops.markersize': 6.0,\n", " u'boxplot.meanline': False,\n", " u'boxplot.meanprops.color': u'C2',\n", " u'boxplot.meanprops.linestyle': u'--',\n", " u'boxplot.meanprops.linewidth': 1.0,\n", " u'boxplot.meanprops.marker': u'^',\n", " u'boxplot.meanprops.markeredgecolor': u'C2',\n", " u'boxplot.meanprops.markerfacecolor': u'C2',\n", " u'boxplot.meanprops.markersize': 6.0,\n", " u'boxplot.medianprops.color': u'C1',\n", " u'boxplot.medianprops.linestyle': u'-',\n", " u'boxplot.medianprops.linewidth': 1.0,\n", " u'boxplot.notch': False,\n", " u'boxplot.patchartist': False,\n", " u'boxplot.showbox': True,\n", " u'boxplot.showcaps': True,\n", " u'boxplot.showfliers': True,\n", " u'boxplot.showmeans': False,\n", " u'boxplot.vertical': True,\n", " u'boxplot.whiskerprops.color': u'k',\n", " u'boxplot.whiskerprops.linestyle': u'-',\n", " u'boxplot.whiskerprops.linewidth': 1.0,\n", " u'boxplot.whiskers': 1.5,\n", " u'contour.corner_mask': True,\n", " u'contour.negative_linestyle': u'dashed',\n", " u'datapath': u'C:\\\\Users\\\\pasha\\\\Anaconda2\\\\lib\\\\site-packages\\\\matplotlib\\\\mpl-data',\n", " u'date.autoformatter.day': u'%Y-%m-%d',\n", " u'date.autoformatter.hour': u'%m-%d %H',\n", " u'date.autoformatter.microsecond': u'%M:%S.%f',\n", " u'date.autoformatter.minute': u'%d %H:%M',\n", " u'date.autoformatter.month': u'%Y-%m',\n", " u'date.autoformatter.second': u'%H:%M:%S',\n", " u'date.autoformatter.year': u'%Y',\n", " u'docstring.hardcopy': False,\n", " u'errorbar.capsize': 0.0,\n", " u'examples.directory': u'',\n", " u'figure.autolayout': False,\n", " u'figure.dpi': 72.0,\n", " u'figure.edgecolor': (1, 1, 1, 0),\n", " u'figure.facecolor': (1, 1, 1, 0),\n", " u'figure.figsize': [6.0, 4.0],\n", " u'figure.frameon': True,\n", " u'figure.max_open_warning': 20,\n", " u'figure.subplot.bottom': 0.125,\n", " u'figure.subplot.hspace': 0.2,\n", " u'figure.subplot.left': 0.125,\n", " u'figure.subplot.right': 0.9,\n", " u'figure.subplot.top': 0.88,\n", " u'figure.subplot.wspace': 0.2,\n", " u'figure.titlesize': u'large',\n", " u'figure.titleweight': u'normal',\n", " u'font.cursive': [u'Apple Chancery',\n", " u'Textile',\n", " u'Zapf Chancery',\n", " u'Sand',\n", " u'Script MT',\n", " u'Felipa',\n", " u'cursive'],\n", " u'font.family': [u'fantasy'],\n", " u'font.fantasy': [u'Arial',\n", " u'Times New Roman',\n", " u'Tahoma',\n", " u'Comic Sans MS',\n", " u'Courier'],\n", " u'font.monospace': [u'DejaVu Sans Mono',\n", " u'Bitstream Vera Sans Mono',\n", " u'Computer Modern Typewriter',\n", " u'Andale Mono',\n", " u'Nimbus Mono L',\n", " u'Courier New',\n", " u'Courier',\n", " u'Fixed',\n", " u'Terminal',\n", " u'monospace'],\n", " u'font.sans-serif': [u'DejaVu Sans',\n", " u'Bitstream Vera Sans',\n", " u'Computer Modern Sans Serif',\n", " u'Lucida Grande',\n", " u'Verdana',\n", " u'Geneva',\n", " u'Lucid',\n", " u'Arial',\n", " u'Helvetica',\n", " u'Avant Garde',\n", " u'sans-serif'],\n", " u'font.serif': [u'DejaVu Serif',\n", " u'Bitstream Vera Serif',\n", " u'Computer Modern Roman',\n", " u'New Century Schoolbook',\n", " u'Century Schoolbook L',\n", " u'Utopia',\n", " u'ITC Bookman',\n", " u'Bookman',\n", " u'Nimbus Roman No9 L',\n", " u'Times New Roman',\n", " u'Times',\n", " u'Palatino',\n", " u'Charter',\n", " u'serif'],\n", " u'font.size': 10.0,\n", " u'font.stretch': u'normal',\n", " u'font.style': u'normal',\n", " u'font.variant': u'normal',\n", " u'font.weight': u'normal',\n", " u'grid.alpha': 1.0,\n", " u'grid.color': u'#b0b0b0',\n", " u'grid.linestyle': u'-',\n", " u'grid.linewidth': 0.8,\n", " u'hatch.color': u'k',\n", " u'hatch.linewidth': 1.0,\n", " u'hist.bins': 10,\n", " u'image.aspect': u'equal',\n", " u'image.cmap': u'viridis',\n", " u'image.composite_image': True,\n", " u'image.interpolation': u'nearest',\n", " u'image.lut': 256,\n", " u'image.origin': u'upper',\n", " u'image.resample': True,\n", " u'interactive': True,\n", " u'keymap.all_axes': [u'a'],\n", " u'keymap.back': [u'left', u'c', u'backspace'],\n", " u'keymap.forward': [u'right', u'v'],\n", " u'keymap.fullscreen': [u'f', u'ctrl+f'],\n", " u'keymap.grid': [u'g'],\n", " u'keymap.home': [u'h', u'r', u'home'],\n", " u'keymap.pan': [u'p'],\n", " u'keymap.quit': [u'ctrl+w', u'cmd+w'],\n", " u'keymap.save': [u's', u'ctrl+s'],\n", " u'keymap.xscale': [u'k', u'L'],\n", " u'keymap.yscale': [u'l'],\n", " u'keymap.zoom': [u'o'],\n", " u'legend.borderaxespad': 0.5,\n", " u'legend.borderpad': 0.4,\n", " u'legend.columnspacing': 2.0,\n", " u'legend.edgecolor': u'0.8',\n", " u'legend.facecolor': u'inherit',\n", " u'legend.fancybox': True,\n", " u'legend.fontsize': u'medium',\n", " u'legend.framealpha': 0.8,\n", " u'legend.frameon': True,\n", " u'legend.handleheight': 0.7,\n", " u'legend.handlelength': 2.0,\n", " u'legend.handletextpad': 0.8,\n", " u'legend.labelspacing': 0.5,\n", " u'legend.loc': u'best',\n", " u'legend.markerscale': 1.0,\n", " u'legend.numpoints': 1,\n", " u'legend.scatterpoints': 1,\n", " u'legend.shadow': False,\n", " u'lines.antialiased': True,\n", " u'lines.color': u'C0',\n", " u'lines.dash_capstyle': u'butt',\n", " u'lines.dash_joinstyle': u'round',\n", " u'lines.dashdot_pattern': [4.8, 1.2, 0.8, 1.2],\n", " u'lines.dashed_pattern': [2.8, 1.2],\n", " u'lines.dotted_pattern': [1.1, 1.1],\n", " u'lines.linestyle': u'-',\n", " u'lines.linewidth': 1.5,\n", " u'lines.marker': u'None',\n", " u'lines.markeredgewidth': 1.0,\n", " u'lines.markersize': 6.0,\n", " u'lines.scale_dashes': True,\n", " u'lines.solid_capstyle': u'projecting',\n", " u'lines.solid_joinstyle': u'round',\n", " u'markers.fillstyle': u'full',\n", " u'mathtext.bf': u'sans:bold',\n", " u'mathtext.cal': u'cursive',\n", " u'mathtext.default': u'it',\n", " u'mathtext.fallback_to_cm': True,\n", " u'mathtext.fontset': u'dejavusans',\n", " u'mathtext.it': u'sans:italic',\n", " u'mathtext.rm': u'sans',\n", " u'mathtext.sf': u'sans',\n", " u'mathtext.tt': u'monospace',\n", " u'nbagg.transparent': True,\n", " u'patch.antialiased': True,\n", " u'patch.edgecolor': u'k',\n", " u'patch.facecolor': u'C0',\n", " u'patch.force_edgecolor': False,\n", " u'patch.linewidth': 1.0,\n", " u'path.effects': [],\n", " u'path.simplify': True,\n", " u'path.simplify_threshold': 0.1111111111111111,\n", " u'path.sketch': None,\n", " u'path.snap': True,\n", " u'pdf.compression': 6,\n", " u'pdf.fonttype': 3,\n", " u'pdf.inheritcolor': False,\n", " u'pdf.use14corefonts': False,\n", " u'pgf.debug': False,\n", " u'pgf.preamble': [],\n", " u'pgf.rcfonts': True,\n", " u'pgf.texsystem': u'xelatex',\n", " u'plugins.directory': u'.matplotlib_plugins',\n", " u'polaraxes.grid': True,\n", " u'ps.distiller.res': 6000,\n", " u'ps.fonttype': 3,\n", " u'ps.papersize': u'letter',\n", " u'ps.useafm': False,\n", " u'ps.usedistiller': False,\n", " u'savefig.bbox': None,\n", " u'savefig.directory': u'~',\n", " u'savefig.dpi': u'figure',\n", " u'savefig.edgecolor': u'w',\n", " u'savefig.facecolor': u'w',\n", " u'savefig.format': u'png',\n", " u'savefig.frameon': True,\n", " u'savefig.jpeg_quality': 95,\n", " u'savefig.orientation': u'portrait',\n", " u'savefig.pad_inches': 0.1,\n", " u'savefig.transparent': False,\n", " u'scatter.marker': u'o',\n", " u'svg.fonttype': u'path',\n", " u'svg.hashsalt': None,\n", " u'svg.image_inline': True,\n", " u'text.antialiased': True,\n", " u'text.color': u'k',\n", " u'text.dvipnghack': None,\n", " u'text.hinting': u'auto',\n", " u'text.hinting_factor': 8,\n", " u'text.latex.preamble': [],\n", " u'text.latex.preview': False,\n", " u'text.latex.unicode': False,\n", " u'text.usetex': False,\n", " u'timezone': u'UTC',\n", " u'tk.window_focus': False,\n", " u'toolbar': u'toolbar2',\n", " u'verbose.fileo': u'sys.stdout',\n", " u'verbose.level': u'silent',\n", " u'webagg.open_in_browser': True,\n", " u'webagg.port': 8988,\n", " u'webagg.port_retries': 50,\n", " u'xtick.bottom': True,\n", " u'xtick.color': u'k',\n", " u'xtick.direction': u'out',\n", " u'xtick.labelsize': u'medium',\n", " u'xtick.major.bottom': True,\n", " u'xtick.major.pad': 3.5,\n", " u'xtick.major.size': 3.5,\n", " u'xtick.major.top': True,\n", " u'xtick.major.width': 0.8,\n", " u'xtick.minor.bottom': True,\n", " u'xtick.minor.pad': 3.4,\n", " u'xtick.minor.size': 2.0,\n", " u'xtick.minor.top': True,\n", " u'xtick.minor.visible': False,\n", " u'xtick.minor.width': 0.6,\n", " u'xtick.top': False,\n", " u'ytick.color': u'k',\n", " u'ytick.direction': u'out',\n", " u'ytick.labelsize': u'medium',\n", " u'ytick.left': True,\n", " u'ytick.major.left': True,\n", " u'ytick.major.pad': 3.5,\n", " u'ytick.major.right': True,\n", " u'ytick.major.size': 3.5,\n", " u'ytick.major.width': 0.8,\n", " u'ytick.minor.left': True,\n", " u'ytick.minor.pad': 3.4,\n", " u'ytick.minor.right': True,\n", " u'ytick.minor.size': 2.0,\n", " u'ytick.minor.visible': False,\n", " u'ytick.minor.width': 0.6,\n", " u'ytick.right': False})" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import matplotlib as mpl\n", "\n", "print mpl.matplotlib_fname() # показывает откуда был загружен текуший файл matplotlibrc\n", "\n", "mpl.rcParams # показывает текущие настройки\n", "\n", "# mpl.rcParamsDefault # показывает значения параметров, которые хранятся в файле matplotlibrc\n", "\n", "# mpl.rcdefaults() сбрасывает значения на те, которые хранятся в файле matplotlibrc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 Текст на рисунке\n", "\n", "Одними из самых базовых графических команд являются команды, отображающие текст. Самой простой такой командой, не привязаной к какому-либо объекту вроде координатной оси или делений координатной оси, является команда `plt.text()`. \n", "\n", "В качестве входящих данных она принимает координаты положения будующей строки и сам текст в виде строки. По умолчанию координаты положения строки будут приурочены к области изменения данных. Можно задать положение текста в относительных координатах (см. пример ниже), когда вся область рисования изменяется по обеим координатным осям от 0 до 1 включительно. Таким образом, координата (0.5, 0.5) в относительных координатах означает центр области рисования. Текст можно выровнять с помощью параметров horizontalalignment и verticalalignment, а также заключать его в рамку с цветным фоном, передав параметр bbox. Bbox - это словарь, работающий со свойствами прямоугольника, то есть объектом Rectangle.\n", "\n", "Помимо метода text() существуют и другие методы отображения текста в pyplot. Ниже представлен список текстовых команд в pyplot, в квадратных скобках указан альтернативный синтаксис вызова аналогичных команд в ООП стиле. Подробнее об ООП стиле будет рассказано позже.\n", "\n", "+ `plt.xlabel()` - добавляет подпись оси абсции OX `[matplotlib.axes.Axes.set_xlabel()]`;\n", "\n", "+ `plt.ylabel()` - добавляет подпись оси ординат OY `[matplotlib.axes.Axes.set_ylabel()]`;\n", "\n", "+ `plt.title()` - добавляет заголовок для области рисования Axes `[matplotlib.axes.Axes.set_title()]`;\n", "\n", "+ `plt.figtext()` - добавляет текст на рисунок Figure `[matplotlib.figure.Figure.text()]`;\n", "\n", "+ `plt.suptitle()` - добавляет заголовок для рисунка Figure `[matplotlib.figure.Figure.suptitle()]`;\n", "\n", "+ `plt.annotate()` - добавляет примечание, которое состоит из текста и необязательной стрелки в указанную область на рисунке `[matplotlib.axes.Axes.annotate()]`\n", "\n", "Каждый текст на рисунке - это экземпляр либо исходного класса, либо дочернего класса для `matplotlib.text.Text`." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Text class: \n" ] }, { "ename": "WindowsError", "evalue": "[Error 3] : './pictures/png'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mWindowsError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgrid\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m---> 33\u001b[0;31m \u001b[0msave\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'pic_3_2'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfmt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'png'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 34\u001b[0m \u001b[0msave\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'pic_3_2'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfmt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'pdf'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36msave\u001b[0;34m(name, fmt)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0miPath\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'./pictures/{}'\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfmt\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexists\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0miPath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmkdir\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0miPath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mchdir\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0miPath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msavefig\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'{}.{}'\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfmt\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfmt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'png'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[0;31mWindowsError\u001b[0m: [Error 3] : './pictures/png'" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAD7CAYAAACYLnSTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8TecfwPHPyZIdYoQIEjEitgSxozYtbY1SWjooLWrV\nKFpaKq0O/EqtokZLW1pKzRJFjdiJJLLNhFgZQtZ9fn9cPXGbkMi4Nzd53q/Xfbn3nOec8z2P5HtP\nnvOc51GEEEiSJEnGzcTQAUiSJEkFJ5O5JElSCSCTuSRJUgkgk7kkSVIJIJO5JElSCSCTuSRJUgkg\nk7kkSVIJIJO5JElSCSCTuSRJUglgpq8DVahQQbi6uuZr2/v372NjY1O4ARkxWR9ZZF3okvWRpaTU\nxalTp24JISrmVk5vydzV1ZWTJ0/ma1t/f398fX0LNyAjJusji6wLXbI+spSUulAU5VJeyslmFkmS\npBJAJnNJkqQSQCZzSZKkEkAmc0mSpBJAJnNJkqQSQCZzSZKkEkAmc0mSpBJAb/3MJam4ysjUcCcl\njbiEh8QmPOTu/TQSHqRz70E6iQ/SSXj0SnyQTuLDDB6kZZKeqSEtU0NGpsBEATNTE8xMFMxMFcxM\nTDA3VTAzNcHc1AQ7SzPsLc2wtzTHwdqcSnaWVHYog5OdJZXsLansYImNhSmKohi6KiQjJpO5VKII\nIUh8mEFIbCJB1xK4cD2RsBtJRMXf50F6ZhEeuej2Xd7GAk9nezyr2OPpbE99Z3tcy9tgZir/sJay\nyGQuGZVMjSDiZjInYu4QEH2HwxdTuLNrR4H3W97GgsoOllS2t6SCbRkcrM2xtzTDwdoCB6tH763M\nsbcyx8rcFHNTEyxMTTAzVdAIQaZGkJ4pyNBor9bTMzVkagSpGRqSHmaQ9FB7VX8vJY2bSancSHz4\n6KV9n5L25C+D2/fTOBR+i0Pht556Dh6V7XCzSsPc5RberuUoY2Za4HqRjIdM5lKxFJvwgF1BcewM\niuNE9J1n2tbCzIQGzvY0qOpAA2cH6la2w7WCDfaWZkbXlCGE4GZSKsHXEwmOTST4eiIXricQczsl\nW9nQuCRCgZ0rj2dbV93Rmh4NKtOtQWWauJTFxMS46kHKnUzmkkFdv/eAbeeuszMwlnNXE/K0jWt5\na1q4OdLc1RFxM5z+PToaXZLOK0VRcLK3xMneko4elZ5YLj1TQ9C1BNbuCeByui2nLt3VWX/5TgrL\n/o5i2d9ROssbVLXn5aYu9GniTHnbMkVyDpJ+yGQu6U3EzWTWH7vEhuOXSM8UTy1rV8aMHg0r06Nh\nFVrVLI+lec5NBv7+kSU2kT8Lc1MTmlYvR0ItC3x9W+us02gEoXFJ7LoQx+6gOC7eSFLXBV1LJOha\nMJ9sD1aXOdpY8JpPDQa1qE5lB0u9nYNUMDKZS0Xizv00NgVcYe3RGGITHj6xnI2FKS81q0rPhlVo\n4eoob+oVARMTRXsD1dmeCV3qqMs1GsGx6NtsOX2NLaevonn0/XrnfhoL/wpn4V/hatn2dSoyskNN\nWtUsL788iymZzKUCE0Jw9so9lh6MZPeFG08sV97GgtdbuTKwRTWc7OUVn6GZmCi0dq9Aa/cKfNm/\nsbo84mYS649dZt2xS2Q+yvB/h8Xzd1i8WqZGeWvGd67DC42dMZXt78WCTOZSvgRfT+SrPRf5K/Tm\nE8sMalGN13xc8XS212NkUkHVqmTHrN71mdW7PqBtj//j3HWWHYxSm2gu3U5h3KazjNt0FoDG1cry\n0fOeeNUoZ7C4SzuZzKU8uXInhf/tD+fnk1dzXO9SzopRvu70bebyxPZtyTiZm5rwcjMXXm7mAmj/\nEjt56S5f7wnjaNRtAM5duUff7/5Rt3mvozujfGthW0amGH2RNS3lKCNTw8aAK8zadoEMTfablWWt\nzfmgW136e1XDwky2c5cmiqLQ3NWRn0b4ANq29x2Bscz+I5hbyakALD4QyeIDkQC0dHNk7ksNqVXJ\n1mAxlwYymUuqhAfpfL4rlB+PX85x/YQudXijjSt2luZ6jkwqzkxMFF5o7MwLjZ0BuJn0kK/3hLEx\n4AoAx6Pv0Pnrg4D2waZFg5pSx8nOYPGWVDKZl3JX7qQwc2sQ/hfjs61rX6ciM3rVk7940jOpZGeJ\nX99G+PVthEYj2BhwhQ9/CwS0DzZ1/eZvABq7OPD1K01wryiv2AuDTOalUPiNJMZuPEtIbGK2dW+1\ndWN8lzqyrVMqFCYmCq+2rM6rLasjhGDbueu8v1F70/Tc1QQ6faW9Yu9W34kv+jbGwVr+1Zdf8je2\nlLh27wHjNp4hIOZutnUzn/dkaKsaso+3VKQURaFPk6r0aVIVIQS/nLzK5M3nAdh94Qa7L+wB4Iu+\njRjQvJohQzVKMpmXYGkZGvx2hrLqSHS2dV8PaMxLTavKB0Akg1AUhQHNqzGgeTXSMzUs2Bem3jCd\nvPk8kzefp3G1sqx4zYtK8pmEPJHJvAT6MzCWdzeczrZ8du/6vOZTQw6yJBUr5qYmfNDNgw+6eXDl\nTgpDV50g6tZ9zl25R4vP/gLgf4OaqjdYpZzJZF5CxCU85M01AQT/px28TxNn5rzYQPZAkYxCNUdr\n9k/yRQjB94ejmbMjBIAxP51hzE9neM2nBrN615dPneZAJnMjJoRgU8AVpm4J1FnuUs6K74c2p25l\n2QtFMk6KovB2u5q83a4mkfHJvLj4CEkPM1h37BLrjl2iXe0KrHjdWz6g9hiZzI1QukYw+sfTbD8f\nq7N81gueDG3tKtvBpRLFvaItgbO68SAtkxHrTqoTdXjM3EV1R2u2vNuaCnL4XpnMjcnl2ym8tOQI\nt++nAdrJCaqWtWLjCB+qOVobNjhJKmJWFqase6slmRrBx9uCWH/sMpfvpOA9Zx8VbC3YPa59qR6T\nPV/JXFEUc2AV4AqUAeYIIbYVYlzSY/YG32D42pM6y/p7uTD3pYbyUXqp1DE1UZjzYkM+7dOAZX9H\n4bczlFvJaXjN2Yd7RRv+GNMWa4vSd52a3zMeAtwWQrymKIojcBaQybyQrTt2iZm/B+ks+3pAYxwT\nI/D1bfyErSSpdFAUhZEd3BnZwZ1lByOZtzOUyPj7eH60mx4NKtO/6tMnQClp8pvMfwF+ffReATIK\nJxxJCMF3ByP5YtdFneW7x7VXb2j6+0cYIjRJKrbe6eDOiPY1+XjbBdYevcTOoDh2BsG4zDDGda6T\n+w5KAEWI/H97KYpih/aKfIUQ4scc1o8ARgA4OTl5bdy4MV/HSU5Oxta25I/fsDsmnZ9C09TP9hYw\nu7UV5Sx1m1JKS33khawLXbI+IEMj+OrkQ0LuaNRl01pYUtfROHu+dOzY8ZQQwju3cvlO5oqiVAN+\nA5YIIVblVt7b21ucPHkyt2I58vf3x9fXN1/bGoO1R2P4aOsF9XMluzLsGtceRxuLHMuX9Pp4FrIu\ndMn6yLJ9zwHG+T9Qh3CuYGvB4SnPGV13RkVR8pTM83sD1AnYA4wWQvyVn31I8Oupq0z65Zz6uay1\nOXvHd6CiXem9Iy9JhcXWQiHis54ExNyh/9Kj3EpOw2PmLj7tU5/XWrkaOrxCl9+uEB8C5YCZiqL4\nP3pZFWJcJVpAzB1cp+5QE7m1hSnHP+zE2Y+6ykQuSYWsuasj0fN68mIT7XAAM7dewHXqDnUijZIi\nX1fmQoj3gfcLOZYS72bSQ1rM1f1D5tDkjrKPuCQVMUVRWDCwKZO7e9Dabz8A3nP2MaW7B6N83Q0c\nXeGQnZT1QKMRvP1DgE4i/2VkK2L8eslELkl65FzWihi/Xkzoou3h8vmuUFyn7iA1I9PAkRWcTOZF\nbPOpq9T88E/2hWhnsZ/Rqx4xfr1o7upo4MiezbBhw1AU5YmvNWvWFGj/iYmJ/PDDDzmuy8jIQFEU\n/P39C3SMnMyYMaNIbhg+a8ynT5/myJEjhR6HPlSuXJn169cbOoxnMrZTbU582En9XHfGLk5fzj7W\nvzGRybyIxNy6j+vUHUx81C7e2MWB8Lk9eLtdTQNHlj8LFy4kNjaW2NhYfv75ZwD1c2xsLK+88kqB\n9j9//nxWr16d4zozMzNiY2Np3bp1gY5RnPXp04fw8HBDh1GqVLK3JHpeT9rVrgDAy0v+YdqW8waO\nKv9K3zOvRUwIwfC1J9UrcYC/P+hI9fLG3Zzi4OCAg4MDAOXKlQO0V2SFJbcusoV5rOKoIM97SPmn\nKArr3mrJgdCbvLEmgJ9OXOGnE1cIn9sDcyObecu4oi3mTkTfwW1aVpPKV/0bE+PXy+gT+bPYvHkz\nnp6eWFtb4+Xlxd69ewG4ceMGjo6OzJ49Wy3btWtXunbtysqVK5k7dy4HDx7EzCz79cV/myxcXFxY\nsmQJPj4+dO3alSZNmnDq1KknxrRt2zaaNm2KpaUlZcuWZdCgQSQnJ6vr09PTeeutt7C2tsbd3V39\nywPg7NmztG3bFhsbG6pUqcIHH3xAZqa2fTUzM5PPP/+cmjVrYmVlRceOHQkMDMx2/H9jfrwpat++\nferolm3btuXatWu88cYbvP322wAEBgbSsWNHrKysqF27Nt98881TE/6CBQtwc3OjR48edOrUibCw\nMHXd999/j4eHB1ZWVnh7e/P333+r6x48eMAHH3yAi4sLNjY29O7dmytXrgAQERGBoih8+umnlCtX\njhEjRgCwZMkSXFxcKFu2LPPnz9eJ42n1VZx19KjEuY+7qp9rT99pfL1dhBB6eXl5eYn8OnDgQL63\n1QeNRiP6f/ePqDFlu6gxZbto9/l+kZqeWWTHM3R97N27V2h/dHSdPHlS2NnZifXr14vw8HCxePFi\nYWlpKQIDA4UQQqxcuVJYWVmJ6OhosWbNGmFnZycuXbokUlJSxLhx40SrVq1EXFxctv2mp6cLQD3v\nqlWrikqVKomtW7eKH374QbRp00a0bt06x1jDw8OFhYWFWLlypYiOjha7du0Sjo6O4quvvhJCCDF9\n+nQBiBEjRoiQkBDh5+cnTE1NRXh4uBBCCE9PTzFy5EgRFRUlDhw4IMqXLy9Wrlypbuvk5CS2bdsm\ngoODxZAhQ4Szs7NITk7OMebVq1fnWIe3b98WVapUEQsWLBAJCQkiOTlZVKlSRcyYMUOEhYWJ7du3\nC2dnZ7FkyZIcz3Hp0qXC3t5ebNy4Uaxbt04MGjRI1KtXTwghxIoVK4Stra1Yt26dCA0NFZMmTRI2\nNjbi6tWrQgghBg8eLOrUqSMOHDggzp07J7p06SKaNm0qMjMzRXh4uABEt27dREREhLh48aLYvn27\nsLS0FOvXrxdBQUGiV69eAhDr1q3Ltb70LT+/JxqNRnT4Yr/6uxx49V7hB/aMgJMiDzlWJvMCCr6e\noP7H15iyXRyJiC/yYxq6Pp6UzAcOHCgmTJigs2zIkCFixIgRQgjtL4qvr6/o3r27cHR0FEuXLlXL\nTZ8+XXTo0CHH4+WUGCdPniyE0NbF5s2bhbm5eY7bhoaGimXLluks69evn3jzzTfV41atWlWkpaWp\n69u2bSumTJkihBDC2tpazJgxQ2Rmar+cT548KWJiYkRmZqZwcHAQy5cvV7dLTU0Vzs7OYunSpc+U\nzP+7funSpaJZs2Y6Ma9cuVLUqVMnx3Ns0qSJ+Pjjj9X6uH37tpg4caJITEwUDRs2FB9++KFOeW9v\nbzF16lQRHx8vFEURe/bsUdfFx8cLS0tLsWvXLjWZ79y5U13/4osvirfeekv9fOPGDWFubq4m8yfV\nlyEU5Pdk2pbz6u/0b6evFl5Q+ZDXZC6bWfJJCMH7G8/QY+EhAJwdLImY24PW7hUMHJnhhISE8O23\n32Jra6u+Nm3apP7JrygKy5cvZ9++fXh4ePDOO+/k+1ju7ll9g+3t7UlPT8+xXN26denWrRtz585l\n0KBBNGzYkC1btuj86d+kSRPMzbOm1WvWrBkhIdrpymbOnMncuXNxcnLi9ddf5+bNm9SoUYPY2FgS\nEhJo2bKlup2FhQVeXl7qtvkVEhLCuXPndOpx9OjRREVFkZGRfUy74OBgvLy81M+Ojo58+eWX2NnZ\nERoaqhMjQKtWrQgJCeHixYsIIXTWV6hQgdq1a+ucg6urq86xGjfOGrGzUqVKVK9eXf38pPoyNp+9\n1JAv+jYCYNymsyw9GGngiHInk3k+xCY8wG3an2w9ex2A7wY3459pnTAzshsmhS0jI4MpU6Zw9uxZ\n9RUcHMy6devUMsHBwQghCA4OJi4uLt/HsrDIedya/zp9+jSenp4EBwfTvn17Vq9eTf/+/XXKmJjo\n/r9pNBp1/1OnTiU6OpqZM2cSFxfH888/z5w5c7CyyvmB58zMzBzbiP87+1NOSfnxdZ06ddKpx8DA\nQEJCQjA1zT6uyNPqwtIy+8z2/8aY13P47z7Ef9ruH/8ifFJ9GaMBzavx8zutAPDbGcqXuy/msoVh\nle7skw8/nbhMq3n71c8hn3SnR8MqBoyo+Khbty7R0dHUqlVLfa1Zs4atW7cCkJSUxOjRo/nss89o\n1KgRY8aMUbctqqnu1q5di6+vLxs2bGDUqFF4e3sTFhamk5CCgnTHjD9x4gT16tUjJSWFsWPHYm5u\nztixY9mzZw8zZ85k06ZNODo6UrFiRY4fP65ul5qaypkzZ6hbt262OCwsLEhKSlI/R0VF6ax//Pzr\n1q1LWFgYbm5uaj2eOnWK+fPn51hPtWvX5syZM+rnxMREKlWqREhICB4eHjoxAhw7doy6detSq1Yt\nTE1NddbHx8cTGRmZ4zkANGjQgICAAPXz3bt3iYmJAXhqfRmrFm6O7BrXDoBvD0Sw6K/i231UJvM8\nEkLw3Ff+THs0efKU7h7E+PXCysK4RmArShMmTGDjxo0sXLiQyMhIlixZgp+fH7Vq1QJg2rRp2NnZ\nMX78eBYvXszvv//Otm3aOU1sbW25fv26mhgKS/ny5Tl//jwnTpwgLCyMcePGcebMGVJTs3oqXLp0\nibFjxxISEsKsWbMICgpi1KhRWFtbc/DgQUaPHk1ISAjnz59n9+7dapPGxIkTmTlzJtu3byckJITh\nw4eTnp7OwIEDs8XRvHlzVq1axYULF/D392fBggU6621tbQkNDeXOnTu8/vrrJCcnM2LECEJDQ9m9\nezejR4+mQoWcm/Def/99vvnmG3777TeuXLnCqFGjqFy5Mh4eHkycOJFFixaxfv16wsLCmDx5MsHB\nwbz99tvY29szfPhwRo8ezcGDBzl//jxDhgzB1dWVLl265His9957j02bNrFixQr1nNPStMM251Zf\nxsqjsr2a0L/eG1Z8m1zy0rBeGC9jvgF6736azk3OqPhkg8Zj6Pp40g1QIYTYsGGD8PDwEBYWFqJu\n3bpi/fr1Qgghjh49KkxMTMT+/fvVshMmTBAuLi4iISFBRERECHd3d2FlZSVu3bqls8+n3Uw8cODA\nU+NJTEwUffv2Fba2tqJixYqiX79+YubMmerNxOnTp4s+ffqIgQMHCktLS1GvXj2xb98+dfuLFy+K\nrl27Cnt7e+Hg4CBee+01cffuXSGEEBkZGWqPFisrK9G5c2cRFBSUY8yRkZGiXbt2wsLCQjRq1Ehs\n2rRJJ+bFixcLGxsb0b9/fyGE9sZh+/btRZkyZUSVKlXE1KlTRUZGRo7nqNFoxGeffSacnZ2FpaWl\n6N69u4iKilLXL1y4UNSoUUOUKVNG+Pj4iEOHDqnr7t+/L0aNGiUcHR2Fra2tePnll8WVK1eEEEK9\nARodHa1zvLVr1wpXV1dhY2MjJk2aJOrXr6/eAH1afelbYf+eBF69p+aATQGXC3XfT0Meb4AWaHKK\nZ2Gs45mfjLlDv6VHATAzUQj9tLvB28blmNVZZF3okvWRpSjq4szlu7y05B8ANo7wwadm+ULdf07y\nOp65bGZ5igX7wtREPqhFdSI+62nwRC5JkuE0rV6O7wY3A2Dg8mPF6sEimZlyIITguS/9WbBPe7Nj\nxevezHu5oYGjkiSpOOjRsApvtnEDtMPoZmqKx1AMMpn/R1qGBrdpfxJ16z4A/0x9ji6eTgaOSpKk\n4uSjFzypYKudSKbx7D0GjkZLJvPH3LmfRp0ZO9XP4XN74FxWTqAkSVJ2AdO1Q+gmp2bwnb/he7jI\nZP7I9XsPaPapdlAotwo2xPj1MrpR0yRJ0h9FUTg67TlAO8lFfJJh289ltgIi45PVqaS61XfiwCRf\nwwYkSZJRqOJgxQfdtA9YNZ+7z6CxlPpkfv7qPTp9dRCAIT7VWfZarj2AJEmSVO91rKW+X+IfYbA4\nSnUy/yfiFr2/1U7VNbZTbea8KHusSJL07AKmdwbgi10XDTafaKlN5v9E3uLVldoxKWa94KlO8CpJ\nkvSsKtqVoU8TZwD6fvePQWIolcn81KU7vLpCm8jn92vEsEd9RiVJkvJrwStNAAi6lkjSw5yHZC5K\npS6Zh99Iou932qc6P32xAf29qxk4IkmSSgJFURjlqx1nv8/iI3o/fqlK5nfup9HlG+38h1N7ePCa\nj/ENmi9JUvE1+VHPlqj4+zxI02/bealJ5qkZmWo/8pebVWVkB/dctpAkSXo2iqIwuKV25qX3N57J\npXThKhXJXAhB3Rm7AKhdyZavBzQxcESSJJVUs3vXB2BP8A29HrdUJPOGs7LGTtg7oYMBI5EkqaR7\nfGTVc1fu6e24JT6ZT/z5HMmp2vkWIz/raeBoJEkqDVYN0z58OGJd/uZwyI8Sncz/DIxl8+mrAJz7\nuCumJkUzz6QkSdLjnvPQjrR6I1F/47UUKJkritJSURT/QoqlUN1KTuXdDacB2PJuaxyszHPZQpIk\nqfAlPNBPn/N8J3NFUSYDKwHLwgun8HjP0Q56M7pjLZpVL2fgaCRJKm36e7kAsOH4Jb0cryBX5pHA\ny4UVSGF6d8Mp9f2kR/0+JUmS9GlE+5oArPg7Si/HK9CEzoqiuAIbhRA+T1g/AhgB4OTk5LVx48Z8\nHSc5ORlbW9s8lb14J5N5Jx4CsLyLNRamJa+d/Fnqo6STdaFL1keW4lAXw3ZpZyxb090m3/vo2LFj\nniZ0Nsv3EfJACLEcWA7g7e0t8jtTdl5n2X6Ynsmwmdr+5BvebkmbWhXydbziTs7AnkXWhS5ZH1mK\nRV3s2gGglzhKVG+Wdl8cAKBj3YolNpFLkiTlpMQkc/+LN9Vpm1YNa27gaCRJkvSrQMlcCBHzpPZy\nfRJCMGx1AABb32uDopS8dnJJkoxXpib/9ybzqkRcmU/bEgiAa3lrGlcra+BoJEmSdOnj8tLok/n9\n1Aw2BlwBYOf77Q0cjSRJUnYmenj63OiTeccv/QF4s40bVhamhg1GkiTJQIq0a2JRuxiXxM1HNz1n\nPl/PwNFIUu4WzP+Se7dvF9n+4+Li8N+1u8j2b0yKui7Kli/PuA8mFdn+n5VRJ/NuC7SzBi0d4iVv\nekpG4d7t28waObrI9h8TcwlXVzmDFhR9Xcxa+m2R7Ts/jLaZ5fzVrHGCuzeobMBIJEmSsruRqH0S\nvYyZftKs0Sbz3t9qJ0xd91YLA0ciSZKU3fpj2gG2Xmmun0njjTKZxyY8UN+3q13RgJFIUsEMmzQe\nxc3lia81v/5coP0nJiXxw+ZfChynSytvNZb/7vPxdbnZd/gQiptLgeN5mqmff0bnIQOL9Bh58b/9\nEUDWgFtFzSjbzF9dcRyAT/vUN3AkklQwCz+ajd+UaQAcOnGCAaNHEnvitLrewc6uQPufv3wphwKO\nM7Rv/wLt58z23djaWBfqPkuyxwcwdClnrZdjGl0yz8jUEH1LOxLZEB95o0cybg729jhgD0A5BwcA\nKlesVGj7L8ioqI+rWL58oe+zJNsZFAdAjfL6SeRghM0sc3aEANC5npPswSKVGpt37sCzS0es69XC\n64Ue7D2k7cl1Iz4exyb1mb3wa7Vs19depetrr7Jy44/MXbyIg8ePYVYr+4XP828NZdLcT9XPoz+a\nToVmDdVkfeLsGewbepCenq42pTxpnxfCLtK6bx8s67rTtFc3zgZfeOr5LFr9PRWaNaRCs4bM+PIL\nnS+IbXv30LRXN6w83PHs0pEtu/5U17Xt/xJjPp5BzfatcWnlzd2EewSGhtCm34tYebjT7fXB3E1I\n0DnWwWNH8e7dEysPdxp068SG37eo64aMG8OwSeNp3KMLFb0aERwexqbt26jX2RfLuu7U6dguX81U\n/85ytnSI1zNvm19Gl8zX/BMDwMKBTQwbiCTpyanA87wxeSLT3xvD+Z17eWvAQHoPf4Ogi6E4VazI\n/Gkz+HzpEmKuXmHzrj85dvY0K/3mM/jFlxj35tu0aubFtaPZJxbu1q4D/sePqp8PnjjGnXv3uBgV\nCcDew4fo1LoN5uZZUy4+aZ8rN21kyjvvcu7PPTjY2TFy+tSnntNPf2xl3/qNrPSbz//WrlYT5p6/\nD9LvvXd4o98Azv25lzf7v8IrY97lVOB5ddvVv/7M+m8WsXX5KqwsLen11lBqu7pxZsduXujUme9/\nzpo34VpcLM+/PYxhffsTtPsvpr83hnc/ms5O//1qmXW/bebTCR/w56q1lHNwYMj4sXwwYiQX/zrI\nlJHv8ubkiYRH532Ciev3su7p1atin+ftCsqomlmCryeq723KGFXokpRvX65YxvBXXmXwi9qJvWq5\nunH09Cn+98Nqln32OW8OGMj637cwasY0jp05zfxpM6hetSoANlbWWJib41Qxe0eBbu19GT9nNgmJ\niWRkZnLp2jXaNW/BkZMBeLjXYu/hv3m194s621hZWuW4z1FDXqNP124AjBn6BkPGj33qOa364ivq\n1apNE8/6jB0ayNIN6xjWbwDfrl1D/569GPvGWwBMGjGSY2dO8+WKZfy0aDEAzz/XmdZe2rkatu7Z\nTUJSEks+/QxrKys83Gux78hhklO0TbHfrl1D13btGT30DQDca7gSHB7OglXf08P3OQCaN2pM7y5d\nAQg4d5aMjAxcKlehhosLb70yCFeXajrNTLnptegQAHNebJDnbQqDUV2Zv7NeeyWwZHAzA0ciSfoT\nEhHOt+vWYFu/jvratOMPwh5dLSqKwvLPPmffkcO4V6vBO68OydN+69SsSbUqzhwKOMHfJ47h06QZ\nbb1bcPiMsdbLAAAgAElEQVRkAPdTUjh65jTdO3TM077cq2c1uTjY2fMw9cmz0ttYW1OvVm31c7MG\nDQiJ1Pb8CIkMp2XjpjrlW3t5ExIRrn52dcnqDRMcEU6tGq5YW1mpy7wbNlLfh0RE8Mdf+3Tqbv7y\npWrdafeX1XXQq2Ejej3XiW5DB1O7Y1smzJlNpfLlKWvvkKd6iLl1n7sp2gmc9X1Pz6gub6/c0f75\n0kM+JCSVIhmZmUx5ZxSvv9xPZ7llmTLq++DwcIQQhF+KIS7+Zp5vonZr3wH/Y0fJyMygXfMWNG/c\nmLGzPuLg8aPUquGqXuHnxtQ07+MimZjoXkNqNBosHjXlWJXJPj98ZmYmmZpM9fPj5w3Zb8iam2el\ntYzMDIa8+DIfvqv71O3j8T6+PxMTE7Z//wMnz5/jj7/2sm3fXhav+4E/V62lU5u2uZ6b76Oxoha8\nov9mYKO5Mr98O0V9L298SqVJ3Zo1ib5yhVqubuprza+/sHXvHgCSkpMZPWsGn02agkdNd8Z8PFPd\nNrfflW7tO3Dg2D8cCjhBuxYtaN3Mm6grl1n32xa6t/fNcZuC/v4lJSdz6epV9fOJc2ep5669Uvdw\nr8Xxc2d0yh89c4q6bu457qtBnbqERUeRkJjVBHvmQtbN17pu7oRHR+vU3Z8H9rP6l0057i84PIxJ\ncz/Fu1FjZo+fxJkdu2nVtBm/79mV63mtPRqjvn+xad6+BAuT0STzuX8GAzCjlxxQSypdJrw1go3b\nt7Fw9UoiL8WwZN0P+C1dTK0argBM+2Iedja2jH9rOJ+Mm8jve3ez7VGit7Wx5vqNG8RcvZLjvju1\nbktQ2EVCIsJp2aQp9nZ2NK7nyabt2+jhm3MTS277zI2JiQlDJ43jbPAFft7+B4vX/cDEt0doz/Xt\n4fy8Yzv/W7OK8OgovlqxjG379vLe60Nz3Fe39h1wruTEW1MmERIRzsqNP/LbY4n3vdeHcuL8WWZ8\n+QXh0VFs2r6NqV/Mo1oV5xz3V9beniXrf2DO/xYSfeUy+/85QlDYRbwea7rJyc2kh3y0VfslcmTq\nc/mplgIzmmS++8INAF5v5WrYQCRJz9p4N+eHL79h6Yb1eHZ9jkVrVvHDl9/QrYMvx86c4rsN61j8\nyRzMzc2p61aTsUPf5L2Pp5OYlES/Hr3QCA2eXTpy++7dbPu2t7OjRaMmNPGsj5Wltt25fYuWWFtZ\n0a55zkNl5LbP3FR0LE/3Dr74DuzP2NkfMWfiZPXmqU9TL9Z9vZDF636gQffOrN3yK78uWUbHVm1y\n3JeFhQU716zjTsI9mj3fnVW/bGLU4NfU9TWr12D7yjXsPHiABt07M8XvM+ZOmsLwQYNz3J+zU2U2\nf7ecXx91BX1twljGDnvzqQ9ICSFoMfcvAN7vVJuqZa2eWLYoKfp6AMDb21ucPJm9e1Re7N1/gOF7\ntM0sMX69CjMso1QsZh0vJoytLmZNnSZHTdQTfYyaOMtvHh3mH+DS7RRMFIiaV/j5SVGUU0II79zK\nGcWVeUCc9uZH21oVDByJJElSljE/neHSo/t5YXN6GDQWo+jNsjtG29XnnQ76GbBGkiQpN+eu3OMM\n1wE4M7MLZqaGvTY2iivzS4kaANq4yytzSZIMb2/wDcJvJgNw8ANfytlYGDgiI7ky/5c+JkWVJEl6\nmp9PXlUf2T8wyZca5W0MHJFWsU/mcoQ2SZKKg4xMwbcHItTPvRpVwa1C8UjkYATNLEHXtA8DuFcs\nPpUmSVLpEpfwUCeRj+5YCyvzvD/1qg/F/sp8b7B2XOCu9eUj/JLxK1u+fJFOBBwXF0flyvJ3BQqn\nLoSAIxG3iHs0n6eTvSXtaldgTsRuyj7D4Ft6IYTQy8vLy0vkR/cFf4saU7aLkzF38rX90KFDBfDE\n1+rVq/O1338lJCSINWvW5LguPT1dAOLAgQMFOsZ/PWl/VatWzfP5REREiD///FMIIUR4eLgARHR0\ndOEEqEdPq9tXXnlFvPXWW/oLphgo7J81Y1bQujgcHi9qTNmuvvaH3CicwJ4RcFLkIccW+yvzkFht\nM0t95/yNC7xw4UL8/PwAOHToEAMGDCA2NlZd7+CQt9HQnmT+/PkcOnSIoUOzP25sZmZGbGwsjo6O\nBTpGURg2bBidOnWiR48euLm5ERsbS8UchkmVpNLm+r0HtPbLGu+8sr0lf0/uiIVZ8W6VLvbJ/F+W\n+WyfcnBwUBN2uXLlAAr1z1CRyw3a4von7+Nxm5qaFts4JUlfrtxJodNXB0nL1KjLtr7XhsbVyhow\nqrwr3l81erR582Y8PT2xtrbGy8uLvXv3AnDjxg0cHR2ZPXu2WrZr16507dqVlStXMnfuXA4ePIiZ\nWfbvxYyMDBRFwd/fHwAXFxeWLFmCj48PlpaWNGnShFOnTuUYz759+3B1dWXUqFE4ODjw6afa6b2W\nLl3KoEGDsLW1pX379k/cPjExkTfffJNKlSphYWGBh4cHv//+OwBDhgzhyJEjzJ49m86dOxMREYGi\nKMTExDBp0iQ6dOigs6+5c+fi4+MDwN27d3nttddwcHCgSpUqjBw5kuTk5CfW6549e/Dy8sLa2poG\nDRrw559ZU4AdOXKENm3aYGNjg5ubG0uXLtXZ9vvvv8fDwwMrKyu8vb35+++/1XUuLi5MmTKFvn37\n0rBhQzIzMzl48CCNGzfGysqKwYMHk/rYmNr37t2jf//+lCtXDnt7e/r168eNGzeeGLdUeuy5EIfr\n1B20++KAmsi/6NuIGL9eRpPIgfy1maP9ElgKHAX8gVq5bZPfNvN/26sKw969e4X2lHWdPHlS2NnZ\nifXr14vw8HCxePFiYWlpKQIDA4UQQqxcuVJYWVmJ6OhosWbNGmFnZycuXbokUlJSxLhx40SrVq1E\nXFxctv3+t828atWqolKlSmLr1q0iNDRUtGnTRrRu3fqpsQ4bNkyEh4eLmJgYsWXLFlG5cmUxd+5c\nERYWJmbPni3s7e3VYz/eZj506FDRtm1bcfbsWREWFibeeOMNUb58eZGamiru3bsnWrRoISZOnCju\n3Lmj02Z+8uRJYWJiIm7cyGofbNy4sfjmm2+EEEL07t1bvPDCC+L8+fMiICBAtG3bVgwYMCDHcwgK\nChJmZmbi008/FWFhYeKrr74SlpaWIiYmRgQGBooyZcqIGTNmiNDQULFq1SphaWkptmzZIoQQYsWK\nFcLW1lasW7dOhIaGikmTJgkbGxtx9epV9VyrVq0qvv/+e3H27FkRFxcnbG1txdSpU0VoaKiYMWOG\nANQ283fffVe0atVKBAYGiqCgIOHj4yOGDBny1J8XYyTbzLM8rS5OX7ojunztr9MmXmPKdvFzwGX9\nBZhH5LHNPL/J/GVgzaP3PsDW3LYpzsl84MCBYsKECTrLhgwZIkaMGCGEEEKj0QhfX1/RvXt34ejo\nKJYuXaqWmz59uujQoUOOx8spmU+ePFldv3nzZmFubv7UWENCQtRlPj4+YtGiRTo/pG3bthWfffaZ\nuv9/k/n3338vgoKC1HJBQUECEJcva39Y27RpIz7++GMhRPYboLVr1xbLli0TQggRFhYmTExMxLVr\n10RoaKgwMTER9+7dU/cbEREhAHHt2rVs5zBu3LhsdTN79mwRGBgoxowZk+2LbOLEicLHx0cIIUTD\nhg3Fhx9+qLPe29tbTJ06VT3XKVOmqHWxYMECUatWLaHRaNTyjRs3VpN5z549RZcuXURycrIQQojI\nyEhx+vTpbDEbO5nMszxeFxfjEsXsbReyJe8aU7aLpp/sESGxCYYLNBd5Teb5bTNvC+x6dGV/TFGU\nXEf0Ks5CQkLYsmULy5YtU5elpaXRpo122E1FUVi+fDmenp60aNGCd955J9/HcnfPGmTf3t6e9PT0\np5Z3dXXViXPy5MlA1kwpqamp1KpVK9t2w4YNY8uWLSxdupTQ0FC1OSYzMzNb2f8aOHAgW7ZsYcSI\nEfzyyy+0a9cOZ2dnfv/9dzQaDVVzmH0mPDwcZ2fdMaKDg4Px8tKdnfyjjz5Sz6Vly5Y661q3bs3K\nlSsBCA0NZc6cOTrrW7VqRUhIiPr58boJDg6mUaNGOhMneHtn/VhOmDCBF198kQoVKvDcc8/x0ksv\n8frrr+daF5JxWnU4mk923YddO3JcX8G2DJ/0qU+PBpVLzGQ3+U3m9kDCY58zFUUxE0JkPF5IUZQR\nwAgAJycnte04Pwqy7b/OnTuX474SEhJ45ZVX6Natm85yCwsLtezhw4fRaDScP3+eLVu2qD1ULl26\nxL1793KM79/EefbsWUCbeKOiotSyT4rn8XXHjh1Tl6WmpjJq1Cg8PDywscl6iMrKygp/f39SU1MJ\nDQ3F39+fTz75hNDQULp06UL79u3p3bs3Y8eO5dixY8TExJCQkEBMTAz+/v5cu3ZNPVZMTAw1a9Zk\n3rx5bN++ndWrV/PCCy/g7+/PuXPnsLGx0fnS+9eDBw+ynUdSUhJXrlzJ8fxSUlKyrTt//jxpaWn4\n+/tjbm5OYGAg9vZZvZguX77MzZs31XONiYnBxcUFf39/rl+/TkJCgs7+4uPjycjIwN/fH1NTU376\n6SeOHj3KsWPHGDt2LEuXLuXLL7/MFpsxS05OLpTfFWN3PPTJc5ACNCqXiXIjlIO3L+opIj3Iy+X7\nf1/A18CAxz5fzW2b4tzM8vLLL2drP50+fbr49ttvhRBCJCYmChcXF/H555+L9u3bi379+qnlZsyY\n8UzNLI/3A39SPE9a16xZMzFjxgydPx+HDx8ufv75Z53937lzRwDixIkTarmtW7cKQERFRQkhtM0z\nT2pmEUKIRo0aCT8/P2FmZibi4+OFEEKcP39eACIiIkItFxoaKnr37p3jPYPx48eLjh076izz9fUV\nq1atEh988EG2Zpbx48eLf39Omjdvnq2ZpVmzZmLixIk65/pvXSxatEjUqFFDZGRkqOVbtmypNrN8\n+eWXYt++feq6AwcOCEDcunUrW9zGTDazZDlw4IDQaDQiKj5ZLNoXJhrP3p1jM8vsbRdEanqmocN9\nIvLYzJLf3ixHgJ4AiqL4AIH5/zoxvAkTJrBx40YWLlxIZGQkS5Yswc/PT22+mDZtGnZ2dowfP57F\nixfz+++/s23bNgBsbW25fv06MTExeolzwYIF7Nmzh8jISGbOnMnatWvx8PDQKWdlZYW1tTWbN28m\nJiaGXbt28f777wOoPTxsbW0JDw/n5s2bOR5r4MCBzJkzh06dOlGhgna0yoYNG9K5c2cGDx7MiRMn\nOHv2LEOHDuXWrVs4OTll28e7777L4cOHmT9/PhEREXz11VcEBATw3HPP8d5773H69GlmzpxJWFgY\na9as4bvvvmP0aO3EDRMnTmTRokWsX7+esLAwJk+eTHBwMG+//XaO8b766qskJSXx/vvvc/HiRebO\nnUtAQIC6/vLly4wZM4ajR48SGRnJjz/+iJubm9pdVSqZFEXBrYINYzrV5uxHXYnx60XQ7G4MbZU1\nacWqI9HUmbGThrN2c+VOylP2VszlJeP/90VWb5Z/0PZo8chtm+J8ZS6EEBs2bBAeHh7CwsJC1K1b\nV6xfv14IIcTRo0eFiYmJ2L9/v1p2woQJwsXFRSQkJIiIiAjh7u4urKyssl3lFfaVuRBCfPPNN6Jy\n5cqiTJkyokmTJmL37t3qusf3v3nzZlGzZk1hZWUlPD09xapVq4STk5P48ccfhRBC/Pbbb6Js2bKi\nefPmOV6ZR0VF5fiE7M2bN8XAgQOFvb29KFu2rBgwYECOV+X/+uOPP0T9+vXVeP/66y913b59+0TT\npk2FhYWFqF27tli+fLnOtgsXLhQ1atQQZcqUET4+PuLQoUPZzvXxK9GAgADh7e0typQpI3r06CFe\ne+019co8OTlZvPnmm6JixYrC0tJS+Pr66twgLinklXmWvNRF4oM0MfrH09mu1qPik4s+wDwij1fm\nxX7aONep2hsYcrq4LMY2VVpRknWhS9ZHlmeti82nrjLxl3PqZxsLU/6Z1gkHK/MiiC7vSsy0cWaP\nxjBPevj0Xh+SJEkF0dfLhRi/XvxvUFMA7qdl0nj2HuZsDzZwZHlT7JN5s+raNs3zVxNyKSlJklRw\nLzR2JsavFyM7aLsRrzwcjevUHcQmPDBwZE9X7JN50+rax2lPX7pr4EgkSSpNpvbwIHBWV/Vzq3n7\nWXU42oARPV2xT+bNamivzE/KZC5Jkp7ZWZoT49eL6T3rAfDJ9mCe/98hA0eVs2KfzFu6aR/OORgW\nb+BIJEkqrYa3r8mhyR0B7exnrlN3kJahyWUr/Sr2ybysteFnvZYkSarmaE3YnB7q5zozdvIgLffh\nMfSl2Cfzx2k0cnJnSZIMx8LMhBi/XjjZlwGg3ke7uJ+akctW+mEUybyyjbZ74rHo2waORJIkCY5/\n2JmajyaZr//xbjIyDd/kYhTJ/EV3bVPL//6KyKWkJEmSfuyf6EsFW21uqjV9p4GjMZJk3qKKdrjX\no1HyylySpOIjYHpn9f2rK449pWTRM4pkbvLYeMP6Gn5AkiQpN4qiEPppdwD+ibzNrqDYXLYoOkaR\nzAGqOVoBcCRCXp1LklR8WJqbsmNsWwBGrj9tsB4uRpPM57zYEIApm88bOBJJkiRd9Z0deKmpdgau\npp/uMUgMRpPMO9SpCMC1e8V7fARJkkqnb15pAsDDdA2nL+v/iXWjSeYA5qbatvN/Im4ZOBJJkqTs\nNo7wAeDlJf/o/dhGlcx/HK6tqFdXHjdwJJIkSdn51Cyvvj8QmvMsXkXFqJJ5c1dH9X16MeikL0mS\n9F//3gx9Y01ALiULl1Elc4Du9SsD8OXuEjSrtiRJJUZ9Zwf1/a3kVL0d1+iS+ef9GgGw7O8oA0ci\nSZKUs8nd6wIw+sfTejum0SXzx+fjOxF9x4CRSJIk5Wxke+0sRcei9JejjC6ZA/wyshUAA5YdNXAk\nkiRJ2ZmYZD21rq9RFY0ymT9+IzQkNtGAkUiSJOWsbzMXAFYf0c9Uc0aZzAFWvu4NQI+FxXMKJ0mS\nSrfRz9UCtBNC64PRJvPOnk7qe9l2LklSceNWQTve+b2UdL0cz2iTOcDmUa0B2XYuSZJk1Mncq0Y5\n9f3OQMMNPSlJkmRoRp3MAfaMbw/AqA2n5VjnkiQVS/rITUafzOs42eFSTjvW+cSfzxk4GkmSJMMw\n+mQOsG9CBwC2nLkmh8iVJKnYUR6bLa2olIhkbmluyscveALQxm+/gaORJEnSvwIlc0VRXlIU5cfC\nCqYg3mjjpr7/eGuQASORJEnSv3wnc0VRFgLzCrKPwhY4qysAPxy9xOXbKQaORpIkSX8Kkoj/AUYV\nViCFwc7SHL+XtXOFtp9/QPZukSSp1FByS3iKorwFjP/P4jeEEAGKovgCI4UQA5+w7QhgBICTk5PX\nxo0b8xVkcnIytra2eS4/bNd9ABpUMGWSt2W+jlmcPWt9lGSyLnTJ+shi6Lq4l6ph3IEHmCiwqptN\nvvfTsWPHU0II79zKmeVWQAjxPfB9foIQQiwHlgN4e3sLX1/f/OwGf39/nmXb0DaZeMzcRdCtTB5W\n8KB7g8r5Om5x9az1UZLJutAl6yOLoeti4b5wIIxBLarj69uwyI9XbNq7C5OluSm/v9cGgJHrT3Fd\ndleUJEnPvtkXBsDIDu56OV6JTOYATaqVZeyjUcta++0nLUPOGSpJkv5Vc7TWy3EKlMyFEP5Pai8v\nDiZ0rUt9Z3sA6szYaeBoJEkqLYKva+dZMCn6Z4VUJfbK/F87xrZT3/f77h8DRiJJUmnx3qO5PxcN\naqq3Y5b4ZA4Q+ml3AE5euvvopoQkSVLREEIQfUvbo65Xwyp6O26pSOaW5qYcmtwR0N6U+O3MVQNH\nJElSSbX4QASgHaJbH2Oy/KtUJHPQ3oT4dyLo8ZvOcSTiloEjkiSpJPpyj7YXy4rXc+0aXqhKTTIH\n7UTQSwY3A2DwyuMci7pt4IgkSSpJHp8kx9HGQq/HLlXJHKBnwyrMe/TI/8Dlx2RClySp0IzaoL3x\nuW9Ce70fu9Qlc4BBLarrJPSjkTKhS5JUMN/s1Tav2JUxo1YlO70fv1Qmc9Am9H8H5Rq0QiZ0SZLy\nLy1Dw8K/tD3lDk95ziAxlNpkDjDwsSv0QSuOsS/4hoEjkiTJGD33lT8A3etXxsHa3CAxlOpkDtor\n9C/6NgLg7bUn2XD8koEjkiTJmOy5EMfVu9rxn74b0sxgcZT6ZA4woHk1Vg9rDsD034KY/ccFA0ck\nSZIxuJ+awYh1pwD4Y3RbvfYr/y+ZzB/p6FGJrY9GWlx9JIZOX/nLyS0kSXqq+h/vBqBvMxcaujgY\nNBaZzB/TuFpZTkzvBEBk/H3cpv3Jw/RMA0clSVJxNOXX8+r7rwY0NmAkWjKZ/0clO0vC5/ZQP3vM\n3MU1OR66JEmP2Xr2GptOXgHg3MddDRyNlkzmOTA3NSHGrxdNq5cFoI3ffg6E3jRwVJIkFQeBVxN4\nf+NZADaPaoWDlWF6r/yXTOZP8du7bdQJLt5YE8CkX84ZOCJJkgzpZtJDXvj2MABf9GuEVw1HA0eU\nRSbzXEzoWlcdoOvXU1dxnbqDlLQMA0clSZK+JTxIp8XcvwB4vVUNBnhXM3BEumQyz4Pmro6cn5XV\nLub50W4OhsUbMCJJkvQp4UE6jWfvAaC1e3k+6dPAwBFlJ5N5HtlbmhPj14s+TZwBGLrqBENWHpfd\nFyWphLudnKom8gZV7flxuI+BI8qZTObPaOHApmwepW12ORxxC7dpf3Jd9naRpBIpLuEhXnP2AeBT\n05HtY9rlsoXhyGSeD141HAmb0wMLM231tfbbz4J9YQaOSpKkwhQal4jPPG0bebf6Tmwc0crAET2d\nTOb5ZGFmQticHszoVQ+ABfvCcZ26g1vJqQaOTJKkgtoVFEf3BYcA7fhNy17T76xB+SGTeQG93a4m\np2Z0Vj97z9nHJ38EGzAiSZIKYsbvgYxcrx1vZdYLnurIqsWdTOaFoLxtGWL8ejGxSx0AVh2JxnXq\nDgKvJhg4MkmS8kqjETT8eDfrj10G4NeRrRjWxs3AUeWdTOaFaEyn2gTO6oqFqbZaX/j2MJ2+8ict\nQ2PgyCRJeprYhAfU/PBPklK1z5CcmdkFb9fi80BQXshkXsjsLM0Jm9uDNW9oh9SNjL9PnRk75Tjp\nklRMbQq4TKt5+wEoZ21O1Gc9KafnyZgLg0zmRcS3biWi5/Wki6cToB0n3XXqDoKvJxo4MkmSQDvV\nW4OPdzNlcyAAH3Sry5mPumJiYrgxyQvCzNABlGSKorDidW+u3k2h7ecHAOi56BB2lmb8/UFHo/z2\nl6SS4EjELQavPK5+9p/ki2sFGwNGVHDyylwPXMpZE+PXi1XDtN2bkh5m0PTTvfT+9rAcL12S9ChT\nI+i58JCayDvUqUj0vJ5Gn8hBJnO9es7Dieh5PZnwqNfL+asJeMzcxXs/niZTI4cFkKSitPtCHO4f\n/klwrLap85eRrfjhzRYGneqtMOUrmSuK4qAoyh+KohxUFOWooijF+9GoYkRRFMZ2qk30vJ4M8HYB\nYMf5WNw//JN5O0PkWC+SVMhuJj3EdeoO3nk0V6d3jXJEfdaT5kbWWyU3+b0ynwD8JYToAAwDFhda\nRKWEoih80a8xYXN60KpmeQCWHYzCbdqf+O0MlUldkgpICMGo9afUYWsBdo9rz6+jWhvtTc6nye8N\n0G+Af59bNwMeFk44pY+FmQk/jfAh8WE6Ly4+QlT8fZYejGTpwUgGt6zOJ30aYFoCf/AkqShtPHGZ\nqbtTgBQAZvSqx9vtaho2qCKm5HYFqCjKW8D4/yx+QwgRoChKZWAnME4IcTCHbUcAIwCcnJy8Nm7c\nmK8gk5OTsbW1zde2xuZBhmDusQdcTc76f6lbzoRxXpZYmWmTemmqj9zIutBV2uvjwq1M5p/MurZ0\nsVWY1doKMyO+IOrYseMpIUSug8PkmsyfuKGiNAQ2ApOEEDtzK+/t7S1OnjyZr2P5+/vj6+ubr22N\nVUpaBqPWn9aZBKOstTnbx7Ql4tyJUlcfT1IafzaeprTWx6lLd+n73T86y77qYEXfHs8ZKKLCoyhK\nnpJ5vppZFEXxBH4BXhFCyIkxi4C1hRk/vNkCjUYwb2cIKw5Fcy8lXe2v/mO1W7R2r2DgKCXJsC5c\nT6DXosM6y7aPaUuDqg74+/sbJigDyW+b+TzAElj4qFtPghCiT6FFJalMTBSm9/Jkei9Pfg64wuTN\n5wF4dYW2n+w7HWoyuZuHbFeXSpXjUbd5ZfkxnWU/v9OKFm4lq4fKs8hXMpeJ2zAGNK/GgObVWPnb\nX8w5rm0XXHYwimUHo3CwMuen4T54OtsbOEpJKjrrjl1i5u9BOst+eLMFHepUNFBExYd8nN8I1Spn\nSoxfL5IepvPuhtMcCr9FwoN0ei7SDqb/eqsazOjlqc6EJEnGLC1Dw+Rfz/H72es6y7e825pm1csZ\nKKriRyZzI2Znac66t1oCsDf4BsPXam8wrz16ibVHtaM0bni7JW1qybZ1yfhExSfzyvJjxCdlzd7l\nUs6KX0e2prKDpQEjK55kMi8hung6EePXi5S0DKZtCWTro6uYf8eg8Kxiz+LBzXArAWNQSCVXpkbw\nv/3hLNgXrrP8xSbOfNGvsfxr8ylkMi9hrC3MWDiwKQsHNuVkzB3eWBNA0sMMgmMT6filP6CdZXx+\nv8ZUc7Q2bLCS9MjxqNu8uvJ4tjGKFg5sQp8mVQ0UlXGRybwE83Z1JHBWN4QQ/HLyqtoT5ljUHdp9\noe3i2MLNkfn9GlGjvLxil/QrLuEhk345x+GIWzrLO9SpyDevNMFRDhH9TGQyLwUURVF7wmg0gvXH\nL/HR1gsAnIi+Q4f5/gA0rOrAZy81pKGLgwGjlUqy+KRUZv9xge3nY3WWm5oobHi7JT6PximSnp1M\n5qWMiYnC661ceb2VKxqN4McTl5nxqKtX4LUEXvhW+wCGhakJH/f25BXvapiZynZKKf8u3b7Ph78F\ncsIPJyAAAAdDSURBVCTidrZ103vW4822bvI5iUIgk3kpZmKiMMSnBkN8aqDRCP44f51pWwJJScsk\nLVPD9N+CmP6bNtG3di/Phz3r0aCqvGqXcvdP5C0+2nqBiJvJ2daN61ybUb7ulDEzNUBkJZdM5hKg\nTex9mlRVbzaFxiXitzMU/4vasWH+ibzN8//Lemz6nfY1GdG+JuVtyxgkXql4uZ2cyuIDkaw6Ep3j\n+k/61GdIyxolcujZ4kImcylHHpXtWfNGC0DbXWzL6avM2RFCwoN0AJb9HcWyv6PU8sPbufFGGzec\ny1oZJF5Jv1IzMvnx+GX8doaSmqHJtr5qWSs+6VOf5zwqlZiZfIo7mcylXJmaKPT3rkZ/72oA3Ex8\nyHcHI1l9JEYts+JQNCsOZV2VtalVnuHtatK+dkV5NVYCJD1MZ+OJK3x7IEL9Qv+v4e3cGOVbS/ZC\nMRCZzKVnVsneko9fqM/HL9QHtF3M1vwTw4pDUWo/4SMRt3VueFmZmzK4ZXUGtayOe8XSO962MRBC\ncCTiNquPRPNX6M0nlutevzKTutWhViU7PUYnPYlM5lKBVXawZGoPD6b28AAgPVPDzqA4VvwdReC1\nBAAepGey8nA0Kw/rtqn2aliFF5tWpUOdivLpPgPQaAQnYu7w88krbDl97allX2palVG+7tRxksm7\nOJLJXCp05qYm9G7sTO/Gzuqyq3dT2BRwhR+PX+b2/TR1+Y7AWHYE6vY5dnawpGv9ynT1dKK5myPm\nsmtkgQkhuHA9ke3nY9kReJ0rdx48tXyDqvYMa+3G842qYGkue50YA5nMJb1wKWfNxK51mdi1rros\n4UE6u4Pi+O3MNY5GZTXJXH/UbLPmn5hs+3GvaEPbWhVoW7siPjVL79jVORFCcC1Zw7pjlzgaeYsD\nofE8SM/Mdbt6Vex5xduFPk2qUk62dxstmcwlg3GwMlefTP2XEILI+GT2Bt9k94U4zl65p7NNZPx9\nIuPv88OjUSEB2LVDfVuzgg2NXByoV8Uejyr21KtsR0W7Mkbfo0KjEcQnpxJ0LYHzVxM4f/UeZ67c\n415KTjcjg3JYBm4VbHi+URV6NapCXSc7o68TSZdM5lKxoigKtSrZUauSHaN83XXWaTSCkLhEDoff\n4nDELY5E3OI/4zIRdes+UbfuZxv7OifWFqbUKG9D1bKWVLAtQ0W7MlSy0/7772dHGwusLcwK/IRi\neqaGxAfp3E1J525KGnfvp3EvJZ345FSu33vw6PWQmNv3c+zql1eVrBV8PavS0q087etUpKKdfA6g\ntJDJXDIaJiYK9Z0dqO/swDsdtIn+8QmMMzWCiJvJnLt6j4txSYTGJRIam6TTRv+4lLRMQmITCYlN\n1NcpFEg5a3MaVHWgkYsDjVzK0sjFgcr2ljpX2Nr6aGzAKCVDkclcKjFMTRTqVrajbuW89bZISEnn\n8p0UYhMeEJ+cys3EVOKTU4lPSuXWo39vJqWSVoAr5ceVtTannLUF5f7918aC8rYWVC1rhbODFc5l\nrXBxtMKujJlsApGemUzmUqnlYG1OQ2sHOUqkVCLIPl+SJEklgEzmkiRJJYBM5pIkSSWATOaSJEkl\ngEzmkiRJJYBM5pIkSSWATOaSJEklgEzmkiRJJYAihMi9VGEcSFHigUu5FsxZBeBWIYZj7GR9ZJF1\noUvWR5aSUhc1hBAVcyukt2ReEIqinBRCeBs6juJC1kcWWRe6ZH1kKW11IZtZJEmSSgCZzCVJkkoA\nY0nm/2/v7lmjCKMojv9PYhEQtBUEGxVEsBQNiIJgY+NLKQiRIFY2IsF8glSiKQQRI4giikgUEVMk\nkghGGytt/Q5GBBVdrkUWEiU7lc6deeb8YGEfdovD3Wcvd2dmmVvZARrG9VjjWvzJ9VjTqVq04pi5\nmZlVa8tkbmZmFVrRzCVtlvRM0mtJ85K2Z2fKImmrpOeSliS9lTSanakJJJ2S9CA7RwZJQ5Ju9vfD\noqRd2ZmaQNIBSYvZOerSimYOnAfeR8Rh4D4wkZwn0yVgISKOAGPAjdw4+SRNA1O0Zz//ayeBkYgY\nBa4AV5PzpJM0AdwGRrKz1KUVdxqKiOuShvvLHcDnqvcX7hrwo/98E/A9MUtTLANPgQvZQZIcAuYA\nIuKdpM5cW13hE3AauJcdpC6Nm2QkjUv6+Ndjf0T0JL0CLgKz2TnrsFEtgN0R8U3SNlZ/pUwmx6xN\nxd54BHT5TP4WYGXduiepFYPa/xIRT4Cf2Tnq1LgPPCJmgJkBrx2VtAd4AeysNViCQbWQtA94CFyO\niKXagyWp2hsd9wVYfxfroYj4lRXGcjRuMt+IpElJZ/vLr0AvM08mSXuBx8CZiHiZncca4Q1wHEDS\nQeBDbhzL0LjJfIA7wF1J48AwcC45T6YpVk/qTEsCWImIE7mRLNkscEzSMiC6/f3oLP9pyMysAK04\nzGJmZtXczM3MCuBmbmZWADdzM7MCuJmbmRXAzdzMrABu5mZmBXAzNzMrwG9vkjqbkdG0bAAAAABJ\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Пример 3.2\n", "\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "a = 1.\n", "x = np.arange(-2*np.pi, 2*np.pi, 0.05)\n", "# Уравнение кардиоиды\n", "xz = a*(2*np.cos(x) - np.cos(2*x))\n", "yz = a*(2*np.sin(x) - np.sin(2*x))\n", "\n", "fig = plt.figure()\n", "plt.plot(xz, yz)\n", "\n", "# Текст в координатах данных\n", "str1 = plt.text(-np.pi/2., np.pi/2., 'Text in absolute coords', fontsize=14) # выравнивание по левому краю\n", "print('Text class: %s' % str1.__class__)\n", "\n", "# Текст в рамке\n", "plt.text(0.5, 0.5, 'Text with borders', fontsize=14,\n", " # выравнивание по вертикали и по горизонтали по центру\n", " horizontalalignment='center', verticalalignment='center',\n", " bbox=dict(facecolor='pink', alpha=0.5))\n", "\n", "# Текст в относительных координатах области рисования ax\n", "ax = fig.add_subplot(111) # создаём область рисования ax\n", "plt.text(0.5, 0.5, 'Text in relative coords', fontsize=14,\n", " horizontalalignment='right', verticalalignment='center',\n", " transform=ax.transAxes)\n", "plt.grid()\n", "\n", "save('pic_3_2', fmt='png')\n", "save('pic_3_2', fmt='pdf')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3 Наборы шрифтов. Стили и форматы\n", "\n", "Из настроек `matplotlibrc` или `rcParams` нас интересуют fonts, то есть шрифты. Есть 5 наборов шрифтов: \n", "\n", "+ cursive;\n", "\n", "+ fantasy;\n", "\n", "+ monospace;\n", "\n", "+ sans-serif;\n", "\n", "+ serif. \n", "\n", "Один из этих пяти наборов является текущим. За это отвечает параметр font.family. Каждый набор может состоять из одного или более шрифтов. Причём можно указывать шрифты, которые не установлены в ОС. Работать такие шрифты не будут, но формально указать их можно. Такая настройка определяет шрифт для всех подписей и текста на рисунке. Если конкретную подпись необходимо сделать другим шрифтом, можно указать шрифт из текущего стиля прямо в команде, передав в качестве соответствующего параметра словарь: `{'fontname':'название_шрифта'}`.\n", "\n", "Помимо семейств, текст также может иметь стиль. Атрибут стиля style может быть либо 'italic', либо 'oblique', либо 'normal' (по умолчанию). Толщина или \"жирность\" шрифта, может быть задана через атрибут fontweight, который принимает значения 'bold', 'light' или 'normal' (по умолчанию). Стили и форматы можно комбинировать." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Пример 3.3\n", "\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "mpl.rcParams['font.fantasy'] = 'Arial', 'Times New Roman', 'Tahoma', 'Comic Sans MS', 'Courier'\n", "mpl.rcParams['font.family'] = 'fantasy'\n", "\n", "# Текущий стиль-семейство шрифтов\n", "cfam = mpl.rcParams.get('font.family')[0]\n", "print('cfam %s' % cfam)\n", "cfont = mpl.rcParams.get('font.fantasy')[0]\n", "\n", "# Первый шрифт в текущем семействе\n", "print(mpl.rcParams.get('font.%s' % cfam))\n", "\n", "\n", "N = 100\n", "x = np.arange(N)\n", "# Задаём выборку из Гамма-распредления с параметрами формы=1. и масштаба=3.0\n", "y = np.random.gamma(1.0, 3.0, N)\n", "\n", "fig = plt.figure()\n", "cc = plt.hist(y) \n", "\n", "text_style = ['italic', 'oblique', 'normal']\n", "font_weights = ['bold', 'light', 'normal']\n", "for i, ts in enumerate(text_style):\n", " plt.text(6, 20-5*i, '%s text style' % ts, {'fontname':'Courier'}, style=ts, fontsize=14)\n", " plt.text(6, 35-4*i, '%s & %s text style' % (ts, font_weights[i]), {'fontname':'Courier'}, \n", " style=ts, fontweight=font_weights[i], fontsize=12)\n", " \n", "plt.title('Title has %s font' % cfont, fontweight='normal', color='k', fontsize=16)\n", "plt.xlabel('Bold weight', {'fontname':'Times New Roman'}, fontweight='bold', fontsize=16)\n", "plt.ylabel('Light weight', {'fontname':'Times New Roman'}, fontweight='light', fontsize=14)\n", "plt.grid(True)\n", "\n", "save('pic_3_3', fmt='png')\n", "save('pic_3_3', fmt='pdf')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.4 Кириллица и matplotlib. Подписи по-русски\n", "\n", "Кириллица \"из коробки\" не поддерживается в matplotlib. Однако настроить поддержку русского алфавита несложно. Основная проблема matplotlib для отображения кириллических символов состоит в том, что по умолчанию используются шрифты, которые не поддерживают кириллицу. Соответственно, решение проблемы отображения русского алфавита заключается в смене шрифта на тот, который поддерживает кириллицу. В ОС Windows это может быть, например, Arial, Times New Roman или Tahoma. Сделать это можно как в теле самой программы-скрипта, так и в профильных настройках.\n", "\n", "У каждого стиля шрифта определены списки из реальных шрифтов, которыми пользуются в текстовых процессорах и редакторах. Чтобы поставить шрифт, который будет корректно отображать кириллицу, можно воспользоваться таким примером:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib as mpl\n", "mpl.rcParams['font.family'] = 'fantasy'\n", "mpl.rcParams['font.fantasy'] = 'Arial', 'Times New Roman', 'Tahoma'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Таким образом, набор fantasy будет основным, и из него будет использован шрифт Arial. Если он не будет найден, то будет выбран второй по списку и так далее. Оба представленных шрифта корректно отображают кирилличекие символы.\n", "\n", "Можно использовать и такой синтаксис:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Пример 3.4.1\n", "\n", "from matplotlib import rc\n", " \n", "font = {'family': 'Courier New',\n", " 'weight': 'normal'}\n", "rc('font', **font)\n", "\n", "cfam = mpl.rcParams.get('font.family')[0]\n", "print cfam\n", "cfont = mpl.rcParams.get('font.fantasy')[0]\n", "print cfont\n", "\n", "plt.text(0.25, 0.45, u'Стиль %s по умолчанию' % cfam)\n", "plt.text(0.25, 0.25, u'Шрифт Arial', {'fontname':'Arial'})\n", "\n", "plt.xlabel(u'Ось абсцисс', {'fontname':'Arial'})\n", "plt.ylabel(u'Ось ординат', {'fontname':'Times New Roman'})\n", "plt.title(u'Заголовок и буква Ё! А также разные шрифты элементов рисунка',{'fontname':'Tahoma'})\n", "plt.grid()\n", "\n", "save('pic_3_4_1', fmt='png')\n", "save('pic_3_4_1', fmt='pdf')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Список доступных в ОС шрифтов можно узнать, например, вот так:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import matplotlib.font_manager as fm\n", "for i, font in enumerate(sorted(fm.findSystemFonts())):\n", " # Шрифтов в системе очень много. Полный список занимает не одну страницу A4\n", " if(i % 50 == 0):\n", " print i, font" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для поиска по названию известного вам шрифта в ОС можно воспользоваться функцией findfont:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import matplotlib.font_manager as fm\n", "print 'Courier New - %s' % fm.findfont('Courier New') # Ищем Courier New\n", "print 'Times New Roman - %s' % fm.findfont('times new roman') # Ищем times new roman строчными буквами\n", "print 'Comic Sans MS - %s' % fm.findfont('COMIC SANS MS') # Ищем COMIC SANS MS прописными буквами" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Вторым необходимым условием** для отображения на рисунках matplotlib русских букв является использование unicode-строк. В python3 все строки являются юникодовыми, там дополнительных примочек не нужно. В python2 необходимо преобразовывать обычную строку в юникод-строку: " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "str1 = 'строка 1' # обычная строка\n", "print str1,type(str1)\n", "str2 = u'строка 1' # unicode-строка\n", "print str2,type(str2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Также ставим в начале скрипта: # -*- coding: utf-8 -*- . В GUI Spyder такая запись вставляется в новый созданный скрипт по умолчанию." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# -*- coding: utf-8 -*-\n", "# Пример 3.4.2\n", "\n", "from math import pi\n", "import numpy as np\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "\n", "#mpl.rcdefaults() # cбрасываем настройки на \"по умолчанию\"\n", "mpl.rcParams['font.family'] = 'fantasy'\n", "mpl.rcParams['font.fantasy'] = 'Times New Roman', 'Ubuntu','Arial','Tahoma','Calibri'\n", "\n", "x = np.arange(-pi,pi+0.1,0.1)\n", "\n", "fig = plt.figure()\n", "ax1 = fig.add_subplot(111)\n", "y = np.tanh(x)\n", "y2 = np.arctan(x)\n", "ax1.plot(x,y,'k--',label=u'Гиперболический тангенс')\n", "ax1.plot(x,y2,'b',label=u'Арктангенс')\n", "\n", "st = u'Заголовок по-русски'\n", "sy = u'Ось ординат OY по-русски'\n", "sx = u'Ось абсцисс OX по-русски'\n", "\n", "ax1.set_title(st,size=20,color='green')\n", "ax1.set_xlabel(sx,size=14,color='orange')\n", "ax1.set_ylabel(sy,size=12, color='black')\n", "ax1.grid(True)\n", "ax1.legend(loc='best',frameon=False)\n", "\n", "plt.tight_layout() # автоматическое выравнивание элементов на холсте plt\n", "\n", "save('pic_3_4_2', fmt='png')\n", "save('pic_3_4_2', fmt='pdf')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.5 Работа с математическими формулами. Поддержка LaTex\n", "\n", "> **Для работы с LaTex необходимо установить его дистрибутив! Создатели iPython Notebooks советуют [использовать MikTex](http://miktex.org/download)**\n", "\n", "Существенным преимуществом matplotlib является безбарьерная работа с LaTex. Нужно, чтобы в системе был установлена библиотека LaTeX (именно библиотека, а не редактор). Код LaTex оформляется в виде \"raw\" строки (перед строкой ставится символ r -> `r'строка')`. Также в настройках pyplot нужно указать, чтобы текст отрисовывался с учётом синтаксиса LaTeX. Это можно сделать через `plt.rc('text', usetex=True)`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Пример 3.5\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "# Преамблуа для работы с LaTeX\n", "plt.rc('text', usetex=True)\n", "\n", "N = 100\n", "x = np.arange(N)\n", "z1 = np.cos(x/10.)\n", "z2 = np.cos(x/20.)\n", "\n", "fig = plt.figure()\n", "plt.fill_between(x, z2, z1, color='green', alpha=0.25) \n", "plt.plot(x, z1, color='green', linewidth=4.0)\n", "plt.plot(x, z2, color='green', linewidth=4.0, alpha=0.5)\n", "plt.title(r'$\\S1.3.2 \\LaTeX example$')\n", "plt.text(22, 0.5, r'$ e=mc^2 $', fontsize='16')\n", "plt.text(55, -0.5, r'$\\displaystyle\\sum_{n=1}^\\infty\\frac{-e^{i\\pi}}{2^n}$!', fontsize=18, rotation=60)\n", "\n", "plt.grid(True)\n", "plt.xlabel(r'\\textbf{Time (s)}')\n", "plt.ylabel(r'\\textit{Sin(x) \\& cos(x)}', color='red', rotation=45)\n", "\n", "save('pic_3_5', fmt='png')\n", "save('pic_3_5', fmt='pdf')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для корректного отображения не латеховского кода, нужно не забыть отключить его поддержку, если элементы LaTeX использовались для создания рисунка." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "plt.rc('text', usetex=False)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Автор: Шабанов Павел Александрович\n", "\n", "E-mail: pa.shabanov@gmail.com\n", "\n", "## Научная графика в Python\n", "\n", "### Оглавление\n", "\n", "+ [Глава 1 Библиотека matplotlib. Pyplot](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P1 Chapter 1 Pyplot.ipynb)\n", "\n", "+ [Глава 2 Основные графические команды](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P1 Chapter 2 Main graphical commands.ipynb)\n", "\n", "> + [Глава 3 Работа с текстом и шрифтами](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P1 Chapter 3 Text and Fonts.ipynb)\n", "\n", "+ [Глава 4 Цвет и цветовая палитра](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P1 Chapter 4 Color.ipynb)\n", "\n", "**Часть II Структура рисунка в matplotlib**\n", "\n", "+ [Глава 5 Рисунок](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2 Chapter 5 Figure container.ipynb)\n", "\n", "+ [Глава 6 Область рисования](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2 Chapter 6 Axes container.ipynb)\n", "\n", "+ [Глава 7 Мультиоконные рисунки](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2 Chapter 7 Subplots.ipynb)\n", "\n", "+ [Глава 8 Координатные оси](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2 Chapter 8 Axis container.ipynb)\n", "\n", "+ [Глава 9 Деления координатных осей](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2 Chapter 9 Ticks container.ipynb)\n", "\n", "**Часть III Специальные элементы рисунка в matplotlib**\n", "\n", "+ [Глава 10 Особенности координатных осей](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P3 Chapter 10 Twinx and log scale.ipynb)\n", "\n", "+ [Глава 11 Графики в полярной системе координат](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P3 Chapter 11 Polar plots.ipynb) \n", "\n", "+ [Глава 12 Легенда](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P3 Chapter 12 Legends.ipynb)\n", "\n", "+ [Глава 13 Цветовая шкала](http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P3 Chapter 13 Colorbar.ipynb)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 0 }