Matplotlib快速入门
Matplotlib
可能还有小伙伴不知道Matplotlib是什么,下面是维基百科的介绍。
Matplotlib 是 Python 编程语言的一个绘图库及其数值数学扩展 NumPy。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+向应用程序嵌入式绘图提供了面向对象的应用程序接口。
简单说就是画图的工具包。本文将教会你如何使用Matplotlib绘图,如果你没有Python基础也没关系,依葫芦画瓢也完全 OK 的。关于如何安装 Python 以及 Matplotlib,文末有链接。
绘制第一个图
- 如果给
plot函数一个一维数组,则将该数组作为纵轴坐标,并且将数组中的每个数据点索引作为水平坐标
1 | import matplotlib.pyplot as plt |

- 如果提供两个数组,则将其分别作为 x 轴和 y 轴
1 | plt.plot([-3, -2, 5, 0], [1, 6, 4, 3]) |

- 坐标轴会自动匹配数据的范围,不过我们可以调用
axis函数来改变每个轴的范围[xmin, xmax, ymin, ymax]
1 | plt.plot([-3, -2, 5, 0], [1, 6, 4, 3]) |

- 我们用 NumPy’s 的
linspace函数在范围[-2, 2]内创建包含 500 个浮点数的数组x,计算数组x的平方作为数组y
1 | import numpy as np |

- 添加标题,x、y 轴标签,并绘制网格
1 | plt.plot(x, y) |

线条样式和颜色
- 默认情况下,matplotlib 在连续的点之间绘制一条线。
1 | plt.plot([0, 100, 100, 0, 0, 100, 50, 0, 100], [0, 0, 100, 100, 0, 100, 130, 100, 0]) |

- 可在第三个参数更改线条的样式和颜色,比如“g–”表示“绿色虚线”
1 | plt.plot([0, 100, 100, 0, 0, 100, 50, 0, 100], [0, 0, 100, 100, 0, 100, 130, 100, 0], "g--") |

- 你可以绘制多条线在同一个图上,仅仅通过重复
x1, y1, [style1], x2, y2, [style2], ...
1 | plt.plot([0, 100, 100, 0, 0], [0, 0, 100, 100, 0], "r-", [0, 100, 50, 0, 100], [0, 100, 130, 100, 0], "g--") |

- 也可以在
show之前plot多次
1 | plt.plot([0, 100, 100, 0, 0], [0, 0, 100, 100, 0], "r-") |

- 你也可以绘制点而不只是绘制直线
1 | x = np.linspace(-1.4, 1.4, 30) |

接受以下格式字符来控制线条样式或标记
| character | description |
|---|---|
| ‘-‘ | solid line style |
| ‘–’ | dashed line style |
| ‘-.’ | dash-dot line style |
| ‘:’ | dotted line style |
| ‘.’ | point marker |
| ‘,’ | pixel marker |
| ‘o’ | circle marker |
| ‘v’ | triangle_down marker |
| ‘^’ | triangle_up marker |
| ‘<’ | triangle_left marker |
| ‘>’ | triangle_right marker |
| ‘1’ | tri_down marker |
| ‘2’ | tri_up marker |
| ‘3’ | tri_left marker |
| ‘4’ | tri_right marker |
| ‘s’ | square marker |
| ‘p’ | pentagon marker |
| ‘*‘ | star marker |
| ‘h’ | hexagon1 marker |
| ‘H’ | hexagon2 marker |
| ‘+’ | plus marker |
| ‘x’ | x marker |
| ‘D’ | diamond marker |
| ‘d’ | thin_diamond marker |
| ‘ | ‘ |
| ‘_‘ | hline marker |
支持以下颜色缩写
| character | color |
|---|---|
| ‘b’ | blue |
| ‘g’ | green |
| ‘r’ | red |
| ‘c’ | cyan |
| ‘m’ | magenta |
| ‘y’ | yellow |
| ‘k’ | black |
| ‘w’ | white |
plot函数会返回一个Line2D对象列表,你可以额外设置一些属性,例如线的宽度,虚线风格等等。
1 | x = np.linspace(-1.4, 1.4, 30) |

