Matplotlib的核心是面向对象的。如果需要对绘图进行更多的控制和自定义,建议直接使用对象。许多情况下,创建一个 Figure,一个或多个 Axes 使用pyplot.subplots。
Matplotlib子模块
- matplotlib
- matplotlib.afm
- matplotlib.animation
- matplotlib.artist
- matplotlib.axes:是所有图标数据、图例配置等绘图形元素的容器,包含大多数图形元素: Axis , Tick , Line2D , Text , Polygon 等,并设置坐标系。
- matplotlib.axis
- matplotlib.backend_bases
- matplotlib.backend_managers
- matplotlib.backend_tools
- matplotlib.backends
- matplotlib.bezier
- matplotlib.blocking_input
- matplotlib.category
- matplotlib.cbook
- matplotlib.cm
- matplotlib.collections
- matplotlib.colorbar
- matplotlib.colors
- matplotlib.container
- matplotlib.contour
- matplotlib.dates
- matplotlib.dviread
- matplotlib.figure:Figure提供了容纳多个Axes的画板
- matplotlib.font_manager
- matplotlib.fontconfig_pattern
- matplotlib.gridspec
- matplotlib.image
- matplotlib.legend
- matplotlib.legend_handler
- matplotlib.lines
- matplotlib.markers
- matplotlib.mathtext
- matplotlib.mlab
- matplotlib.offsetbox
- matplotlib.patches
- matplotlib.path
- matplotlib.patheffects
- matplotlib.pyplot:面向“当前”图
- matplotlib.projections
- matplotlib.projections.polar
- matplotlib.quiver
- matplotlib.rcsetup
- matplotlib.sankey
- matplotlib.scale
- matplotlib.sphinxext.plot_directive
- matplotlib.spines
- matplotlib.style
- matplotlib.table
- matplotlib.testing
- matplotlib.text
- matplotlib.texmanager
- matplotlib.textpath
- matplotlib.ticker
- matplotlib.tight_layout
- matplotlib.transforms
- matplotlib.tri
- matplotlib.type1font
- matplotlib.units
- matplotlib.widgets
绘图
如果是简单的单图表绘制,或者是交互实验环境,则plt接口足以满足需要,且操作简单易用。
如果是多图表绘制,需要相对复杂的图例配置和其他自定义设置,那么毫无疑问面向对象接口绘图是当之无愧的不二选择。
创建画板
包括创建figure和axes对象。figure和axes,其中前者为所有绘图操作定义了顶层类对象Figure,相当于是提供了画板;而后者则定义了画板中的每一个绘图对象Axes,相当于画板内的各个子图。换句话说,figure是axes的父容器,而axes是figure的内部元素,而我们常用的各种图表、图例、坐标轴等则又是axes的内部元素。常用有3种方法
- plt.figure,主要接收一个元组作为figsize参数设置图形大小,返回一个figure对象用于提供画板
- plt.axes,接收一个figure或在当前画板上添加一个子图,返回该axes对象,并将其设置为"当前"图,缺省时会在绘图前自动添加
- plt.subplot,主要接收3个数字或1个3位数(自动解析成3个数字,要求解析后数值合理)作为子图的行数、列数和当前子图索引,索引从1开始(与MATLAB保存一致),返回一个axes对象用于绘图操作。这里,可以理解成是先隐式执行了plt.figure,然后在创建的figure对象上添加子图,并返回当前子图实例
- plt.subplots,主要接收一个行数nrows和列数ncols作为参数(不含第三个数字),创建一个figure对象和相应数量的axes对象,同时返回该figure对象和axes对象嵌套列表,并默认选择最后一个子图作为"当前"图
绘制图表,
常用图表形式包括:
- plot,折线图或点图,实际是调用了line模块下的Line2D图表接口
- scatter,散点图,常用于表述两组数据间的分布关系,也可由特殊形式下的plot实现
- bar/barh,条形图或柱状图,常用于表达一组离散数据的大小关系,比如一年内每个月的销售额数据;默认竖直条形图,可选barh绘制水平条形图
- hist,直方图,形式上与条形图很像,但表达意义却完全不同:直方图用于统计一组连续数据的分区间分布情况,比如有1000个正态分布的随机抽样,那么其直方图应该是大致满足钟型分布;条形图主要是适用于一组离散标签下的数量对比
- pie,饼图,主要用于表达构成或比例关系,一般适用于少量对比
- imshow,显示图像,根据像素点数据完成绘图并显示
配置图例
对所绘图形进一步添加图例元素,例如设置标题、坐标轴、文字说明等,常用接口如下:
- title,设置图表标题
- axis/xlim/ylim,设置相应坐标轴范围,其中axis是对后xlim和ylim的集成,接受4个参数分别作为x和y轴的范围参数
- grid,添加图表网格线
- legend,在图表中添加label图例参数后,通过legend进行显示
- xlabel/ylabel,分别用于设置x、y轴标题
- xticks/yticks,分别用于自定义坐标轴刻度显示
- text/arrow/annotation,分别在图例指定位置添加文字、箭头和标记,一般很少用
示例:
plt.figure()
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()
# 第二种方式
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
plt.show()
两种方式产生的结果完全一样。从第一种方式的代码来看,先生成了一个Figure画布,然后在这个画布上隐式生成一个画图区域进行画图。
第二种方式同时生成了Figure和axes两个对象,然后用ax对象在其区域内进行绘图。如果从面向对象编程(对理解Matplotlib绘图很重要)的角度来看,显然第二种方式更加易于解释,生成的fig和ax分别对画布Figure和绘图区域Axes进行控制,第一种方式反而显得不是很直观,如果涉及到子图零部件的设置,第二种方式显然会更易于使用。
subplot绘制多个子图
生成画布和axes对象:
# nrows=1和ncols=2分别代表1行和2列
fig,ax = plt.subplots(nrows=1,ncols=2)
对两个对象进行绘制:
ax[0].plot([1,2,3],[4,5,6])
ax[1].scatter([1,2,3],[4,5,6])
add_subplot与add_axes
add_subplot表示新增子图与subplots相似:
import numpy as np
import matplotlib.pyplot as plt
# 新建figure
fig = plt.figure()
# 定义数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 2, 3, 4, 5, 6, 7]
# 新增子图1
ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(x, y, 'r')
ax1.set_title('area1')
# 新增子图2
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(x, y, 'b')
ax2.set_title('area2')
plt.show()
add_axes表示新增子区域,该区域可以座落在figure内任意位置,且该区域可任意设置大小:
import numpy as np
import matplotlib.pyplot as plt
#新建figure
fig = plt.figure()
# 定义数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 2, 3, 4, 5, 6, 7]
#新建区域ax1
#figure的百分比,从figure 10%的位置开始绘制, 宽高是figure的80%
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
# 获得绘制的句柄
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
ax1.set_title('area1')
#新增区域ax2,嵌套在ax1内
left, bottom, width, height = 0.2, 0.6, 0.25, 0.25
# 获得绘制的句柄
ax2 = fig.add_axes([left, bottom, width, height])
ax2.plot(x,y, 'b')
ax2.set_title('area2')
plt.show()