matplotlib绘图总结

本文作为学习过程中对matplotlib一些常用知识点的整理,方便查找。

类MATLAB API

最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数。

from pylab import *from numpy import * x = linspace(0, 5, 10) y = x ** 2 figure() plot(x, y, 'r') xlabel('x') ylabel('y') title('title') 

创建子图,选择绘图用的颜色与描点符号:

subplot(1,2,1) plot(x, y, 'r--') subplot(1,2,2) plot(y, x, 'g*-'); 

linspace表示在0到5之间用10个点表示,plot的第三个参数表示画线的颜色与样式

此类 API 的好处是可以节省你的代码量,但是我们并不鼓励使用它处理复杂的图表。处理复杂图表时, matplotlib 面向对象 API 是一个更好的选择。

matplotlib 面向对象 API

使用面向对象API的方法和之前例子里的看起来很类似,不同的是,我们并不创建一个全局实例,而是将新建实例的引用保存在 fig 变量中,如果我们想在图中新建一个坐标轴实例,只需要 调用 fig 实例的 add_axes 方法:

import matplotlib.pyplot as plt
from pylab import * x = linspace(0, 5, 10) y = x ** 2 fig = plt.figure() axes = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # left, bottom, width, height (range 0 to 1) axes.plot(x, y, 'r') axes.set_xlabel('x') axes.set_ylabel('y') axes.set_title('title') plt.show() 

尽管会写更多的代码,好处在于我们对于图表的绘制有了完全的控制权,可以很容易地多加一个坐标轴到图中:

import matplotlib.pyplot as plt
from pylab import * x = linspace(0, 5, 10) y = x ** 2 fig = plt.figure() axes = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # left, bottom, width, height (range 0 to 1) axes2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # inset axes axes.plot(x, y, 'r') axes.set_xlabel('x') axes.set_ylabel('y') axes.set_title('title') # insert axes2.plot(y, x, 'g') axes2.set_xlabel('y') axes2.set_ylabel('x') axes2.set_title('insert title'); plt.show() 

如果我们不在意坐标轴在图中的排放位置️,那么就可以使用matplotlib的布局管理器了,我最喜欢的是subplots,使用方式如下:

import matplotlib.pyplot as plt
from pylab import * x = linspace(0, 5, 10) y = x ** 2 fig, axes = plt.subplots(nrows=1, ncols=2) for ax in axes: ax.plot(x, y, 'r') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_title('title') fig.tight_layout() plt.show() 

图表尺寸,长宽比 与 DPI

在创建 Figure 对象的时候,使用figsize 与 dpi 参数能够设置图表尺寸与DPI, 创建一个800*400像素,每英寸100像素的图就可以这么做:

fig = plt.figure(figsize=(8,4), dpi=100)<matplotlib.figure.Figure at 0x4cbd390> 

同样的参数也可以用在布局管理器上:

fig, axes = plt.subplots(figsize=(12,3))axes.plot(x, y, 'r') axes.set_xlabel('x') axes.set_ylabel('y') axes.set_title('title'); 

保存图表

可以使用 savefig 保存图表

fig.savefig("filename.png")
这里我们也可以有选择地指定DPI,并且选择不同的输出格式:fig.savefig("filename.png", dpi=200) 

有哪些格式?哪种格式能获得最佳质量?

Matplotlib 可以生成多种格式的高质量图像,包括PNG,JPG,EPS,SVG,PGF 和 PDF。如果是科学论文的话,我建议尽量使用pdf格式。 (pdflatex 编译的 LaTeX 文档使用 includegraphics 命令就能包含 PDF 文件)。 一些情况下,PGF也是一个很好的选择。

图例,轴标 与 标题

现在我们已经介绍了如何创建图表画布以及如何添加新的坐标轴实例,让我们看一看如何加上标题,轴标和图例

标题

每一个坐标轴实例都可以加上一个标题,只需调用坐标轴实例的 set_title 方法:

ax.set_title("title");

轴标

