{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# matplotlib学习之基本使用" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 目录\n", " ### 1.figure学习\n", " ### 2.设置坐标轴\n", " ### 3.Legend 图例\n", " ### 4.Annotation 标注\n", " ### 5.tick能见度\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.figure学习" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "#导入包" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "x=np.linspace(-3,3,50)#产生-3到3之间50个点" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "y1=2*x+1#定义函数\n", "y2=x**2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 绘制直线\n", "plt.figure()\n", "plt.plot(x,y1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "曲线与直线绘制一块" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# num=3表示图片上方标题 变为figure3,figsize=(长,宽)设置figure大小\n", "plt.figure(num=3,figsize=(8,5))\n", "plt.plot(x,y2)\n", "# 红色虚线直线宽度默认1.0\n", "plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.设置坐标轴" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1. -0.25 0.5 1.25 2. ]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# num=3表示图片上方标题 变为figure3,figsize=(长,宽)设置figure大小\n", "plt.figure(num=3,figsize=(8,5))\n", "plt.plot(x,y2)\n", "# 红色虚线直线宽度默认1.0\n", "plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')\n", "\n", "plt.xlim((-1,2))#设置x轴范围\n", "plt.ylim((-2,3))#设置轴y范围\n", "\n", "#设置坐标轴含义, 注:英文直接写,中文需要后面加上fontproperties属性\n", "plt.xlabel(u'价格',fontproperties='SimHei')\n", "plt.ylabel(u'利润',fontproperties='SimHei')\n", "\n", "# 设置x轴刻度\n", "# -1到2区间,5个点,4个区间,平均分:[-1.,-0.25,0.5,1.25,2.]\n", "new_ticks=np.linspace(-1,2,5)\n", "print(new_ticks)\n", "plt.xticks(new_ticks)\n", "\n", "# 设置y轴刻度\n", "'''\n", "设置对应坐标用汉字或英文表示,后面的属性fontproperties表示中文可见,不乱码,\n", "内部英文$$表示将英文括起来,r表示正则匹配,通过这个方式将其变为好看的字体\n", "如果要显示特殊字符,比如阿尔法,则用转意符\\alpha,前面的\\ 表示空格转意\n", "'''\n", "plt.yticks([-2,-1.8,-1,1.22,3.],\n", " ['非常糟糕','糟糕',r'$good\\ \\alpha$',r'$really\\ good$','超级好'],fontproperties='SimHei')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# num=3表示图片上方标题 变为figure3,figsize=(长,宽)设置figure大小\n", "plt.figure(num=3,figsize=(8,5))\n", "plt.plot(x,y2)\n", "# 红色虚线直线宽度默认1.0\n", "plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')\n", "# 设置边框/坐标轴\n", "gca='get current axis/获取当前轴线'\n", "ax=plt.gca()\n", "# spines就是脊梁,即四个边框\n", "# 取消右边与上边轴\n", "ax.spines['right'].set_color('none')\n", "ax.spines['top'].set_color('none')\n", "\n", "\n", "# matlibplot并没有设置默认的x轴与y轴方向,下面就开始设置默认轴\n", "ax.xaxis.set_ticks_position('bottom')\n", "ax.yaxis.set_ticks_position('left')\n", "\n", "\n", "# 设置坐标原点\n", "# 实现将(0,-1)设为坐标原点\n", "# 设置y轴上-1为坐标原点的y点,把x轴放置再-1处\n", "ax.spines['bottom'].set_position(('data',-1)) # 也可以是('axes',0.1)后面是百分比,相当于定位到10%处\n", "# 设置x轴上0为坐标原点的x点,将y轴移置0处\n", "ax.spines['left'].set_position(('data',0))\n", "\n", "# 再写一遍以下代码,因为以上使用set_position后,中文会显示不出来\n", "\n", "plt.yticks([-2,-1.8,-1,1.22,3.],\n", " ['非常糟糕','糟糕',r'$good\\ \\alpha$',r'$really\\ good$','超级好'],fontproperties='SimHei')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.Legend 图例" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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ml3w94eGhjJx4kR69vzDYlMWLFjAoEGDjj/u0aMHCxcuJCYmhq5du/LWW28RERFBQkICAD179iQ1NZXJkyezcuVKfvjhB5YtW0ZqaipRUVEXXGNBUDARERHxA0FBQdxzzz088MADf/hadnY25cqVO/44NDSUTp068fLLL9O2bVvat2+PtZZbbrmFdevWsXnzZsqXL8/BgweJiYnh6aefpl27dlSsWLEoL+mUFExERCRgXEzHwheMGTPmtB2Te+6556Rjr7zyCiNHjmTMmDF88MEH1K5dmwEDBtCiRQvWrVvHCy+8wLhx45g0aRLDhw9n9uzZCiYiIiJy7oYMGcLDDz/8h+NZWVmUKVPmpGOTJk2iXr16fPrpp0RHR1OzZk169eoFQGRkJCtXruTdd9/lkUce4dVXX6Vhw4ZFcg1no2AiIiLiJ957771z7pjEx8cfv8dNVlYWCQkJ5ObmEhoaSoUKFYiJiWHYsGFMnDiRPn36FEn950LBRERExE/079//pFU5x+Tl5VG1atXjj3fu3Mnbb7/Nli1bWLduHdu3bycmJoavv/6azMxMhg0bRmpqKiVKlDg+N+Wll16iZ8+eNGnSpMiu51T8audXERGRQJKdnU1KSgr79+/H4/Hw3nvvsW3btj98TJ48Ga/Xy4EDB0hNTSUyMpJffvmFJk2a8P7777N3716mTJnCa6+9RsOGDcnIyGDFihWMHj2a3r1788wzz/D888+zfft2ty9ZHRMRERFftXz5crp06UKpUqUIDg5m2LBhDBs27LTPr127NllZWUybNo0ZM2ac9DVrLbNnz+b1119nwIABANxxxx0EBQXx8MMP079/f7p161ao13MuzIk3BZKCExcXZ5cvX+52GSIiAWvt2rWuD0sUJ2f7eRpj4q21F72nvYZyRERExGcomIiIiIjPUDARERERn6FgIiIiIj5DwURERER8hoKJiIiI+AwFExERET/l8XjIzMw843OSkpJOeuz1epk3bx67d+8uzNIumIKJiIiIHwkNDWXWrFkAzJkzh7Jly+LxeE753O3bt9O6dWtmz559/FhQUBA33HADc+fOZc6cOYwfP75I6j5XCiYiIiJ+JCws7Pj9bcLDwwkODiY4OPiUz33ttdfo168f3bt3P+l4VFQUVapUoVatWowYMYKNGzcWet3nSsFERETEjwQFBR0PIsfuHnwqGzZsYMqUKYwaNYqZM2fy+OOPk5eXB0BIiHNHmkaNGvHFF1/wzTff4Cu7leteOSIiIj5s8ODBfPzxx1SpUgWAjIwMbrvtNkqWLElWVhYej4fatWsDkJaWRteuXfnoo4/o27cvL730ElFRUTz33HN07dqVJUuWsHbtWtLT07nvvvvIzMykbt26NGzYkObNm7t4lb9Rx0RERMSHlSpViiuuuOL4nYQjIiKYOnXq8bsKBwcHH//arbfeSmhoKPPnzychIYEnn3ySypUrY61l5MiRPPjggyQmJlKpUiWGDh3Krl27WLx4MR9++CGxsbFuXyqgjomIiIhPO938kdMJCgqiR48eLFy4kJiYGLp27cpbb71FREQECQkJAPTs2ZPU1FQmT57MypUr+eGHH1i2bBmpqalERUUVxmWce/2unl1ERKSoPf88GPPbR3y883Hiseefd55bvfpvx1q3do4NGXLyc1NS4IsvTj723nvOc0/1mkUgNDSUTp06MXr0aNq2bUv79u2x1tKrVy+aNm3K119/zSeffMK8efOoWrUqTz/9NLt27XI9lAAYa63bNRRLcXFx1lcmEomIBKK1a9fSpEkTt8u4aA8//DCjR48+HhpSUlKIioqiRIkSZGdnk5aWRnR0NAAHDhzguuuu47PPPuOVV17h+eefZ8yYMeTk5FC7dm327dtHixYtWLduHS+88AJLlixh0qRJPPPMM8yePZuGDRueto6z/TyNMfHW2riLvV51TERERHxcly5d2LlzJzt37iQiIoJp06axc+dOpk6dSnBw8PGv3Xbbbce/Z9KkSdSrV49PP/2UpUuX4vV66dWrF/Xq1aN9+/asXLmSd999l8GDB/Poo4+eMZQUJc0xERERKYbi4+OPLyfOysoiISGB3NxcQkNDqVChAjExMQwbNoyJEyfSp08fl6v9jTomIiIixczOnTt56qmnuP3224mNjaV69eo8+eST5OXlceDAAfr160dqaiolSpQ4vlnbSy+9xNq1a12uPAA7JsaJj8HW2jy3axERETmbvLw8FixYQI0aNQBnH5NevXodn2Pi8XiOf+3AgQNce+21VK9enV9++YWWLVvyyCOP0KpVK/bt28drr73GG2+8Qbt27VixYgVffvklvXv35qGHHuLll1+mVatWrs/LCahgYoxpA1QGrjTGbAX+BNQFwoCKwCrgHWA2MAMY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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "x=np.linspace(-3,3,50)\n", "y1=2*x+1\n", "y2=x**2\n", "# 绘制直线\n", "plt.figure()\n", "# plt.plot(x,y1)\n", "# 曲线与直线绘制一块\n", "# num=3表示图片上方标题 变为figure3,figsize=(长,宽)设置figure大小\n", "plt.figure(num=3,figsize=(8,5))\n", "\n", "# 设置x轴范围\n", "plt.xlim((-1,2))\n", "# 设置轴y范围\n", "plt.ylim((-2,3))\n", "# 设置坐标轴含义\n", "# 注:英文直接写,中文需要后面加上fontproperties属性\n", "plt.xlabel(u'价格',fontproperties='SimHei')\n", "plt.ylabel(u'利润',fontproperties='SimHei')\n", "\n", "# -1到2区间,5个点,4个区间,平均分:[-1.,-0.25,0.5,1.25,2.]\n", "new_ticks=np.linspace(-1,2,5)\n", "# print(new_ticks)\n", "plt.xticks(new_ticks)\n", "\n", "plt.yticks([-2,-1.8,-1,1.22,3.],\n", " ['非常糟糕','糟糕',r'$good\\ \\alpha$',r'$really\\ good$','超级好'],fontproperties='SimHei')\n", "\n", "# 设置legend图例\n", "\n", "l1,=plt.plot(x,y2) # 可添加label属性,只不过如果这里添加了,下面legend再添加,下面的就会覆盖此处的!\n", "# 红色虚线直线宽度默认1.0\n", "l2,=plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')\n", "'''\n", "prop={'family':'SimHei','size':15}显示中文\n", "legend(hadles=[,,],labels=[,,],loc='best/upper right/upper left/.../lower right')\n", "handles就是你给他添加legend的线,如果要用handles,则前面的plt.plot,必须用l1,形式(不要忘记逗号)\n", "此处labels会覆盖上述的plt.plot()的label\n", "loc默认是best,给你放在一个合适的位置上,如果你拉伸弹框,位置会跟着变,自动放置合适位置\n", "'''\n", "plt.legend(handles=[l1,l2],prop={'family':'SimHei','size':15},loc='lower right',labels=['直线','曲线'])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.Annotation 标注" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAesAAAElCAYAAADEEcplAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3XlcFPX/B/DXIoJcijcqigfIKaKASqloCqmZmtppZVlpZXanmQepeVSaZ7/8knllt32/ipL3gWkmgicgCsqtCIiccu5+fn8MCgjCIiyzx+v5eOwDdnaYee8A+9r5zOy8FUIIEBERkfYykrsAIiIiqhnDmoiISMsxrImIiLQcw5qIiEjLMayJiIi0HMOaiIhIyzGsiYiItBzDmoiISMsxrImIiLQcw5qIiEjLGctdQAW87imRDEaMGIG9e/fKXQaRoVKoMxP3rIkMXEZGhtwlEFEtGNZERERajmFNRESk5RjWREREWo5hTUREpOUY1kRERFqOYU1ERKTlGNZERERajmFNRESk5RjWREREaigsUcq2boY1ERFRDQpLlFh54AoGfnkE6blFstSgTdcGJyIi0ipHLqfh86BIJNy6gzG9O0Kh1pW8Gx7DmoiI6D7XswqwcFcU9kamontbC/z8en88Yt9GtnoY1kRERGVKlCpsPB6H1YdioBICnzzuiNcHdYOpcRNZ62JYExERATh17Rbm7YzAlZt5GO7cHgFPuqBzK3O5ywLAsCYiIgOXnluEpXsu4b9nUtDJ2gzfv+wFP5f2cpdVCcOaiIgMklIl8POpBHy17zIKS5R4Z6g9pg+1h5mJvEPe1WFYExGRwTmflIW5OyJwMSUbj/RojYVj3WDfzlLush6IYU1ERAYj+04Jvt4fjZ9OJaKNpSnWPN8HT7p3gEKuz2SpiWFNRER6TwiB/55JwZK/LuH2nWK88khXfODXE82bNZW7NLUwrImISK9dTs3FvB0RCI3PRJ8u1tj6Wj+4dmwhd1l1wrAmIiK9lF9UitWHYvDD8ThYNTPGlxN64WnPzjAy0u4h7+owrImISK8IIbA3IhULd0fhRnYhnvPujJkjnNDKwkTu0h4aw5qIiPRGfEY+AoIiEXIlHc4dmmPdC33haddS7rLqjWFNREQ6r7BEifUhV/F/R6/CpIkR5o12wWQfOxg30Y/mkgxrIiLSaUcvpyGgrDPWk707Yu4TzmjfvJncZTUohjUREemk61kFWLQ7CnsipM5YP73eH4/K2BlLkxjWRESkU0qUKmw6EYdVB2OgVGlPZyxNYlgT6aGsrCy8/vrriIiIgEKhwMaNG+Hj4yN3WUT1FhqXibk7LpZ1xmqHgCddtaYzliYxrIn00HvvvYcRI0Zg+/btKC4uxp07d+QuiaheMvKKsPSvaPx5JllrO2NpEsOaSM/k5OTg2LFj2Lx5MwDAxMQEJia6+/lSMmxKlcDPoYn4em80CkqUmD60B94Z6qCVnbE0iWFNpGeuXbuGtm3b4tVXX8X58+fh6emJ1atXw8LC4t48gYGBCAwMBACkp6fLVSpRjS4kS52xLiTrRmcsTVIIIeSu4S6tKYRIl4WFhWHAgAE4ceIE+vfvj/feew/NmzfHokWLqp3fy8sLYWFhjVwl0YNl3ynB8v2Xse1UAtpYmmLuE84Y07uj1nfGekhqPSnuWRPpGVtbW9ja2qJ///4AgIkTJ2LZsmUyV0VUOyEE/ndW6oyVmV+MyT5d8aG/7nTG0iSGNZGesbGxQefOnXH58mU4Ojri0KFDcHFxkbssohpduZmLuTsiEBondcba/Go/uHXSrc5YmsSwJtJDa9euxaRJk1BcXIzu3btj06ZNcpdEVK38olKsORyDH/6Og2UzYywb3wvPeOlmZyxNYlgT6SEPDw8ehyatJoTAvshULNwVhevZhXjWqzNmjdTtzliaxLAmIqJGlXBL6ox19HI6nGyssPaFPvC0ayV3WVqNYU1ERI2isESJ/4Rcw7dHY/WyM5YmMayJiEjjQq6kI2BnBOL1uDOWJjGsiYhIY25kS52x/rqYiu5tLLDttf4Y6KCfnbE0iWFNREQNrkSpwuYT8Vh58AqUKoGP/XvijcHd9bozliYxrImIqEGdjs/E3P9F4PLNXAxzaofPxxhGZyxNYlgTEVGDyMgrwrI90dgebpidsTSJYU1ERPWiVAn8EpqIr8o6Y709pAfeecwe5iaMmIbCLUlERA/tYnI25u64iPPJ2fDp3hqLxrnCvp2V3GXpHYY1ERHVWXZBCVbsv4wf/5U6Y61+zkOfO2PJjmFNRERqE0Jgx7kULA5mZ6zGxLAmIiK1xJR1xjoVlwmPzuyM1ZgY1kREVKOKnbEsTI2xdHwvPMvOWI2KYU1ERNWSOmPdxMJdkbieXYinPW3x6UgntLY0lbs0g8OwJiKiKhJv3UFAUASOlHXGWvN8H3h1ZWcsuTCsiYjonsISJQKPXcO3R2JhbKRgZywtwbAmIiIAwLEr6QgIikRcRj5Gu3fA3CdcYNOCnbG0AcOaiMjApWYXYlFwFIIv3EC3Nhb48bV+GOTQVu6yqAKGNRGRgSpRqrDln3isPHAFpSqBj/x6YqovO2NpI4Y1EZEBCovPxNwdEYhOzcVjTu3w+ZOu6NKanbG0FcOaiMiA3CrrjPVHWWeswJc84efSnpcJ1XIMayIiA6BSCfx6Oglf7o1GflEp3hrSAzPYGUtn8LdERKTnIlKyMWdHBM4nZWFA91ZYNNYNDu3ZGUuXMKyJiPRUdkEJvinrjNXKwhSrnvXAWA92xtJFDGsiIj0jhMDOc9fxRfAlZOYX4aUBdvjQ3xEtzNgZS1cxrImI9EhsWi7m7YjEyWu30LuzNTa94o1etuyMpesY1kREeuBOcSnWHo7Fhr+vwdzEGF+Mc8Pz/bqgCTtj6QWGNRGRDhNC4EDUTSzYFYWUrAJ2xtJTDGsiIh2VlHkHnwdF4lB0GhzbW+GPN33gzc5YeolhTUSkY4pKlQgMuYZ1ZZ2x5j7hjMmPdEVTdsbSWwxrIiId8ndMOgJ2RuJaRj6e6NUBc0c7o0MLM7nLIg1jWBMR6YCbOYVYtDsKuy/cQNfW5tgypR98e7IzlqFgWBPpKaVSCS8vL3Tq1Am7d++Wuxx6SKVKFTb/E49VB2NQrFThg+E9Mc23O5o1ZWcsQ8KwJtJTq1evhrOzM3JycuQuhR5Sxc5YQxzbYsEYV9i1tpC7LJIBz0Yg0kPJyckIDg7G66+/Lncp9BAy84sxc/t5TFx/EtkFJVj/oic2veLNoDZg3LMm0kPvv/8+vvrqK+Tm5spdCtWBSiXwW5jUGSuvsBTTfLvj3cccYGHKl2pDx78AIj2ze/dutGvXDp6enjh69Gi18wQGBiIwMBAAkJ6e3ojV0YNEpGRj7o4InEvKQr9urfDFODf0ZGcsKqMQQshdw11aUwiRLps9ezZ+/PFHGBsbo7CwEDk5ORg/fjy2bdtW7fxeXl4ICwtr5CrprpzCEnyz/wq2noxHKwsTfDbKGU/16cTOWIZDrV80w5pIjx09ehTLly+v8WxwhrU8hBAIOi91xsrIkzpjfcTOWIZIrbDmMDgRUSOr2BnL3bYFfpjsBXdba7nLIi3GPWsiA8c968Zzp7gU6w7H4vu/r8GsaRPMHOHEzljEPWsiIm2xPzL1XmesCX1tMXuUE9qwMxapiWFNRKRB93fG+n2aD/p1Y2csqhuGNRGRBhSVKvH9sWtYezgWTYwUmDPKGa88ys5Y9HBq/6tRKJygUAg1bsFQKFzKvverZZn9yubzqVf1oaGAQgGcPFmvxSAnB/j8c+DSpaqPRUVJ6zhwoH7r0Hc1bUNdWgdRAzgek4GRq/7G8v1XMMy5HQ595Is3BndnUNNDU2fPOhVAxVD1ArAWwBwAh++bb2DZ97WdrRJXtsxQ9cp8gG7dpKDu169ei0FYGLBgATB+fNXHzpyRvnp51W8d+q6mbahL6yCqh4qdsexam2Pzq94Y4thO7rJID9Qe1kJkAfj33n2Fwrvsux0QIqrSvArFewCuQojbtSwzHUD9L5vUtq10q6+zZwFTU8DFpepj4eFAjx5Ay5b1X48+q2kb6tI6iB5CqVKFLScTsPLAFRQrVXh/uAPe9O3BzljUYB5mTMYDQCGAy9U85gngNBSKl6BQnIFCUQCFIgoKxdBKcykU56FQbKo07dQpYMwYoEMHoFkzwM4OmDy55kp69wZefbXytLoux9kZ+PhjoKgIaNpUGvKeOLH88fBwwNsb+PFHoG9fwMxMCosjRyovRwjghx+kvXxzc8DWFvjgA6CgoObnoE7NKhWwZg3g7i6tv3t3aTi4pKTq9njlFeD776UazcyARx4Brl4FsrOBGTOA9u2lNx7vvCPV3BDPoaZtqM4yY2OlnwsIqLzct94CrKykPerafk81Uamk5SxcWHn67dvScrZsqfnn8/OBWbMAe3vAxET6mYq3FSvUqwOQfmdffCH9Ds3MAB8f4PJl6TmamwPXr6u/LNIK4QmZGL32OBbtjoKnXUsc+GAw3h/ek0FNDUsIUbcbECaA09VMVwggRwAJAtgrgPECeFIA0QJIqjCfiQCKBfBuhWneomlTIV55RYjdu4U4dEiI9euFeOcd8UBFRUI0bSrE6tXl00JDRZ2XExoqRPfuQjz5pBAnT0q3+HjpMZVKCCsrIbp0EeLxx4X4808hgoKEcHQUwta28nKmTBHC1FSI2bOF2L9fiHXrhGjeXIg333zwutWpubRUiPHjhbC2FmLFCiEOHxZi+XJpXZ9+WnV7dO4sxNixUp1btghhbi6En58QXl5CzJsnxIEDQsyYIQQgxI4dDfccHrQN1V3mm29K2zo9Xbq/YIEQJiZSvbWtozaXLknPNyio8vRDh6Tp588/+GdVKiH8/YWwsBBiyRLpOSxYIISRkVTPnDlCREWpV0dxsRDDhgnRtq0QGzYIsWuX9PuaOFGI0aOF+Phj9ZbTwDw9PWVZr667lVckZv5xXtjN2i0GLDko9ly8LlQqldxlke5RK3vrGtRNBFAggA3VPOYopP2oP++b/nbZdLOy+33L7g+qMM9q4eBQt6cXHi6Vf+xY+bR33xV1Xk5RkRQKK1dWfSw6WlrH+PGVp3/7rTT9zh3p/pYt0v0//6w83/Ll0rJLSx+8/tpqXr5cCGNjIcLCKk+fOlWIVq3K79/dHs88U3m+iROl6X/8UT6ttFRa5pIl5dPq8xwetA3rsswbN6Q3Fh9/LAWZkZEQv/1W+zrU8dNPUh3JyVXrMDWVQvRBvv1WCIVCCumKnnpKiDZtpDBX16pV0rJOnCifNn++EC1aSG9gMjLUX1YDYljXjVKpEr+cShC9F+wTPWYHiyXBUSKvsETuskh3qZW/dR0GdwLQDMC5ah7zLPv62X3T2wDIgRB3xz37QLpa2fkK86QhNlYa5rx4Ub1Kzp6VhiB79y6f1q4d6rycyEiguFga4r5feLj0dcmSytMzMoDmzaVhTEAa1hw8WBrKLi0tv7m4SMuuaWizppqFAFatAp55BvD0rPyYvT2QmQkUFkr3z56Vvt4/1JufLw2fVxwyLiiQ6mvdunxafZ7Dg7ZhXZZpYwO8/z6wdi0wbZo07P/MM7WvQx3h4dJ27tSp8vQzZwBXV2lY/UE2bQL8/KRbRU5O5cPogPT90KFVf76i9esBf3/p0MRd1tbSIYoPPyz/fahU0rbTnqsLUpmIlGxMWP8PPv3vRfRsZ4Xgdwdh9ihntrAkjatrWHuUfT1fzWN9AcRDiPuPZfcBcOG++1chRE6Facsxbx7w3/9KweLgAKxbV3MlZ89KJ341b14+7eOPUeflnDkjveB6eFT/WNeugKNj1XW7u0vfx8UBMTHAsWPSi37F26hR0jwtWjx4/TXVfOUKkJxcvpyKkpKkY8/NmpXX1KVL9bU+/njlaefLfn133+jU9zlUtw0fZpkODtIxaR8fYPr02tehrjNnqg/5s2eBPn0e/HM3b0rHkkeOrPrYjRvSG4y7Wraseh5DRampQHR01d9lcTHQqpUU1nddvAj89lv5GwGSXU5hCT4PisSYdceReOsOvnmmN36bNgCONmxhSY2jrm8H7+7GVhfWngDOVDO9D4Cd990/W2kOIYoASB/LiYoC5s+XTobq27fyXkhF1b3QmppKy6jrcu4P/bvCwx/8Ij92rPR9Sor0ddMmwM2t6rxGRtUvW52aVSppnoqhAEh7XIcPA8OGVa7p/lpTU6Xb/dPPngWaNCl/w1Hf51DdNqzrMg8flvaofXyAEyekNxQVR01q+j3VRAjg3DnpZLWK0tKkE7vuf1NQUUKC9LVDh8rTlUpgzx5gwoTyafPnA8bG0tfqxMZKX7t1q7ycrVul52VV9qIfFSUFekmJ9MZkxAhg2bLanyfVW26u9B4pJkZ63/jss4ClZeXOWJP6d8FjrXIRtHU5nuqzUu6SyYDUNaw9AMTdt1eMssarfQAsv296SwB2uBvOCoURAHcAD+7X5+IiDYf++ac0ZFodlQq4cAEYPfrBlaqzHEB6cazuo0BCSAHx8ceVp9++Lb2I332jcHdo1dS0/p/Fvr/muy/ssbGVg3nTJmlY+LvvpPt3t8fMmZWXd3do/P43NWfPSsO4d4fx6/scqtuGdVnmmTPAuHHA668DK1cCPXsCn30GBAfXvA51XL0KZGVJb04qWrtW2m417albl3VBio6uPP3LL6W/g2nTyqeFhwNvv/3gZRmVDWJlZpZP++476XlVfDPl4iJ9jrxHD+lvgRrF8ePSeySVSjpyZGEBfLwwD4/MiEDULakz1uwBFtj2bQA2h4Zi4cKF7DdNjeph9qxPVDO9B4AWqLpnfTcl7k53AGCJinvWCsW3AMzw00/SC/zVq8DixdJHfR59tPoqYmKAvLzKITR9unQsdvhw9ZcDSC/IZ84A+/ZJw7IODtKxw7sfd6purxQon961q3Ss8r33pL213r2BO3ekYeADB6ThbaMHHG2oreYmTaRjnAsWlH/sad8+4JtvpGOagwZV3h7V1WppKT2n+6dXnLc+z+FB21DdZcbGSsPM/v5SgBoZSR/hmjJFGkIfPLjm31NIiPRGZuNG4OWXq9Z296I2GzYAnTtLx6737y//uFZYWPlH8u7n4CD9jX39tfR5/h49gKAgKWTXri0fmQAePApzV+/eUt0LF0pfk5OlN1cTJgC7dkl76kOHSoc1wsOl3TpqFLm5UlDn5kr3FcZKNPWMQfN+1xCR0gRvDWiBqOBAvLlwL2bNmoWffvoJZtX9vRBpkrpnognApuws7oBqHnu27DGb+6Z/JIBCARiX3X+uynzADAGcEK1bC9GsmfSxqHnzhMjJefC5c7/8Ip3de+NG+bQ1a4R45BFRp+UIIcTFi0L06yf9DCDE339L03/9teo6hCg/g7ikwtmfGRnSx6G6dZMea9dOiMGDpZpqok7NGRlCTJ4sRPv20seHHnmk6tnVd7fH9euVp0+cKMSjj1aeVlxc/VnVD/schHjwNqxtmTduSI/5+gpRWFi+vNJSIZychPDxqX0dR45I9zdtqr62WbOks+Y3bxbCxkYIS0shXnxRiOBg6QzsiuuoTkKC9HExCwshzMyEGDiw6kfAkpKE6NCh9u20f78Qrq7SR+w6dhRi2zbpo2re3tLZ73l50nO3spK+bySGfjb4999Lv15ACDP7VNHpzUPCbtZu0XLYEWHUdJgwNbUUEydOFNu2bRNBQUEiODhY7Nu3Txw/flwkJiaK0po+KUFUO7UymP2sSb/dPYtbk9d237lT2nPftav+y0pOlvbQ09Lqvyw1GXo/61mzgG/+cwcth0VCVfgziq7fRmGCF0pvPwLgMZiaCnh4OMPGxgZKpRJKpRKlpaXIyclBYmIiMjIy0LFjR9jZ2aFLly5Vvnbp0gUWFhZyP03SXuxnTYSzZ6Vj4ZpU2xB4XXToIB3jd3SUzsmoy9XRqM6KSpW42ToOHV+LgRAKXN/wD5S5oQDiAbwDc/NMTJmyG6GhixEdHY1PP/0UkyZNQtMKH/crKipCcnIyEhMTkZCQgISEBJw6dQq///47EhMTkZiYCCsrK3Tp0gVdu3aFj48P/Pz84O7uzuPepDbuWZP+SkiQjp3//jvw9NNyV6O1DHXP+nhMBubvjMC1jHwUX7VB2j4XKHNHAggB4AvgKKyspMsBWFgIHDlyBEuWLEFMTAxmzpyJt99+W62wValUSEtLQ2JiIq5evYpjx47hwIEDyM3NxfDhw+Hv74/hw4ej0/3XASBDodY7NoY1kYEztLC+mVOIL4IvYdf567BrbY4FY1xhnN4Oo0YB+flDoFKFwMjIFxYWR/HXX8DAgZV/PjQ0FBs2bMCKFStgZfXwn7OOi4vDgQMHcODAARw+fBg2Njbw8/ODn58ffH19YWlpWc9nSjqCYU1EtTOUsC5VqrD1ZAK+KeuM9faQHpU6Y+XlAZ6eQ3DlSgh69vRFePhRNFZeKpVKnDlz5l54nz59Gp6envDz84O/vz+8vb05ZK6/eMyaiAgAwhNuY+6OCFy6kYPBPdti4RhXdG1T+aQvS0vplIErV6Svjblj26RJE3h7e8Pb2xufffYZ8vLy7g2Xv/TSSzA2NsZ7772HF198Eebm5o1XGGmNh2mRSUSkEzLzizFr+wVM+O4f3M4vxneT+mLLq95VglrbWFpaYtSoUVi5ciWio6OxZs0a7N69G3Z2dpg1axYSExPlLpEaGcOaiPSOSiXwa2giHltxFH+eSca0wd1x6CNfjOzVQeeGkxUKBYYNG4agoCD8+++/KC4uRp8+ffD000/j+PHj0KJDmaRBDGsi0iuR17MxUU87Y/Xo0QMrV65EfHw8Bg8ejFdffRVeXl7YunUrioqK5C6PNIgnmBEZOH05wSy3sATfHLiCLf/Eo6W5CWaPcsaEvp3qtCe9efNmxMfHo2vXrnjllVc0V2wDUalU2LNnD1avXo2LFy9i2rRpePPNN2Fzf/Mf0mY8G5yIaqfrYS2EwK4LN/DF7iikl3XG+sTfCS3Ma+hTroeioqKwZs0a/Pbbb5g4cSIWLlyIDvd3jCNtpFZYcxiciHRWbFoeJm04hXd/OYv2zZthx9uP4otxvQwuqAHAxcUF69evx9WrV9GyZUu4ublh8eLFKCgokLs0agAMayLSOQXFSny9LxojVx/DxZRsLBrrih3TH0XvztZylya7Vq1a4auvvkJoaCjOnj0LJycn/PLLLzwRTcdxGJzIwOnaMPjBqJsICIpESlYBxvfthNkjndHWyrRBlq1rx6zVcezYMXzwwQcwMTHB999/Dzc3N7lLosp4zJqIaqcrYZ2UeQcLdkXh4KWbcGhniUXj3DCge+sGXceQIUMQEhICX19fHD16tEGXLSeVSoVt27ahefPmGDdunNzlUGW8ghkR6b7iUhW+//sa1h6OgQIKzB7phCkDu6FpEx7FU5eRkRFefvllucugemBYE5HW+ic2A/N2RuBqej5GuNpg3pMu6GRtJndZRI2OYU2kZ5KSkvDyyy8jNTUVRkZGmDp1Kt577z25y6qTtJxCLP7rEnaeu44urcyx6RVvDHVqJ3dZRLLhOBKRnjE2NsaKFStw6dIl/Pvvv/j2228RFRUld1lqKVWqsOlEHIatCMGei6l4d5gD9n8w2KCCevv27ZgwYQLs7OxgZmYGR0dHzJ49G7m5uXKXhuTkZMyYMQM+Pj4wNzeHQqFAfHy8xte7b98+PPbYY7CxsYGpqSlsbW3xzDPP6MzfdUNgWBPpmQ4dOqBv374AACsrKzg7OyMlJUXmqmp3JvE2xqw7gQW7ouDRxRr7PhiMD/163mthaSiWL1+OJk2aYMmSJdi7dy/eeustfPfdd/Dz84NKpZK1ttjYWPz+++9o2bIlBg0a1GjrzczMhKenJ9atW4f9+/dj6dKliIyMxIABA5CQkNBodchKCKEtNyJqYHFxcaJz584iOzv7gfN4eno2YkVVZeYViU//PC/sZu0W/RcfFMEXrguVSiVLLb6+vgKA8PX1lWX9QgiRlpZWZdqWLVsEAHHo0KEGXZednZ0ICAhQe36lUnnv+++//14AEHFxcQ1ak7qio6MFALF8+XJZ1t+A1MpI7lkT6am8vDxMmDABq1atQvPmzSs9FhgYCC8vL3h5eSE9PV2W+lQqgd9PJ+GxFUfxe1gy3hjUDQc/8sUoHeyM1ZDatm1bZZq3tzcAVBohiY2NRdOmTREQEFBp3rfeegtWVlYa+TiekZH2REbr1tLH9po2NYyr1fEEMyI9VFJSggkTJmDSpEkYP358lcenTp2KqVOnApA+Z93Yoq7nYN7OCIQn3IaXXUt88ZQbnGya1/6DGubh4VHpq7YICQkBADg7O9+bZm9vj9dffx0rV67EjBkz0KZNGyxcuBAbN25EcHCwLL/X6gghoFQqa51PoVCgSZOaD3kolUoolUokJCTg008/hY2NDZ577rmGKlWrMayJ9IwQAq+99hqcnZ3x4Ycfyl1OJbmFJVh5IAZbTsajhVlTfD3RHRP62sLISDv2pFetWiV3CVWkpKRg/vz5GD58eJUADggIwNatW/Hll1/CyckJCxYswC+//ILhw4dXWc6DQlOlUqG0tPTefXVCsy5CQkIwdOjQWudT50I0/fv3R3h4OADpzcrhw4fRrp1hnHzIK5gR6Znjx49j0KBB6NWr171hyyVLlmDUqFHVzt8YVzATQmD3hRtYVNYZ6/l+XTDzcUdYm5todL26Li8vD0OGDMH169cRGhoKW1vbKvPMmTMHK1asQGlpKVavXo3p06dXu6yjR482WGgCwIYNG/DGG28gLi4OXbt2feB8ubm5uHz5cq3Ls7KygqOjY43zXLp0CTk5Obh27RqWL1+Omzdv4vjx4zWuXwfwCmZEhmjgwIFa1bThWnoe5u+MxPHYDLh1ao7Al73gwYYbtSosLMSYMWNw7do1hISEVBvUAODg4ICioiIMHDjwgUENAJ6enjh9+nSlaWPGjMHo0aPvHRIBpNBsSJaWlmodVlDnPIW7hwH69++PkSNHomvXrli2bBnWr19f7zq1HcOaiDSioFiJ/zsai/+EXINpUyMsHOuKSf3t0ERLhryrc+7cOWRlZcHa2lrW49Z3zznvQ8OwAAAXyklEQVQIDQ3FwYMH0atXr2rnO3z4MKZNmwYfHx+cOHEC58+fR+/evaud18rKqsowuomJCTp27KjR49sNOQxekbW1Nezt7REbG1uP6nQHw5qIGtyhS1JnrOTbBXiqTyfMHuWEdlbN5C6rVu+//77sjTxUKhUmTZqEQ4cOITg4GAMGDKh2vjNnzmDcuHH3TjLr2bMnPvvsMwQHBzdyxTWrbo++OnXdo7958yaio6MxadKkhy1NpzCsiajBJN+WOmMdiLoJ+3aW+OWNAfDp0bCdsfTd9OnT8ccff2DOnDmwsLDAv//+e+8xW1tb2NraIjY2FiNHjoS/vz/Wrl0LIyMjBAQEYMqUKTh27BgGDx6ssfq2b98OAPdO9NqzZw/atm2Ltm3bwtfXt8r81e3R19VTTz2Fvn37wt3dHc2bN8eVK1ewcuVKGBsb46OPPqrXsnWGuh/IboQbEcmgIS6KUlSiFN8eiRGOc/8STnP3iO+OxoqiEmXtP6hltOGiKHZ2dgLSCbdVbgEBAeLGjRuiW7duwtfXVxQWFt77udLSUuHk5CR8fHzqtK66XBRFCPHA2jS5zZYtWyb69u0rWrRoIczMzETPnj3F1KlTZbsgSwNTKyN5NjiRgavv2eD/XM3AvB1SZ6zHXdtj/pOuOtsZS1/7WZNW49ngRKQ5abmFWBJ8CTvOXUfnVmbY+IoXHnNqL3dZRHqJYU1EdVKqVGHbvwlYsf8KikpVePcxe7w91N7gGm4QNSaGNRGp7WzibczdEYHI6zkY5NAGC8e6oVsbC7nLItJ7DGsiqtXt/GJ8te8yfj2diHZWpvj2hb4Y1cvGoBtuEDUmhjURPZBKJbD9TDKW7YlGdkEJpjzaDR/49YSlKV86iBoT/+OIqFqXbuRg3o4IhJV1xlo0zg3OHeTvjKVJPAOctBXDmogqySsqxcoDV7D5H+3sjEVkiBjWRARAukBS8EWpM1ZaLjtjEWkThjUR4Vp6HgKCIvF3TAZcOzbH+hc90adLS7nLIqIyRnIXQETyKSxR4mZOIUas+hvnErOwYIwrgt4ZaLBBPWTIECgUCgwZMkTuUogq4Z41kYE6Ep2G+UERSMstwtvuHXSmMxaRIWJYExmYlKwCLAiKxP6yzljd2lhg5bPy9W4motoxrIkMRHGpCj8cj8OaQzEAgFkjnPDawG545Ge+DBBpO/6XEhmAk1dvYd7OCMSm5cHfpT3mP+kC25bmcpdFRGpiWBPpsbTcQiz9Kxr/O5vCzlhEOoxhTaSHlCqBn04l4Ot9l1FUws5YRLqOYU2kZ84lZWHujouISMnBQPs2WDjWFd3bWspdFhHVA8OaSE9k3ZE6Y/0SKnXGWvt8H4x278DOWER6gGFNpONUKoE/zyRjaYXOWO8Pd4BVs6Zyl6ZzVq1ahaysLFhbW8tdClElDGsiHRadKnXGOh1/G552LfGFAXTG0iQPD37enLQTw5pIB+UVlWLVgSvY9E88mjczxlcT3TGRnbGI9BbDmkiHCCHw18VULNwdibTcIjznLXXGamnBzlhE+oxhTaQj4jLyMX9nxL3OWN+96Im+BtpwQ1Pef/99nDt3Dh4eHli1apXc5RDdw7Am0nKFJUr839GrWH/0KkyNjfD5ky54cYAdjJuwaV5DO3fuHEJCQuQug6gKhjWRFjsSnYaAoEgkZt7BOI+O+OwJZ3bGIjJADGsiLZSSVYCFuyKxL/ImerS1wM9v9McjPdrIXRYRyYRhTaRFiktV2HgiDqsPxkBAYOYIR7w+sDtMjDnkTWTI+ApApCX+vXYLT6z5G8v2RGOQQxsc/NAXbw+xf6ig3rt3LxwdHWFvb49ly5ZpoFoiakzcsyaSWXpuEZb+dQn/PZsC25Zm+GGyF4Y5P3xnLKVSienTp+PAgQOwtbWFt7c3xowZAxcXlwasmogaE8OaSCZKlcDPpxLwVVlnrBmP2ePtIfYwM6lfZ6zQ0FDY29uje/fuAIDnnnsOO3fuZFgT6TCGNZEMziVlYd6OCFxMycaj9q2xcKwbejRQZ6yUlBR07tz53n1bW1ucOnWqQZZNRPJQCCHkrgEAMGLECJGRkdGgy0xPT0fbtm0bdJm6ituiMrm2h1IlkJpTiMz8YhgbKdDR2gwtzBq24cbt27eRk5MDOzs7AMCtW7eQn5+PLl263JsnPT0dd//fioqKeE3sMrdu3cLt27fRsmVLtG7dWu5ytAJfO8ppYluEh4fvE0KMqG0+rQlrAA1eiJeXF8LCwhp6sTqJ26Kyxt4eQghsD0/Gsj3RyCoowWSfrvjATzOdsU6ePInPP/8c+/btAwAsXboUADB79uxq57ewsEB+fn6D16Gr+L9SGbdHOQ1tC7Uu6M9hcCINq9gZq28Xa/w4rhdcOmquM5a3tzdiYmIQFxeHTp064ddff8XPP/+ssfURkeYxrIk0JK+oFKsPXsHGE2WdsSa4Y6Kn5jtjGRsbY926dXj88cehVCoxZcoUuLq6anSdRKRZeh3WU6dOlbsErcFtUZkmt4cQAnsiUrFwVxRScwrxfL/OmPm4U6N2xho1ahRGjRql1rxt2vDKaBXxf6Uybo9ycm4LvT5mTdTY4jLyERAUiWNX0uHSoTm+eMpN6ztj8Zgkkax4zJqosdzfGSvgSRe8xM5YRNRA9PqVZN68eXB3d4eHhwf8/f1x/fp1uUuS1SeffAInJye4u7vjqaeeQlZWltwlyeqPP/6Aq6srjIyM6rVneeRyGvxXHsOaQzEY2csGhz7yxauPdtOJoN67dy8iIiJ4WVIAU6ZMQbt27eDm5iZ3KbJLSkrC0KFD4ezsDFdXV6xevVrukmRVWFiIfv36oXfv3nB1dUVAQEDjFyGE0JZbg8vOzr73/erVq8W0adM0sRqdsW/fPlFSUiKEEGLmzJli5syZMlckr6ioKBEdHS18fX3F6dOn6/zzKbfviGlbw4TdrN1i6PIj4kRMugaq1JzS0lLRvXt34ebmJoqKioS7u7uIjIyUuyzZhISEiPDwcOHq6ip3KbK7fv26CA8PF0IIkZOTIxwcHAz6b0OlUonc3FwhhBDFxcWiX79+4uTJkw21eLUyUq+HwZs3L/94TH5+PhQKzZ6Fq+38/f3vfT9gwABs375dxmrk5+zs/FA/V6JUYePxOKw+FAOVEPjkcUe8MUj3OmPdvSzprVu3YGJiYvCXJR08eDDi4+PlLkMrdOjQAR06dAAAWFlZwdnZGSkpKQb7t6FQKGBpKV1hsKSkBCUlJY2eJ3od1gAwZ84cbN26FS1atMCRI0fkLkdrbNy4Ec8++6zcZeicU9duYe6OCMSk5WG4c3sEPOmCzq3M5S7rody9LOmtW7cA8LKkVL34+HicPXsW/fv3l7sUWSmVSnh6eiI2NhbTp09v9O2hW7sC1Rg+fDjc3Nyq3Hbu3AkAWLx4MZKSkjBp0iSsW7dO5mo1r7btAUjbxNjYGJMmTZKx0sahzvZQR3puET787RyeDfwXBSVKbHjZCxsme+lsUAPSIbD7GfroE1WWl5eHCRMmYNWqVZVGKg1RkyZNcO7cOSQnJyM0NBQRERGNun6d37M+ePCgWvO98MILeOKJJ7BgwQINVySv2rbHli1bsHv3bhw6dMggXpjV/ft4kIqdsQpLlJg+tAfeGepQ785Y2sDW1hZJSUn37icnJ6Njx44yVkTapKSkBBMmTMCkSZMwfvx4ucvRGtbW1hgyZAj27t3bqCcj6vyedU1iYmLufR8UFAQnJycZq5Hf3r178eWXXyIoKAjm5rq7R9hYzidlYdy3JzBvZyTcbVtgz3uD8cnjTnoR1ED5ZUmLiopQXFyMX3/9FWPGjJG7LNICQgi89tprcHZ2xocffih3ObJLT0+/9+mZgoICHDx4sNHzRK8vijJhwgRcvnwZRkZGsLOzw/r169GpU6eGXo3OsLe3R1FR0b1uQgMGDMD69etlrko+//vf/zBjxgykp6fD2toaHh4e2LdvH7LvlODr/dH46VQi2liaYt5oFzzp3kEvRyL++usvjB8/Hp06dcKUKVMwZ84cuUuSzfPPP4+jR48iIyMD7du3x4IFC/Daa6/JXZYsjh8/jkGDBqFXr14wMpL26ZYsWaL2VfH0zYULFzB58mQolUqoVCo888wzmD9/fkMtXq0XFr0Oa6K6EELgv2dSsOSvS7h9pxiTH+mKD/x6orkGOmNpE17BjEhWvIIZkboup+Zi3o4IhMZnok8Xa2x9rR9cO7aQuywiIgAMazJw+UWlWH0oBhuPx8GymTG+nNALT3t21nhnLCKiumBYk0ESQmBvRCoW7o7CjexCPOfdGTNHOKFVI3bGIiJSF8OaDE58WWeskCvpcO7QHOte6AtPO+3ujEVEho1hTQajsESJ9SFX8X9Hr8KkiRHmj3bByz7sjEVE2o9hTQbh6OU0BARFIuHWHTzZuyPmPuGM9s2byV0WEZFaGNak165nFWDR7ijsiUhF9zYW2PZafwx0aCN3WUREdcKwJr1UolRh04k4rDoYA6VK4GP/nnhjcHeYGuvH1ceIyLAwrEnvhMZlYt6OCFy+mYthTu3w+RhXnW64QUTEsCa9kZFXhKV/RePPM8noZG2GwJc84e9qI3dZRET1xrAmnadUCfwSmoiv9kajoESJt4f0wDuP2cPchH/eRKQf+GpGOu1icjbm7riI88nZ8OneGovGucK+nZXcZRERNSiGNemk7IISLN93GdtOJaCNpSlWP+eBMb076mVnLCIihjXpFCEE/ndW6oyVmV+MyT5d8aG//nfGIiLDxrAmnXHlZi7m7ohAaFwmPDpbY/Or/eDWiZ2xiEj/MaxJ6+UXlWLN4Rj88HccLEyNsXR8Lzzrxc5YRGQ4GNaktYQQ2BeZigW7pM5Yz3jZYtYIJ7S2NJW7NCKiRsWwJq2UcEvqjHX0cjqcbKyw7oU+8LRrJXdZRESyYFiTViksUeI/Idfw7dFYNDVSYN5oF0xmZywiMnAMa9IaIVfSEbAzAvG37mC0ewfMfcIFNi3YGYuIiGFNsruRLXXG+utiKrq1scCPr/XDIIe2cpdFRKQ1GNYkmxKlCptPxGPVwSsoVQl85NcTU33ZGas+PvnkE+zatQsmJibo0aMHNm3aBGtra7nLIqJ64oFAksXp+EyMXnMci/+6hP7dW+Pgh76YMcyBQV1Pfn5+iIiIwIULF9CzZ08sXbpU7pKIqAFwz5oaVUZeEZbticb28PLOWH4u7XmZ0Abi7+9/7/sBAwZg+/btMlZDRA2FYU2NomJnrDvFSrw1pAdmsDOWRm3cuBHPPvus3GUQUQPgKyVpXMXOWAO6t8KisW5waM/OWA9r+PDhSE1NrTJ98eLFGDt27L3vjY2NMWnSpGqXERgYiMDAQABAenq65oologahEELIXcNdWlMINYzsghKs2H8ZP/6bgNYWppg32pmdsRrBli1bsH79ehw6dAjm5ua1zu/l5YWwsLBGqIyIqqHWCyL3rKnBCSGw41wKFgeXd8b6wK8nWpixM5am7d27F19++SVCQkLUCmoi0g3cs6YGFVPWGetUXCZ6d7bG4nFu7IzViOzt7VFUVITWrVsDkE4yW79+fY0/wz1rIllxz5oaz/2dsZY81QvPebMzVmOLjY2VuwQi0gCGNdWL1BnrJhbuisR1dsYiItIIhjU9tMRbdxAQFIEjZZ2x1jzfB15d2RmLiKihMaypzgpLlAg8dg3fHomFsZECc59wxiuPdGVnLCIiDWFYU50cu5KO+WWdsZ5w74B57IxFRKRxDGtSS2p2IRbtjkLwxRvsjEVE1MgY1lSjEqUKW/6Jx8oDUmesD/16Yho7YxERNSqGNT3Q6fhMzNsRgejUXAx1bIsFY9zQpTUvtEFE1NgY1lTFrbwiLC3rjNWxRTP85yVP+LMzFhGRbBjWdI9KJfDL6UR8tfcy8otK2RmLiEhL8FWYAJR1xtoZgfNJWeyMRUSkZRjWBi67oATflHXGamVhilXPemCsBztjERFpE4a1gSrvjBWNzPwivDTADh/6O7IzFhGRFmJYG6D7O2NtftWbnbGIiLQYw9qA3CkuxZpDsdjw9zV2xiIi0iEMawMghMD+qJtYuCsKKVkFeNrTFp+OZGcsIiJdwbDWc4m37uDzXZE4HJ0GJxsr/PGmD7zZGYuISKcwrPVUUakS/wmp3Blr8iNd0ZSdsYiIdA7DWg/9HZOO+TsjEZeRz85YRER6gGGtR1KzC7EoOArBF26ga2tzbJ3SD4N7sjMWEZGuY1jrgVKlCpvLOmOVlHXGmjq4O5o1ZWcsIiJ9wLDWcWHxmZhboTPW52NcYdfaQu6yiIioATGsdVRmfjGW7bmE38OkzljrX/TE467sjEVEpI8Y1jpGpRL49XQSvtoXjbzCUrzp2wPvDmNnLCIifcZXeB0SkZKNuTsicC4pC/27tcIX49gZi4jIEDCsdUBOYQm+2X8FW0/Go5WFCVY+2xvjPDpxyJuIyEAwrLWYEAJB56/ji+BLyMiTOmN9xM5YREQGh2GtpWLTcjFvRyROXruF3rYtsHGyN3rZsjMWEZEhYlhrmYJiJdYejsH3f1+DWdMm+GKcG57v1wVN2BmLiMhgMay1yIGom/g8KBIpWQWY0NcWs0c5oQ07YxERGTyGtRZIyryDBbsicfBSGhzbW+H3aT7o142dsYiISMKwllFRqRIb/o7D2sMxMFIoMGeUM155lJ2xiIioMoa1TI7HZGD+zghcy8jHSDcbzH/SBR1amMldFhERaSGGdSO7mVOIL4IvYdf567BrbY7Nr3pjiGM7ucsiIiItxvHWRlKqVGHj8TgMWxGCfZGpeH+4A/a9P5hBTRqxfPlyKBQKZGRkyF0KETUA7lk3gvCE25i7IwKXbuTAt2dbLBzLzlikOUlJSThw4AC6dOkidylE1EAY1hqUmV+ML/dE47ewJHRo0QzrX+yLx11teJlQ0qgPPvgAX331FcaOHSt3KUTUQBjWGqBSCfweloRle6XOWNMGd8e7wxxgYcrNTZoVFBSETp06oXfv3jXOFxgYiMDAQABAenp6Y5RGRPWgEELIXcNdWlNIfURelzpjnU3MQr+urbBonBscbdgZixrO8OHDkZqaWmX64sWLsWTJEuzfvx8tWrRA165dERYWhjZt2tS4PC8vL4SFhWmqXCKqmVpDrdzVayC5hSX45sAVbPknHi3NTfDNM73xVB92xqKGd/DgwWqnX7x4EXFxcff2qpOTk9G3b1+EhobCxsamMUskogbGsK6n+ztjvdjfDh/7O6KFOTtjUePq1asX0tLS7t1Xd8+aiLQfw7oeYtPyMH9nBP65egvuti3ww2QvuNtay10WERHpGYb1QygoVmLdkRgEHpM6Yy0a54YX2BmLtEx8fLzcJRBRA2FY19HBqJsIYGcsIiJqRAxrNUmdsaJw8NJN9Gxvid+mDkD/7q3lLouIiAwAw7oW93fGmj3SCVMGdmNnLCIiajQM6xqciM3AvJ0RuJYudcaaN9oFHa3ZGYuIiBoXw7oaaWWdsYLYGYuIiLQAw7qCUqUKP/6bgBX7r6BYqcL7wx3wpm8PNGvaRO7SiIjIgDGsy5xJvI25/4tA1I0cDO7ZFgvHuKJrG3bGIiIi+Rl8WN/OL8aXe6Px6+kk2DRvhu8m9cUIN3bGIiIi7WGwYa1SCfwRnoRle6KRy85YRESkxQwymaKu52Dujos4w85YRESkAwwqrO/vjLXi6d4Y35edsYiISLsZRFgLIbDrwg18sTsK6XlFmNS/Cz7xd2JnLCIi0gl6H9ZX06XOWCdib6FXpxb4/mUv9O7MzlhERKQ79DasC4qV+PZILP5z7CqaNW2CRWNd8UJ/O3bGIiIinaOXYR2Rko03t4Uj+XYBxvfthNkjndHWip2xiIhIN+llWHeyNkNHazMsf7o3BrAzFhER6Ti9DOuWFib4fZqP3GUQERE1CPZ5JCIi0nIMayIiIi3HsCYiItJyDGsiIiItx7AmIiLScgxrIiIiLcewJiIi0nIMayIiIi3HsCYiItJyDGsiIiItpxBCyF0DEclIoVDsFUKMkLsOInowhjUREZGW4zA4ERGRlmNYExERaTmGNRERkZZjWBMREWk5hjUREZGWY1gTERFpOYY1ERGRlmNYExERaTmGNRERkZb7f04KnmhrYEgzAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "x=np.linspace(-3,3,20)\n", "y=2*x+1\n", "# 绘制直线\n", "plt.figure(num=1,figsize=(8,5),)\n", "plt.plot(x,y)\n", "# gca='get current axis/获取当前轴线'\n", "ax=plt.gca()\n", "# spines就是脊梁,即四个边框\n", "# 取消右边与上边轴\n", "ax.spines['right'].set_color('none')\n", "ax.spines['top'].set_color('none')\n", "ax.xaxis.set_ticks_position('bottom')\n", "ax.spines['bottom'].set_position(('data',-0)) # 也可以是('axes',0.1)后面是百分比,相当于定位到10%处\n", "ax.yaxis.set_ticks_position('left')\n", "ax.spines['left'].set_position(('data',0))\n", "\n", "# 绘制特定散点\n", "x0=1\n", "y0=2*x0+1\n", "# plot散点图,上述plt.plot(x,y)变为plt.scatter(x,y)绘制出来就是散点图\n", "# s代表大小,b代表blue\n", "plt.scatter(x0,y0,s=50,color='b')\n", "# 把两个点放进去plot一下,画出垂直于x轴的一条线,[x0,x0]表示两个点的x,[0,y0]表示两个点的y\n", "\n", "\n", "# 绘制(x0,y0)垂直于x轴的线\n", "\n", "# k--表示黑色虚线,k代表黑色,--表示虚线,lw表示线宽\n", "plt.plot([x0,x0],[0,y0],'k--',lw=2.5)\n", "# 添加注释 annotate\n", "\n", "'''\n", "其中参数xycoords='data' 是说基于数据的值来选位置, xytext=(+30, -30) 和 textcoords='offset points'\n", "对于标注位置的描述 和 xy 偏差值, arrowprops是对图中箭头类型的一些设置.\n", "'''\n", "\n", "plt.annotate(r'$2x+1=%s$'%y0,xy=(x0,y0),xycoords='data',xytext=(+30,-30),textcoords='offset points',fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))\n", "# 添加注释 text\n", "\n", "# 其中-3.7, 3,是选取text的位置, 空格需要用到转字符\\ ,fontdict设置文本字体.\n", "plt.text(-3.7,3,r'$This\\ is\\ the\\ some\\ text.\\mu\\ \\sigma_i\\ \\alpha_t$',\n", " fontdict={'size':'16','color':'red'})\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.tick能见度" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "x = np.linspace(-3, 3, 50)\n", "y = 0.1*x\n", "\n", "plt.figure()\n", "# 设置 zorder 给 plot 在 z 轴方向排序\n", "plt.plot(x, y, linewidth=10, zorder=1)\n", "plt.ylim(-2, 2)\n", "ax = plt.gca()\n", "ax.spines['right'].set_color('none')\n", "ax.spines['top'].set_color('none')\n", "ax.spines['top'].set_color('none')\n", "ax.xaxis.set_ticks_position('bottom')\n", "ax.spines['bottom'].set_position(('data', 0))\n", "ax.yaxis.set_ticks_position('left')\n", "ax.spines['left'].set_position(('data', 0))\n", "\n", "\n", "# 调整坐标\n", "\n", "# 对被遮挡的图像调节相关透明度,本例中设置 x轴 和 y轴 的刻度数字进行透明度设置\n", "for label in ax.get_xticklabels()+ax.get_yticklabels():\n", " label.set_fontsize(12)\n", " '''\n", " 其中label.set_fontsize(12)重新调节字体大小,bbox设置目的内容的透明度相关参,\n", " facecolor调节 box 前景色,edgecolor 设置边框, 本处设置边框为无,alpha设置透明度.\n", " '''\n", " # 其中label.set_fontsize(12)重新调节字体大小,bbox设置目的内容的透明度相关参,\n", "# facecolor调节 box 前景色,edgecolor 设置边框, 本处设置边框为无,alpha设置透明度.\n", " label.set_bbox(dict(facecolor='white',edgecolor='none',alpha=0.7))\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 重要参考资料-A Brief matplotlib API Primer(一个简单的matplotlib API入门)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 这个内容来自《利用python进行数据分析第二版》,主要内容:\n", "\n", "### 1 Figures and Subplots(图和子图)\n", "### 2 Colors, Markers, and Line Styles(颜色,标记物,线样式)\n", "### 3 Ticks, Labels, and Legends(标记,标签,图例)\n", "### 4 Annotations and Drawing on a Subplot(注释和在subplot上画图)\n", "### 5 Saving Plots to File(把图保存为文件)\n", "### 6 matplotlib Configuration(matplotlib设置)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "要用Jupyter notebook进行可交互式的绘图,需要执行下面的语句,这样就可以直接在Notebook里绘图了。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "%matplotlib notebook" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = np.arange(10)#生成数据\n", "data" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如果实在ipython里执行,可以看到一个空白的绘图窗口出现,但是在jupyter中没有任何显示,除非我们输入一些命令。plt.figure有一些选择,其中figsize保证figure有固定的大小和长宽比,这样也方便保存到磁盘中。\n", "\n", "我们不能在一个空白的figure上绘图,必须要创建一个或更多的subplots(子图),用add_subplot:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "ax1 = fig.add_subplot(2, 2, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这行代码的意思是,figure是2x2(这样一共有4幅图),而且我们选中4个subplots(数字从1到4)中的第1个。如果要创建另外两个子图,可以输入:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "ax2 = fig.add_subplot(2, 2, 2)\n", "ax3 = fig.add_subplot(2, 2, 3)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure() \n", "ax1 = fig.add_subplot(2, 2, 1) \n", "ax2 = fig.add_subplot(2, 2, 2) \n", "ax3 = fig.add_subplot(2, 2, 3)\n", "\n", "# 下面出现交互式界面后,不要关闭,运行之后的命令,可以看到最后一副图中出现了线" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如果输入`plt.plot([1.5, 3.5, -2, 1.6])`这样的命令,matplotlib会把图画在最后一个figure的最后一个子图上。" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plt.plot(np.random.randn(50).cumsum(), 'k--')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "'k--'是一个style(样式)选项,它表示使用黑色的虚线。在这里,fig_add_subplot返回的是一个AxesSubplot对象,我们可以直接在空白的subplot上绘图,直接在对应的AxesSubplot对象上调用方法即可:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "_ = ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, axes = plt.subplots(2, 3)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[,\n", " ,\n", " ],\n", " [,\n", " ,\n", " ]],\n", " dtype=object)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "axes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这个操作是很有用的。axes能用一个二位数据来索引,例如,axes[0, 1]。我们可以使用sharex和sharey来指定不同subplot有相同的x-或y-axis(其实就是令坐标轴的范围相同),这能让我们在同一范围内进行数据之间的比较。不然的话,matplotlib会自动绘图的范围不一定是一样的。\n", "\n", "### Adjusting the spacing around subplots(调整subplot直接的间隔)\n", "\n", "默认情况下,matplotlib会在subplot之间留下一定间隔的边距,这取决于绘图的高度和跨度。所以如果我们调整绘图的大小,它会自动调整。我们可以用Figure对象下的subplots_adjust方法来更改间隔,当然,也可以用第一层级的函数:\n", "\n", " subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)\n", " \n", "wspace和hspace控制figure宽度和长度的百分比,可以用来控制subplot之间的间隔。这里有一个例子,我们让间隔为0:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure() # 直到下一个黑体标题出现前,不要关闭这个fig" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "ax = fig.add_subplot(1, 1, 1)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ax.plot(np.random.randn(1000).cumsum())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "为了改变x-axis tick(x轴标记),使用set_xticks和set_xticklabels。前者告诉matplotlib沿着x轴的范围,把标记放在哪里;默认会把所在位置作为标签,但我们可以用set_xticklabels来设置任意值作为标签:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "ticks = ax.set_xticks([0, 250, 500, 750, 1000])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],\n", " rotation=30, fontsize='small')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "rotation选项让x轴上的标记标签有一个30度的旋转。set_xlabel给x轴一个名字,而set_title给subplot一个标题:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5,1,'My first matplotlib plot')" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ax.set_title('My first matplotlib plot')" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5,99.92,'Stages')" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ax.set_xlabel('Stages')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "用相同的流程来更改y轴,把上面代码里的x变为y。axes类有一个set方法,能让我们一次设置很多绘图特性。对于上面的例子,我们可以写成下面这样:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Text(0.5,99.92,'Stage'), Text(0.5,1,'My first matplotlib plot')]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "props = {\n", " 'title': 'My first matplotlib plot',\n", " 'xlabel': 'Stage'\n", "}\n", "\n", "ax.set(**props)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Adding legends (添加图例)\n", "\n", "图例对于绘图很重要。有很多方式可以添加图例。最简单的方法是用label参数:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "from numpy.random import randn" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "Text(0.5,1,'Important dates in the 2008-2009 financial crisis')" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import datetime\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(1, 1, 1)\n", "\n", "data = pd.read_csv('examples/spx.csv', index_col=0, parse_dates=True)\n", "spx = data['SPX']\n", "\n", "spx.plot(ax=ax, style='k-')\n", "\n", "crisis_data = [\n", " (datetime(2007, 10, 11), 'Peak of bull market'),\n", " (datetime(2008, 3, 12), 'Bear Stearns Fails'),\n", " (datetime(2008, 9, 15), 'Lehman Bankruptcy')\n", "]\n", "\n", "for date, label in crisis_data:\n", " ax.annotate(label, xy=(date, spx.asof(date) + 75),\n", " xytext=(date, spx.asof(date) + 225),\n", " arrowprops=dict(facecolor='black', headwidth=4, \n", " width=2, headlength=4),\n", " horizontalalignment='left', verticalalignment='top')\n", " \n", "# Zoom in on 2007-2010\n", "ax.set_xlim(['1/1/2007', '1/1/2011'])\n", "ax.set_ylim([600, 1800])\n", "\n", "ax.set_title('Important dates in the 2008-2009 financial crisis')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在这幅图里,有一些点是值得强调的:ax.annotate方法能在x和y坐标指示的位置画出标签。我们可以用set_xlim和set_ylim方法来手动地设置开始和结束的边界,而不是用matplotlib的默认边界。最后,ax.set_title添加一个主标题。\n", "\n", "可以联网看matplotlib gallery上查看更多关于标注的例子。\n", "\n", "要想画出图形的话,更需要细心一些。matplotlib有一些对象可以用来表示一些常见的图形,被称之为patches。其中一些,比如Rectangle和Circle,在matplotlib.pyplot也有,但是全套画图形的方法还是在matplotlib.patches里。\n", "\n", "给图中添加一个图形,必须先添加一个patch对象,shp,然后通过调用ax.add_patch(shp)把它添加到subplot中:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('