======================================================
背景:
我们现在将深入研究Matplotlib包,以便在Python中进行可视化。 Matplotlib是一个基于NumPy阵列的多平台数据可视化库,旨在与更广泛的SciPy协同工作。它由John Hunter在2002年构思,最初是作为IPython的补丁,用于通过来自IPython命令行的gnuplot实现交互式MATLAB风格的绘图。 IPython的创始人Fernando Perez当时正完成他的博士学位,而约翰知道他几个月没时间补丁了。约翰认为这是他自己开始的一个提示,Matplotlib软件包诞生了,2003年发布了0.1版本。当它被作为太空望远镜科学研究所选择的绘图包时,它得到了早期的提升。哈勃望远镜背后的科学家在财务上支持Matplotlib的开发并大大扩展了其功能。
Matplotlib最重要的功能之一是它能够很好地兼容许多操作系统和图形后端。 Matplotlib支持许多后端和输出类型,这意味着无论您使用哪种操作系统或您希望使用哪种输出格式,您都可以依赖它。这种跨平台,一切对每个人的方法都是Matplotlib的强大优势之一。它带来了庞大的用户群,这反过来又导致了活跃的开发人员基础和Matplotlib在科学Python世界中的强大工具和普遍性。
然而,近年来,Matplotlib的界面和风格已经开始显示它们的年龄。 R语言中的ggplot和ggvis等新工具,以及基于D3js和HTML5画布的Web可视化工具包,经常使Matplotlib感觉笨重和老式。尽管如此,我认为我们不能忽视Matplotlib作为经过良好测试的跨平台图形引擎的优势。最近的Matplotlib版本使得设置新的全局绘图样式变得相对容易(请参阅自定义Matplotlib:配置和样式表),人们一直在开发基于其强大内部构建的新软件包,通过更清晰,更现代的API来驱动Matplotlib,例如, Seaborn(可视化与Seaborn讨论),ggpy,HoloViews,Altair,甚至Pandas本身都可以用作Matplotlib API的包装。即使使用这样的包装器,通常也可以深入研究Matplotlib的语法来调整最终的绘图输出。出于这个原因,我相信Matplotlib本身仍将是数据可视化堆栈的重要组成部分,即使新工具意味着社区逐渐不再使用Matplotlib API。
Matplotlib
一般Matplotlib技巧
在我们深入了解使用Matplotlib创建可视化的细节之前,您应该了解一些有关使用该软件包的有用信息。
1.导入Matplotlib
就像我们使用np简写为NumPy和pandas的pd简写一样,我们将使用Matplotlib导入的一些标准shorthands:
import matplotlib as mplimport matplotlib.pyplot as plt
我们将matplotlib导入为mpl,将matplotlib.pyplot导入为plt
而plt接口是我们最常使用的接口。
设置样式
我们将使用plt.style指令为我们的数字选择合适的美学风格。在这里,我们将设置经典样式,确保我们创建的图使用经典的Matplotlib样式:
plt.style.use( 'classic')
我们可以根据自己需求调整样式。
如何显示我们画的图
Matplotlib大概三个常用的编译环境,分别是脚本,IPython终端或IPython笔记本中使用Matplotlib。
从脚本绘图
如果您在脚本中使用Matplotlib,则函数plt.show()并打开一个或多个显示您的图形或图形的交互式窗口。有一点需要注意:plt.show()命令每个Python会话只能使用一次,最常见于脚本的最后。从IPython shell绘图
在IPython shell中以交互方式使用Matplotlib非常方便(参见IPython:Beyond Normal Python)。如果指定Matplotlib模式,IPython可以很好地与Matplotlib一起使用。要启用此模式,可以在启动ipython后使用%matplotlib magic命令:
从IPython笔记本绘图
IPython笔记本是一种基于浏览器的交互式数据分析工具,可以将叙述,代码,图形,HTML元素等组合到一个可执行文档中(参见IPython:Beyond Normal Python)。可以使用%matplotlib命令在IPython笔记本中以交互方式绘制,并以与IPython shell类似的方式工作。%matplotlib inline 笔记本将导致嵌入在笔记本中的交互式图
import matplotlib.pyplot as pltimport numpy as np x = np.linspace(0, 10, 100) fig = plt.figure() plt.plot(x, np.sin(x), '-') plt.plot(x, np.cos(x), '--');
保存已经画好的图片
Matplotlib的一个很好的功能是能够以各种格式保存数字。 可以使用savefig()命令保存图形。 例如,要将上一个图保存为PDF文件,可以运行以下命令:
fig.savefig('my_figure.pdf')
使用一下命令确认该图已经保存
# In[*]fig.savefig('my_figure.jpeg')from IPython.display import Image Image('my_figure.jpeg')
在savefig()中,文件格式是从给定文件名的扩展名推断出来的。 根据您安装的后端,可以使用许多不同的文件格式。 通过使用图形画布对象的以下方法,可以为系统找到支持的文件类型列表:
fig.canvas.get_supported_filetypes() Out[12]: {'ps': 'Postscript', 'eps': 'Encapsulated Postscript', 'pdf': 'Portable Document Format', 'pgf': 'PGF code for LaTeX', 'png': 'Portable Network Graphics', 'raw': 'Raw RGBA bitmap', 'rgba': 'Raw RGBA bitmap', 'svg': 'Scalable Vector Graphics', 'svgz': 'Scalable Vector Graphics', 'jpg': 'Joint Photographic Experts Group', 'jpeg': 'Joint Photographic Experts Group', 'tif': 'Tagged Image File Format', 'tiff': 'Tagged Image File Format'}
Matplotlib的两个接口
Matplotlib的一个可能令人困惑的特性是它的双重接口:一个方便的
MATLAB风格的基于状态的接口,以及一个更强大的面向对象的接口。
MATLAB风格的基于状态的接口
Matplotlib最初是作为MATLAB用户的Python替代编写的,其大部分语法都反映了这一事实。 MATLAB风格的工具包含在pyplot(plt)界面中。 例如,以下代码可能对MATLAB用户来说非常熟悉:
plt.figure() #创建图形 # 设置双图的第一个图plt.subplot(2, 1, 1) # (rows, columns, panel number)plt.plot(x, np.sin(x)) # 设置双图的第二个图plt.subplot(2, 1, 2)plt.plot(x, np.cos(x));
这种接口最重要的特点是有状态的,它会跟踪‘当前的’图片和坐标轴,可以使用plt.gcf()和plt.gca()获取当前图片和坐标轴。这样带来的问题就是当我们画第二个图时,怎么回到第一个子图并增加新内容呢?
面向对象的接口
fig, ax = plt.subplots(2)# Call plot() method on the appropriate objectax[0].plot(x, np.sin(x)) ax[1].plot(x, np.cos(x));
一般而言选择使用哪种样式在取决于偏好,但是当面对比较复杂的图时,应该选择ax.plot()。在大多数情况下,将plt.plot()切换到ax.plot()差别很小,但是我们将在下面的部分中提出一些问题。
作者:赛乾
链接:https://www.jianshu.com/p/c07723faf5d7