类似的, set_xlabel 与 set_ylabel 可以设置坐标轴的x轴与y轴的标签。

ax.set_xlabel("x")
ax.set_ylabel("y");

图例

有两种方法在图中加入图例。一种是调用坐标轴对象的 legend 方法,传入与之前定义的几条曲线相对应地图例文字的 列表/元组:

ax.legend([“curve1”, “curve2”, “curve3”]);

不过这种方式容易出错,比如增加了新的曲线或者移除了某条曲线。更好的方式是在调用 plot方法时使用 label=”label text” 参数,再调用 legend 方法加入图例:

ax.plot(x, x**2, label="curve1")
ax.plot(x, x**3, label="curve2") ax.legend(); 

legend 还有一个可选参数 loc 决定画出图例的位置,详情见:http://matplotlib.org/users/legend_guide.html#legend-location

最常用的值如下:

ax.legend(loc=0) # let matplotlib decide the optimal location
ax.legend(loc=1) # upper right corner ax.legend(loc=2) # upper left corner ax.legend(loc=3) # lower left corner ax.legend(loc=4) # lower right corner # .. many more options are available => <matplotlib.legend.Legend at 0x4c863d0> 

下面这个例子同时包含了标题,轴标,与图例的用法:

import matplotlib.pyplot as plt
from pylab import * x = linspace(0, 5, 10) y = x ** 2 fig, ax = plt.subplots() ax.plot(x, x**2, label="y = x**2") ax.plot(x, x**3, label="y = x**3") ax.legend(loc=2); # upper left corner ax.set_xlabel('x') ax.set_ylabel('y') ax.set_title('title'); plt.show() 

格式化文本,LaTeX,字体大小,字体类型

Matplotlib 对 LaTeX 提供了很好的支持。我们只需要将 LaTeX 表达式封装在 符号内,就可以在图的任何文本中显示了,比如“符号内,就可以在图的任何文本中显示了,比如“

不过这里我们会遇到一些小问题,在 LaTeX 中我们常常会用到反斜杠,比如 \alpha 来产生符号 αα

import matplotlib.pyplot as plt
from pylab import * x = linspace(0, 5, 10) y = x ** 2 fig, ax = plt.subplots() ax.plot(x, x**2, label=r"$y = \alpha^2$") ax.plot(x, x**3, label=r"$y = \alpha^3$") ax.legend(loc=2) # upper left corner ax.set_xlabel(r'$\alpha$', fontsize=18) ax.set_ylabel(r'$y$', fontsize=18) ax.set_title('title'); plt.show() 

我们可以更改全局字体大小或者类型:

from matplotlib import rcParams
rcParams.update({'font.size': 18, 'font.family': 'serif'}) 

STIX 字体是一种好选择:

matplotlib.rcParams.update({'font.size': 18, 'font.family': 'STIXGeneral', 'mathtext.fontset': 'stix'}) 

我们也可以将图中的文本全用 Latex 渲染:

matplotlib.rcParams.update({'font.size': 18, 'text.usetex': True}) 

设置颜色,线宽 与 线型

颜色

有了matplotlib,我们就有很多方法能够定义线的颜色和很多其他图形元素。首先,我们可以使用类MATLAB语法,’b’ 代表蓝色,’g’ 代表绿色,依此类推。matplotlib同时也支持 MATLAB API 选择线型所使用的方式:比如 ‘b.-‘ 意味着蓝线标着点:

# MATLAB style line color and style ax.plot(x, x**2, 'b.-') # blue line with dots ax.plot(x, x**3, 'g--') # green dashed line fig => [<matplotlib.lines.Line2D at 0x4985810>] 

我们也可以以颜色的名字或者RGB值选择颜色,alpha参数决定了颜色的透明度:

fig, ax = plt.subplots()ax.plot(x, x+1, color="red", alpha=0.5) # half-transparant red ax.plot(x, x+2, color="#1155dd") # RGB hex code for a bluish color ax.plot(x, x+3, color="#15cc55") # RGB hex code for a greenish color fig => [<matplotlib.lines.Line2D at 0x4edbd10>] 

