Added matplotlib sections about images and lines

main
Aurélien Geron 2016-02-17 23:53:23 +01:00
parent a1e4e9bb5e
commit 91c616af20
1 changed files with 170 additions and 10 deletions

View File

@ -6,7 +6,7 @@
"source": [ "source": [
"# Tools - matplotlib\n", "# Tools - matplotlib\n",
"\n", "\n",
"This notebook demonstrates how to use the matplotlib library to plot beautiful graphs." "*This notebook demonstrates how to use the matplotlib library to plot beautiful graphs.*"
] ]
}, },
{ {
@ -902,7 +902,9 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"## Lines" "## Lines\n",
"You can draw lines simply using the `plot` function, as we have done so far. However, it is often convenient to create a utility function that plots a (seemingly) infinite line across the graph, given a slope and an intercept. You can also use the `hlines` and `vlines` functions that plot horizontal and vertical line segments.\n",
"For example:"
] ]
}, },
{ {
@ -914,11 +916,20 @@
"outputs": [], "outputs": [],
"source": [ "source": [
"from numpy.random import randn\n", "from numpy.random import randn\n",
"\n",
"def plot_line(axis, slope, intercept, **kargs):\n",
" xmin, xmax = axis.get_xlim()\n",
" plt.plot([xmin, xmax], [xmin*slope+intercept, xmax*slope+intercept], **kargs)\n",
"\n",
"x = randn(1000)\n", "x = randn(1000)\n",
"y = 3*x + 5 + randn(1000)*2\n", "y = 0.5*x + 5 + randn(1000)*2\n",
"plt.axis([-2.5, 2.5, -5, 15])\n", "plt.axis([-2.5, 2.5, -5, 15])\n",
"plt.scatter(x, y)\n", "plt.scatter(x, y, alpha=0.2)\n",
"plt.vlines(0, -numpy.inf, numpy.inf)\n", "plt.plot(1, 0, \"ro\")\n",
"plt.vlines(1, -5, 0, color=\"red\")\n",
"plt.hlines(0, -2.5, 1, color=\"red\")\n",
"plot_line(axis=plt.gca(), slope=0.5, intercept=5, color=\"magenta\")\n",
"plt.grid(True)\n",
"plt.show()" "plt.show()"
] ]
}, },
@ -954,7 +965,7 @@
"execution_count": 36, "execution_count": 36,
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"scrolled": false "scrolled": true
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -976,6 +987,155 @@
"plt.show()" "plt.show()"
] ]
}, },
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Images\n",
"Reading, generating and plotting images in matplotlib is quite straightforward.\n",
"\n",
"To read an image, just import the `matplotlib.image` module, and call its `imread` function, passing it the file name (or file object). This returns the image data, as a NumPy array. Let's try this with the `my_square_function.png` image we saved earlier."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import matplotlib.image as mpimg\n",
"\n",
"img = mpimg.imread('my_square_function.png')\n",
"print img.shape, img.dtype"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have loaded a 288x432 image. Each pixel is represented by a 4-element array: red, green, blue, and alpha levels, stored as 32-bit floats between 0 and 1. Now all we need to do is to call `imshow`:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"plt.imshow(img)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tadaaa! You may want to hide the axes when you are displaying an image:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"plt.imshow(img)\n",
"plt.axis('off')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's just as easy to generate your own image:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"img = numpy.arange(100*100).reshape(100, 100)\n",
"print img\n",
"plt.imshow(img)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we did not provide RGB levels, the `imshow` function automatically maps values to a color gradient. By default, the color gradient goes from blue (for low values) to red (for high values), but you can select another color map. For example:"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": [
"plt.imshow(img, cmap=\"hot\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also generate an RGB image directly:"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [],
"source": [
"img = numpy.empty((20,30,3))\n",
"img[:, :10] = [0, 0, 0.6]\n",
"img[:, 10:20] = [1, 1, 1]\n",
"img[:, 20:] = [0.6, 0, 0]\n",
"plt.imshow(img)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since the `img` array is just quite small (20x30), when the `imshow` function displays it, it grows the image to the figure's size. By default it uses [bilinear interpolation](https://en.wikipedia.org/wiki/Bilinear_interpolation) to fill the added pixels. This is why the edges look blurry.\n",
"You can select another interpolation algorithm, such as copying the color of the nearest pixel:"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": [
"plt.imshow(img, interpolation=\"nearest\")\n",
"plt.show()"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -986,7 +1146,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 37, "execution_count": 44,
"metadata": { "metadata": {
"collapsed": true "collapsed": true
}, },
@ -1009,7 +1169,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 38, "execution_count": 45,
"metadata": { "metadata": {
"collapsed": false "collapsed": false
}, },
@ -1045,7 +1205,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 39, "execution_count": 46,
"metadata": { "metadata": {
"collapsed": false "collapsed": false
}, },
@ -1053,7 +1213,7 @@
"source": [ "source": [
"Writer = animation.writers['ffmpeg']\n", "Writer = animation.writers['ffmpeg']\n",
"writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800)\n", "writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800)\n",
"line_ani.save('my_wiggly.mp4', writer=writer)" "line_ani.save('my_wiggly_animation.mp4', writer=writer)"
] ]
}, },
{ {