Line2D属性
| Property | Value Type |
|---|---|
| alpha | float |
| animated | [True / False] |
| antialiased or aa | [True / False] |
| clip_box | a matplotlib.transform.Bbox instance |
| clip_on | [True |
| clip_path | a Path instance and a Transform instance, a Patch |
| color or c | any matplotlib color |
| contains | the hit testing function |
| dash_capstyle | [‘butt’ / ‘round’ / ‘projecting’] |
| dash_joinstyle | [‘miter’ / ‘round’ / ‘bevel’] |
| dashes | sequence of on/off ink in points |
| data | (np.array xdata, np.array ydata) |
| figure | a matplotlib.figure.Figure instance |
| label | any string |
| linestyle or ls | [ ‘-‘ / ‘–’ / ‘-.’ / ‘:’ / ‘steps’ / …] |
| linewidth or lw | float value in points |
| lod | [True / False] |
| marker | [ ‘+’ / ‘,’ / ‘.’ / ‘1’ / ‘2’ / ‘3’ / ‘4’ ] |
| markeredgecolor or mec | any matplotlib color |
| markeredgewidth or mew | float value in points |
| markerfacecolor or mfc | any matplotlib color |
| markersize or ms | float |
| markevery | [ None / integer / (startind, stride) ] |
| picker | used in interactive line selection |
| pickradius | the line pick selection radius |
| solid_capstyle | [‘butt’ / ‘round’ / ‘projecting’] |
| solid_joinstyle | [‘miter’ / ‘round’ / ‘bevel’] |
| transform | a matplotlib.transforms.Transform instance |
| visible | [True / False] |
| xdata | np.array |
| ydata | np.array |
| zorder | any number |
保存图像
- 可使用 savefig 函数保存图像
1 | savefig(fname, dpi=None, facecolor='w', edgecolor='w', |
参数
- fname: 包含文件名的路径字符串
- dpi: [ None | scalar > 0 | ‘figure’]
- format: 文件扩展名,大多数后端支持
png, pdf, ps, eps and svg - transparent: 如果为 True 则轴部分的背景透明。
示例
1 | x = np.linspace(-1.4, 1.4, 30) |

组合图
- 一个图可能需要包含多个子图,那么如何操作呢。要创建子图其实只需调用子图函数,并制定图中的行数和列数,以及要绘制的子图的索引(从 1 开始,然后从左到右,从上到下)。注意,pyplot 会跟踪当前活动的子图(您可以调用
plt.gca()来获得引用,可以借此添加额外属性),因此当您调用绘图函数时,它会绘制活动的子图。 - 注意:
subplot(224)是subplot(2, 2, 4)的缩写。
1 | x = np.linspace(-1.4, 1.4, 30) |

- 创建跨多个网格单元的子图也很容易
1 | plt.subplot(2, 2, 1) # 2 rows, 2 columns, 1st subplot = top left |

- 如果你需要更复杂的子图定位,你可以使用
subplot2grid,你可以指定格子行数和列数,然后在格子上绘制子图(左上 = (0, 0)),并且可以指定它能跨越多少行和多少列。
1 | plt.subplot2grid((3,3), (0, 0), rowspan=2, colspan=2) |

- 如果需要更灵活的子图定位,看这里
绘制文本
- 你可以调用
call在图像任意位置添加文本。仅需指定坐标选择一些额外属性。关于 TeX 方程表达式的细节看这里
1 | x = np.linspace(-1.5, 1.5, 30) |

- 图像元素的注释使用非常频繁,
annotate函数使得它非常简单,只需指定兴趣点的位置、文本的位置,加上文字和箭头的一些额外属性就能完成。
1 | plt.plot(x, x**2, px, py, "ro") |

- 你可以使用
bbox属性在文本周围加上框。
1 | plt.plot(x, x**2, px, py, "ro") |

- 如果为了好玩可以绘制漫画风格的图(xkcd-style),只需在
with plt.xkcd()内写代码就好。
1 | with plt.xkcd(): |

图例
- 添加图例最简单的方法是在对应位置添加标签,然后调用
legend函数
1 | x = np.linspace(-1.4, 1.4, 50) |

非线性尺度
- Matplotlib 支持非线性尺度,例如对数或 logit 尺度
1 | x = np.linspace(0.1, 15, 500) |




Ticks and tickers 刻度和刻度控制器
- “ticks”是刻度的位置 (例如 (-1, 0, 1)),”tick lines”是在这些位置绘制的小线条(刻度线),”tick labels”实在刻度线旁边绘制的标签(刻度线标签)。”tickers” 是决定在哪能放置刻度的对象,默认的 tickers 通常在合理的距离放置 5 到 8 个刻度。但有时候你需要控制它,幸运的是,matplotlib 可以让你完全控制刻度。
1 | x = np.linspace(-2, 2, 100) |

极坐标投影
- 绘制极坐标图,只需在创建子图时,设定”projection”属性为”polar”即可。
1 | radius = 1 |

3D 投影
- 绘制 3D 图像非常直接,你需要导入
Axes3D,以注册3d投影。然后设定projection属性为3d。它将返回一个Axes3DSubplot对象,你可以调用plot_surface,给定 x,y 和 z 坐标加额外的属性来绘制。
1 | from mpl_toolkits.mplot3d import Axes3D |

- 显示相同数据的另外一种方法是用等高线图
1 | plt.contourf(X, Y, Z, cmap=matplotlib.cm.coolwarm) |

散点图
- 提供 x 和 y 的坐标就可以绘制散点图。
1 | from numpy.random import rand |

- 你也可以提供每个点的比例
1 | x, y, scale = rand(3, 100) |

- 还可以设置些额外的属性,例如填充颜色、边缘颜色、透明度。
1 | for color in ['red', 'green', 'blue']: |

直线(工具函数)
- 创建一个工具函数来画图通常会更方便,该函数会在给定斜率和截距的情况下在图上绘制一条看似无限长的线。
1 | from numpy.random import randn |

直方图
1 | data = [1, 1.1, 1.8, 2, 2.1, 3.2, 3, 3, 3, 3] |

1 | data1 = np.random.randn(400) |

图像
- 读取图像;仅需导入
matplotlib.imagemoudle,再调用imread函数(传入文件名),它将以 NumPy’s 数组形式返回图像数据。
1 | import matplotlib.image as mpimg |
- 生成图像也很简单
1 | img = np.arange(100*100).reshape(100, 100) |

- 由于我们没有提供 RGB 等级,
imshow函数自动将值映射到颜色渐变。默认情况,颜色渐变从蓝色(低值)变为红色(高值),但你可以选择其他颜色映射。例如:
1 | plt.imshow(img, cmap="hot") |

- 你也可以直接产生 RGB 图像
1 | img = np.empty((20,30,3)) |

- 由于 img 数组非常小(20x30),所以当 imshow 函数显示它时,它会将图像增大图像的大小。 默认情况下,它使用双线性插值来填充所添加的像素。 这就是边缘看起来模糊的原因。 您可以选择另一种插值算法,例如复制最近像素的颜色:
1 | plt.imshow(img, interpolation="nearest") |

动画
绘制
FuncAnimation构造函数接受一个图形,一个更新函数和可选参数。 我们指定我们需要一个 100 帧长的动画,每帧之间有 20ms。 在每次迭代中,FuncAnimation 调用我们的更新函数,并将帧号传递给num(在我们的例子中是从 0 到 99),接着是我们用fargs指定额外的参数。- 我们的更新函数简单地将行数据设置为第一个数据点(所以数据将逐渐绘制),并且为了好玩,我们还为每个数据点添加一个小的随机数,这样该行似乎在摆动。
1 | import matplotlib.animation as animation |
保存
- Matplotlib 依靠第三方库来编写视频,如 FFMPEG 或 mencoder。 在这个例子中,我们将使用 FFMPEG,所以一定要先安装它。
1 | Writer = animation.writers['ffmpeg'] |
更多
欢迎关注公众号:MachineEpoch,与新人一起学习。
本文作者 : HeoLis
原文链接 : https://ishero.net/Matplotlib%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
学习、记录、分享、获得