线与描点风格

linewidth 或是 lw 参数改变线宽。 linestyle 或是 ls 参数改变线的风格。

fig, ax = plt.subplots(figsize=(12,6))ax.plot(x, x+1, color="blue", linewidth=0.25) ax.plot(x, x+2, color="blue", linewidth=0.50) ax.plot(x, x+3, color="blue", linewidth=1.00) ax.plot(x, x+4, color="blue", linewidth=2.00) # possible linestype options ‘-‘, ‘–’, ‘-.’, ‘:’, ‘steps’ ax.plot(x, x+5, color="red", lw=2, linestyle='-') ax.plot(x, x+6, color="red", lw=2, ls='-.') ax.plot(x, x+7, color="red", lw=2, ls=':') # custom dash line, = ax.plot(x, x+8, color="black", lw=1.50) line.set_dashes([5, 10, 15, 10]) # format: line length, space length, ... # possible marker symbols: marker = '+', 'o', '*', 's', ',', '.', '1', '2', '3', '4', ... ax.plot(x, x+ 9, color="green", lw=2, ls='*', marker='+') ax.plot(x, x+10, color="green", lw=2, ls='*', marker='o') ax.plot(x, x+11, color="green", lw=2, ls='*', marker='s') ax.plot(x, x+12, color="green", lw=2, ls='*', marker='1') # marker size and color ax.plot(x, x+13, color="purple", lw=1, ls='-', marker='o', markersize=2) ax.plot(x, x+14, color="purple", lw=1, ls='-', marker='o', markersize=4) ax.plot(x, x+15, color="purple", lw=1, ls='-', marker='o', markersize=8, markerfacecolor="red") ax.plot(x, x+16, color="purple", lw=1, ls='-', marker='s', markersize=8, markerfacecolor="yellow", markeredgewidth=2, markeredgecolor="blue") fig 

控制坐标轴的样式

坐标轴样式也是通常需要自定义的地方,像是标号或是标签的位置或是字体的大小等。

图的范围

我们想做的第一件事也许是设置坐标轴的范围,可以使用 set_ylim 或是 set_xlim 方法或者 axis(‘tight’) 自动将坐标轴调整的紧凑 The first thing we might want to configure is the ranges of the axes. We can do this using the set_ylim and set_xlim methods in the axis object, or axis(‘tight’) for automatrically getting “tightly fitted” axes ranges:

fig, axes = plt.subplots(1, 3, figsize=(12, 4)) axes[0].plot(x, x**2, x, x**3) axes[0].set_title("default axes ranges") axes[1].plot(x, x**2, x, x**3) axes[1].axis('tight') axes[1].set_title("tight axes") axes[2].plot(x, x**2, x, x**3) axes[2].set_ylim([0, 60]) axes[2].set_xlim([2, 5]) axes[2].set_title("custom axes range"); fig 

对数刻度

也可以将轴的刻度设置成对数刻度,调用 set_xscale 与 set_yscale 设置刻度,参数选择 “log” :

fig, axes = plt.subplots(1, 2, figsize=(10,4)) axes[0].plot(x, x**2, x, exp(x)) axes[0].set_title("Normal scale") axes[1].plot(x, x**2, x, exp(x)) axes[1].set_yscale("log") axes[1].set_title("Logarithmic scale (y)"); fig 

自定义标号位置与符号

set_xticks 与 set_yticks 方法可以显示地设置标号的位置, set_xticklabels 与 set_yticklabels 为每一个标号设置符号:

fig, ax = plt.subplots(figsize=(10, 4))ax.plot(x, x**2, x, x**3, lw=2) ax.set_xticks([1, 2, 3, 4, 5]) ax.set_xticklabels([r'$\alpha$', r'$\beta$', r'$\gamma$', r'$\delta$', r'$\epsilon$'], fontsize=18) yticks = [0, 50, 100, 150] ax.set_yticks(yticks) ax.set_yticklabels(["$%.1f$" % y for y in yticks], fontsize=18); # use LaTeX formatted labels fig => [<matplotlib.text.Text at 0x5d75c90>, <matplotlib.text.Text at 0x585fe50>, <matplotlib.text.Text at 0x575c090>, <matplotlib.text.Text at 0x599e610>] 

科学计数法

如果轴上涉及非常大的数,最好使用科学计数法:

fig, ax = plt.subplots(1, 1)ax.plot(x, x**2, x, exp(x)) ax.set_title("scientific notation") ax.set_yticks([0, 50, 100, 150]) from matplotlib import ticker formatter = ticker.ScalarFormatter(useMathText=True) formatter.set_scientific(True) formatter.set_powerlimits((-1,1)) ax.yaxis.set_major_formatter(formatter) fig 

轴上数与标签的间距

# distance between x and y axis and the numbers on the axes
rcParams['xtick.major.pad'] = 5 rcParams['ytick.major.pad'] = 5 fig, ax = plt.subplots(1, 1) ax.plot(x, x**2, x, exp(x)) ax.set_yticks([0, 50, 100, 150]) ax.set_title("label and axis spacing") # padding between axis label and axis numbers ax.xaxis.labelpad = 5 ax.yaxis.labelpad = 5 ax.set_xlabel("x") ax.set_ylabel("y"); fig 

调整坐标轴的位置:


fig, ax = plt.subplots(1, 1)ax.plot(x, x**2, x, exp(x)) ax.set_yticks([0, 50, 100, 150]) ax.set_title("title") ax.set_xlabel("x") ax.set_ylabel("y") fig.subplots_adjust(left=0.15, right=.9, bottom=0.1, top=0.9); fig 

坐标轴网格

grid 方法可以打开关闭网格线,也可以自定义网格的样式:

fig, axes = plt.subplots(1, 2, figsize=(10,3)) # default grid appearance axes[0].plot(x, x**2, x, x**3, lw=2) axes[0].grid(True) # custom grid appearance axes[1].plot(x, x**2, x, x**3, lw=2) axes[1].grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) fig 

我们也可以改变轴的属性:

fig, ax = plt.subplots(figsize=(6,2))ax.spines['bottom'].set_color('blue') ax.spines['top'].set_color('blue') ax.spines['left'].set_color('red') ax.spines['left'].set_linewidth(2) # turn off axis spine to the right ax.spines['right'].set_color("none") ax.yaxis.tick_left() # only ticks on the left side fig 

双坐标轴

twinx 与 twiny 函数能设置双坐标轴:

fig, ax1 = plt.subplots()ax1.plot(x, x**2, lw=2, color="blue") ax1.set_ylabel(r"area $(m^2)$", fontsize=18, color="blue") for label in ax1.get_yticklabels(): label.set_color("blue") ax2 = ax1.twinx() ax2.plot(x, x**3, lw=2, color="red") ax2.set_ylabel(r"volume $(m^3)$", fontsize=18, color="red") for label in ax2.get_yticklabels(): label.set_color("red") fig 

设置坐标原点在(0,0)点

fig, ax = plt.subplots()ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data',0)) # set position of x spine to x=0 ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0)) # set position of y spine to y=0 xx = np.linspace(-0.75, 1., 100) ax.plot(xx, xx**3); fig 

其他 2D 图表风格

包括一般的 plot 方法, 还有很多其他函数能够生成不同类型的图表,详情请见 http://matplotlib.org/gallery.html 这里列出其中几种比较常见的函数方法。

n = array([0,1,2,3,4,5]) fig, axes = plt.subplots(1, 4, figsize=(12,3)) axes[0].scatter(xx, xx + 0.25*randn(len(xx))) axes[0].set_title("scatter") axes[1].step(n, n**2, lw=2) axes[1].set_title("step") axes[2].bar(n, n**2, align="center", width=0.5, alpha=0.5) axes[2].set_title("bar") axes[3].fill_between(x, x**2, x**3, color="green", alpha=0.5); axes[3].set_title("fill_between"); fig 

# polar plot using add_axes and polar projection
fig = plt.figure()
ax = fig.add_axes([0.0, 0.0, .6, .6], polar=True)
t = linspace(0, 2 * pi, 100)
ax.plot(t, t, color='blue', lw=3);

# A histogram
n = np.random.randn(100000) fig, axes = plt.subplots(1, 2, figsize=(12,4)) axes[0].hist(n) axes[0].set_title("Default histogram") axes[0].set_xlim((min(n), max(n))) axes[1].hist(n, cumulative=True, bins=50) axes[1].set_title("Cumulative detailed histogram") axes[1].set_xlim((min(n), max(n))); fig 

hist的参数含义

x : (n,) array or sequence of (n,) arrays

这个参数是指定每个bin(箱子)分布的数据,对应x轴

bins : integer or array_like, optional

这个参数指定bin(箱子)的个数,也就是总共有几条条状图

normed : boolean, optional

If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e.,n/(len(x)`dbin)

这个参数指定密度,也就是每个条状图的占比例比,默认为1

color : color or array_like of colors or None, optional

这个指定条状图的颜色

参见: hist的使用

饼状图

import matplotlib.pyplot as pltlabels='frogs','hogs','dogs','logs' sizes=15,20,45,10 colors='yellowgreen','gold','lightskyblue','lightcoral' explode=0,0.1,0,0 plt.pie(sizes,explode=explode,labels=labels,colors=colors,autopct='%1.1f%%',shadow=True,startangle=50) plt.axis('equal') plt.show() 

文本注释

text 函数可以做文本注释,且支持 LaTeX 格式:

fig, ax = plt.subplots()ax.plot(xx, xx**2, xx, xx**3)ax.text(0.15, 0.2, r"$y=x^2$", fontsize=20, color="blue") ax.text(0.65, 0.1, r"$y=x^3$", fontsize=20, color="green"); fig 

带有多子图与插图的图

fig.add_axes 在图中加入新坐标轴

subplots, subplot2grid,gridspec等 子图布局管理器

subplots

fig, ax = plt.subplots(2, 3)
fig.tight_layout()fig

subplot2grid

fig = plt.figure()
ax1 = plt.subplot2grid((3,3), (0,0), colspan=3)
ax2 = plt.subplot2grid((3,3), (1,0), colspan=2)
ax3 = plt.subplot2grid((3,3), (1,2), rowspan=2)
ax4 = plt.subplot2grid((3,3), (2,0))
ax5 = plt.subplot2grid((3,3), (2,1))
fig.tight_layout()fig

颜色映射图与轮廓图

颜色映射图与轮廓图适合绘制两个变量的函数。

matplotlib也可以画3D图,这里暂且略过。

转载于:https://www.cnblogs.com/luyingqian/p/10746651.html

matplotlib的读书笔记相关推荐

  1. Matplotlib 数据可视化(读书笔记)

    Python 数据科学手册第四章读书笔记,仅供学习交流使用 4. Matplotlib 数据可视化 4.1 Matplotlib 常用技巧 4.1.1 导入 Matplotlib plt 是最常用的接 ...

  2. python第三章上机实践_《机器学习Python实践》读书笔记-第三章

    <机器学习Python实践>,第三章,第一个机器学习项目 以往目录:橘猫吃不胖:<机器学习Python实践>读书笔记-第一章​zhuanlan.zhihu.com 书中介绍了一 ...

  3. 《Hands-On Machine Learning with Scikit-Learn TensorFlow》读书笔记(三):分类

    最近有时间看书了,把以前想看的书捡一下,翻译中顺便加上自己的理解,写个读书笔记. 注意:下面的"数字+s"表示的是数字的类别,加上s是和纯数字区别开. 在上上篇中,我们提到最常见的 ...

  4. Machine Learning in Action 读书笔记---第5章 Logistic回归

    Machine Learning in Action 读书笔记 第5章 Logistic回归 文章目录 Machine Learning in Action 读书笔记 一.Logistic回归 1.L ...

  5. 《Hands-On Machine Learning with Scikit-Learn TensorFlow》读书笔记(二):端到端的机器学习

    最近有时间看书了,把以前想看的书捡一下,翻译中顺便加上自己的理解,写个读书笔记. 假装最近聘请了一家房地产公司的数据科学家,然后通过一个示例项目,从头至尾了解机器学习. 以下是要完成的主要步骤: 查看 ...

  6. 《Python神经网络编程(Make Your Own Neural Network)》读书笔记

    声明 这是作者在CSDN上的第二篇博客,关于阅读塔里克·拉希德的著作<Python神经网络编程(Make Your Own Neural Network)>之后的读书笔记.跟诸位大牛相比, ...

  7. Machine Learning in Action 读书笔记---第3章 决策树

    Machine Learning in Action 读书笔记 第3章 决策树 文章目录 Machine Learning in Action 读书笔记 一.决策树算法简介 1 决策树的构造 2 决策 ...

  8. python图像处理《数字图像处理与python实现》读书笔记二:空间滤波

    文章目录 重要! 第三章 空间滤波 概览 3.1 空间滤波基础 3.1.1 空间滤波的机理 3.1.2 空间滤波器模板 3.2 平滑处理 3.2.1 平滑线性空间滤波器 3.2.2 统计排序滤波器 3 ...

  9. 吐血整理!万字原创读书笔记,数据分析的知识点全在这里了

    作者:JaneK 来源:大数据DT 导读:今天这篇文章是「大数据」内容合伙人JaneK关于<Python数据分析与数据化运营>的一篇读书笔记. 本文目录: Python数据分析与挖掘 01 ...

最新文章

  1. java websocket修改为同步_初级Java程序员需要掌握哪些主流技术才能拿25K?
  2. equals属于mysql语句吗_equals和==的区别 (Java基础)
  3. 【BZOJ 3165】 [Heoi2013]Segment 李超线段树
  4. 如何把python文件发给别人没_如何把自己写的python程序给别人用
  5. RUNOOB python练习题 39 数组排序
  6. 为 iOS 6 量身打造 Apps
  7. __strong、__weak 与 __unsafe_unretained区别
  8. 【译】x86程序员手册13-第5章 内存管理
  9. 品质管控计划ppt怎样写_供应商质量管理工作计划.ppt
  10. pe显示linux分区文件,找到了linux分区顺序错乱修复方法
  11. 【Codeforces】Chloe and the sequence (递归)
  12. 【MYSQL】【基础知识】【MySQL的基本使用】
  13. OSChina 周一乱弹 —— 今天下班带你去放松咧
  14. Python字符串总结大全
  15. EAX、ECX、EDX、EBX等寄存器的作用
  16. 荣耀v20怎么变成超级计算机,我的第一次荣耀V20体验 | 荣耀V20手机里的秘密终于曝光...
  17. 阅读《时间,管理把握最宝贵的财富》摘录(1)
  18. ffmpeg实战教程(十三)iJKPlayer源码简析
  19. JavaScript系列之模板字符串
  20. 工厂进销存软件哪家好,有没有适合服装厂使用的?

热门文章

  1. spring 定时任务的 执行时间设置规则
  2. 操作系统中四步法实现PV操作
  3. 20180823-cve
  4. checkpatch海思SDK代码遇见的常见错误《二》
  5. PyTorch学习系列教程:构建一个深度学习模型需要哪几步?
  6. python实现多重排序(多级排序)
  7. R语言使用caret包的train函数构建adaboost模型、模型调优、自定义设置trainControl函数和tuneLength参数
  8. 【Linux】ssh连接远程服务器
  9. 什么是值传递,什么是引用传递
  10. 鲍尔默评论谷歌退出中国事件