简介
Matplotlib是一个综合库,用于在Python中创建静态,动画和交互式可视化。matplotlib是matrix + plot + library的缩写,通过 Matplotlib,仅需要几行代码,便可以生成直方图,条形图,散点图等。
画图的两种方法:
pyplot:
matplotlib.pyplot是使matplotlib像MATLAB一样工作的命令样式函数的集合。每个pyplot函数对一个图进行一些更改,例如,创建图,设置横纵坐标、标题等等。
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltx = np.linspace(0, 2, 100)plt.plot(x, x, label='linear') # Plot some data on the (implicit) axes.plt.plot(x, x**2, label='quadratic') # etc.plt.plot(x, x**3, label='cubic')plt.xlabel('x label')plt.ylabel('y label')plt.title("Simple Plot")plt.legend()plt.show()

面对对象:
在使用面向对象的编程接口时候,创建图对象(Figure),创建Axes(一个Figure可以包含一个或者多个Axes,一个Axes可以理解为一个子图,使用一次plot()绘图函数便会创建一个Axes),使用面向对象编程接口有利于我们对于图形绘制的完整控制。
例子:
x = np.linspace(0, 2, 100)# Note that even in the OO-style, we use `.pyplot.figure` to create the figure.fig, ax = plt.subplots() # Create a figure and an axes.ax.plot(x, x, label='linear') # Plot some data on the axes.ax.plot(x, x**2, label='quadratic') # Plot more data on the axes...ax.plot(x, x**3, label='cubic') # ... and some more.ax.set_xlabel('x label') # Add an x-label to the axes.ax.set_ylabel('y label') # Add a y-label to the axes.ax.set_title("Simple Plot") # Add a title to the axes.ax.legend() # Add a legend.plt.show()
两种方法能够实现一样的功能,对于简单的单图表绘制,使用plt接口足以满足需要,且操作简单易用。如果是多图表绘制,需要相对复杂的图例配置和其他自定义设置,那么使用面向对象的方法更加合适。
plt.axes()——fig.add_axes()
plt.subplot()——fig.add_subplot()
plt.GridSped()——fig.add_gridspec()
plt.xlabel()——axes.set_xlabel()
plt.ylabel()——axes.set_ylabel()
plt.xlim()——axes.set_xlim()
plt.ylim()——axes.set_ylim()
plt.title()——axes.set_title()
plt.legend()——axes.legend()

布局:
matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False,sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
nrows:可选的,整型,默认为1,网格中有几行子图。
ncols:可选的,整型,默认为1,网格中有几列子图。
sharex:可选的,默认为False。True或all:所有子图共享x轴,False或none:每个子图的x轴都是独立的,row:每行子图共享一个x轴,col:每列子图共享一个x轴
sharey:类似于sharex,设置y轴的共享方式。
squeeze :可选的,布尔型,默认为True,是否压缩返回的Axes数组。
num:可选的,整型或字符串,默认为None,是matplotlib.pyplot.figure的关键字,用于设置图像数字或标签。
subplot_kw:可选的,字典类型,包含传递给用于创建子图的调用add_subplot的关键字参数。
gridspec_kw:可选的,字典类型,包含传递给用于创建子图网格的GridSpec构造函数的关键字参数。
**fig_kw:所有传递给matplotlib.pyplot.figure调用的额外关键字参数。
图表类型:
关于图表的选择,可以看我之前的一篇文章聊聊数据可视化
plt.plot:折线图或点图
matplotlib.pyplot.plot(* args,scalex = True,scaley = True,data = None,** kwargs)
plt.scatter:散点图
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None,cmap=None, norm=None, vmin=None, vmax=None, alpha=None,linewidths=None, *, edgecolors=None, plotnonfinite=False,data=None, **kwargs)
plt.bar:条形图
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *,align='center', data=None, **kwargs)
plt.barh:水平条形图
matplotlib.pyplot.barh(y, width, height=0.8, left=None, *,align='center', **kwargs)
plt.hist:直方图
matplotlib.pyplot.hist(x, bins=None, range=None, density=False,weights=None, cumulative=False, bottom=None, histtype='bar',align='mid', orientation='vertical', rwidth=None, log=False,color=None, label=None, stacked=False, *, data=None, **kwargs)
plt.pie:饼图
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None,autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,startangle=0, radius=1, counterclock=True, wedgeprops=None,textprops=None, center=0, 0, frame=False, rotatelabels=False, *,normalize=None, data=None)
plt.polar:极坐标图
matplotlib.pyplot.polar(*args, **kwargs)
plt.stackplot:堆叠图
matplotlib.pyplot.stackplot(x, *args, labels=(), colors=None,baseline='zero', data=None, **kwargs)
plt.stem:茎叶图
matplotlib.pyplot.stem(*args, linefmt=None, markerfmt=None,basefmt=None, bottom=0, label=None, use_line_collection=True,orientation='vertical', data=None)
plt.boxplot:箱型图
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None,whis=None, positions=None, widths=None, patch_artist=None,bootstrap=None, usermedians=None, conf_intervals=None,meanline=None, showmeans=None, showcaps=None, showbox=None,showfliers=None, boxprops=None, labels=None, flierprops=None,medianprops=None, meanprops=None, capprops=None, whiskerprops=None,manage_ticks=True, autorange=False, zorder=None, *, data=None)
heatmap:热力图
plt.hlines:水平横线
matplotlib.pyplot.hlines(y, xmin, xmax, colors=None, linestyles='solid',label='', *, data=None, **kwargs)
plt.stairs:阶梯图
matplotlib.pyplot.stairs(values, edges=None, *, orientation='vertical',baseline=0, fill=False, data=None, **kwargs)
颜色:
matplotlib中的色彩定义主要用到了RGB、RGBA、CMYK、灰色四种模型。RGB是最常见的一种色彩模型,它使用红、绿、蓝三原色的亮度来定量表示颜色,这种模型也称为加色混色模型,是以RGB三色光互相叠加来实现混色的方法。RGBA模型是在RGB模型的基础上加上了Alpha通道,alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%则意味着一个完全不透明的像素(传统的数字图像)。CMYK模型,也被称为印刷四色模型,它彩色印刷时采用的一种套色模型,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。四种标准颜色是:C:Cyan = 青色,又称为天蓝色或是湛蓝,M:Magenta = 品红色,又称为洋红色;Y:Yellow = 黄色;K:blacK=黑色,此处缩写使用最后一个字母K而非开头的B,是为了避免与Blue混淆。灰度模型使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像。每个灰度对象都具有从 0%(白色)到100%(黑色)的亮度值。
matplotlib在使用颜色过程有以下9种方法:
1、RGB小数模式:3元组(r, g, b),对应R、G、B,每个元素取值要求为0到1之间的小数,例如(0.1, 0.2 ,0.5)。下图例子中画布背景色就是用的这个方法。
2、RGBA小数模式:4元组(r, g, b, a),对应R、G、B、A,每个元素取值要求为0到1之间的小数,例如(0.1, 0.2 ,0.5 ,0.4)。
3、RGB16进制字符串模式:长度为7的字符串#rrggbb,以#开头后面6位16进数字,每2位一组,对应R、G、B,例如#FFFFFF。下图例子中axes背景颜色就是用的这个方法。
4、灰度小数字符串模式:小数字符串,表示灰度,小数取值范围为0到1,例如'0.5',下图例子中标题颜色就是用的这个方法。
5、基础颜色字符:长度为1的字符串,取值范围为{'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}对应RGB模型、CMYK模型的基础色和白色。下图例子中横坐标颜色就是用的这个方法。
6、X11/CSS4 ("html")模式的色彩名称:字符串,比如"blue"。下图例子中纵坐标颜色就是用的这个方法。
7、xkcd色彩名称:以xkcd:开头的字符串,对应xkcd社区定义的色彩映射,例如'xkcd:sky blue'。下图例子中实线图形颜色就是用的这个方法。
8、默认色彩循环,Cn彩色:由字符串C和1个非负整数构成。下图例子中虚线图形颜色就是用的这个方法。
9、Tableau色彩定义:以tab:开头的字符串,取自Tableau的tab10调色盘。下图例子中坐标轴刻度颜色就是用的这个方法。
example:
import matplotlib.pyplot as pltimport numpy as npt = np.linspace(0.0, 2.0, 201)s = np.sin(2 * np.pi * t)# 1) RGB tuple:fig, ax = plt.subplots(facecolor=(.18, .31, .31))# 2) hex string:ax.set_facecolor('#eafff5')# 3) gray level string:ax.set_title('Voltage vs. time chart', color='0.7')# 4) single letter color stringax.set_xlabel('time (s)', color='c')# 5) a named color:ax.set_ylabel('voltage (mV)', color='peachpuff')# 6) a named xkcd color:ax.plot(t, s, 'xkcd:crimson')# 7) Cn notation:ax.plot(t, .7*s, color='C4', linestyle='--')# 8) tab notation:ax.tick_params(labelcolor='tab:orange')plt.show()

matplotlib内置的颜色可以使用matplotlib.colors 调用,有'BASE_COLORS',
'TABLEAU_COLORS','CSS4_COLORS'及 'XKCD_COLORS'四类。使用matplotlib.colors.类名称可输出颜色号。
基础的颜色8种,b---blue,c---cyan,g---green,k----black,m---magenta r---red,w---white,y----yellow
Tableau色彩有10种tab:blue #1f77b4,tab:orange #ff7f0e,tab:green #2ca02c,tab:red #d62728,tab:purple #9467bd,tab:brown #8c564b,tab:pink #e377c2,tab:gray #7f7f7f,tab:olive #bcbd22,tab:cyan #17becf
CSS4_COLORS共计148种颜色。
XKCD_COLORS色号,共计949种色号,可以参考https://xkcd.com/color/rgb/



图形组件:

标记:
处理标记的功能;使用的标记物的功能 plot,scatter和 errorbar。
matplotlib.markers.MarkerStyle(marker=None, fillstyle=None)




线型:
set_linestyle(ls)


标题:
matplotlib.pyplot.title(label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs)
label:str, 标题文本
fontdict: dict, 一个字典用来控制标题的字体样式,默认值如下:
{'fontsize': rcParams['axes.titlesize'],'fontweight': rcParams['axes.titleweight'],'color': rcParams['axes.titlecolor'],'verticalalignment': 'baseline','horizontalalignment': loc}
loc: str, 标题水平样式可为{'center', 'left', 'right'},分别表示居中,水平居左和居右,默认为水平居中。
pad:float, 标题距轴顶部的偏移量(以磅为单位),默认为None。
y:标题的垂直轴位置,默认为None。
kwargs: 可以设置一些其他的文本属性。
显示中文的方法:
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
注解:
有两种方法添加,matplotlib.pyplot.annotate和matplotlib.pyplot.text,前者可以在注解的数据坐标与注解文本之间添加箭头。
matplotlib.pyplot.annotate(text, xy, *args, **kwargs)
text:注解文本。字符串。必备参数。
xy:需要注解的坐标,使用xycoords参数确定的坐标系,浮点数元组,必备参数。
xycoords:设置xy参数所使用的坐标系,可选参数。
xytext:放置注解文本的坐标。浮点数元组。默认值为xy,必备参数。
textcoords:设置xytext所使用的的坐标系。
annotation_clip:当注解超出子图区域后是否绘制,布尔值或None,默认值为None。可选参数。
**kwargs:Text对象的相关属性。
matplotlib.pyplot.text(x, y, s, fontdict=None, withdash=False, **kwargs)
x,y:放置文本的坐标,浮点数,必备参数。
s:文本,text字符串,必备参数。
fontdict:字体属性字典,用于覆盖默认文本的字体属性,默认值为None,应用rcParams中的字体属性,可选参数。
**kwargs:Text对象的相关属性。
坐标轴:
matplotlib.pyplot.xlabel(xlabel, fontdict=None, labelpad=None,*, loc=None, **kwargs)
xlabel:类型为字符串,即标签的文本。
labelpad:类型为浮点数,默认值为None,即标签与坐标轴的距离。
loc:取值范围为{'left', 'center', 'right'},默认值为rcParams["xaxis.labellocation"]('center'),即标签的位置。
**kwargs:Text 对象关键字属性,用于控制文本的外观属性,如字体、文本颜色等。
图例:
matplotlib.pyplot.legend(*args, **kwargs)
loc:图例位置:

bbox_to_anchor:用于定位图例位置,2元组或者4元组
ncol:图例具有的列数
prop:图例的字体属性
fontsize:图例的字体大小,{'xx-small','x-small','small','medium','large','x-large','xx-large'}
labelcolor:图例中文本的颜色
numpoints:折线图例中标记点的数量
scatterpoints:散点图例中标记点的数量
scatteryoffsets:散点图图例条目创建的标记的垂直偏移
markerscale:图例标记与原始绘制标记的相对大小
markerfirst:如果为True,则图例标记放置在图例标签的左侧。如果为False,则图例标记位于图例标签的右侧。
frameon:控制是否应在图例周围绘制框架
fancybox:控制是否应在构成图例背景的FancyBboxPatch周围启用圆边
shadow:控制是否在图例后面画一个阴影
framealpha:控制图例框架的 Alpha 透明度
facecolor:图例的背景色
edgecolor:图例的背景色块边缘颜色
mode:如果将mode设置为"expand",则图例将水平扩展以填充轴区域
bbox_transform:边界框的转换
title:标题
title_fontsize:图例标题的字体大小
borderpad:图例边框内的小数空格,以字体大小为单位
labelspacing:图例条目之间的垂直间隔,以字体大小为单位
handlelength:图例句柄的长度,以字体大小为单位
handletextpad:图例和文本之间的距离,以字体大小为单位
borderaxespad:轴与图例边框之间的距离,以字体大小为单位
columnspacing:列之间的间距,以字体大小为单位
handler_map:自定义词典将实例或类型映射到图例处理程序
数学公式
有自带TeX表达式解析器以r'$开头,也兼容LaTeX,使用plt.rcParams
https://matplotlib.org/stable/tutorials/text/mathtext.html、
网格:
matplotlib.pyplot.grid(b=None, which='major', axis='both', **kwargs)
b : 布尔值,是否显示网格线。
which : 网格线显示的尺度,字符串,可选参数,取值范围为{'major', 'minor', 'both'}。
axis : 选择网格线显示的轴,取值范围为{'both', 'x', 'y'},默认为'both'。
**kwargs:grid对象的相关属性。
坐标轴刻度:
matplotlib.pyplot.locator_params(axis='both', tight=None, **kwargs)
axis:操作的轴,值范围为{'both', 'x', 'y'}, 默认为 'both'
ax.locator_params(nbins = n),将坐标轴都平均分n等分。
坐标轴范围:
matplotlib.pyplot.xlim(*args, **kwargs
双坐标轴:
matplotlib.pyplot.twinx(ax=None)
ax2 = ax1.twinx()
保存图片:
matplotlib.pyplot.savefig(*args, **kwargs)savefig(fname, dpi=None, facecolor='w', edgecolor='w',orientation='portrait', papertype=None, format=None,transparent=False, bbox_inches=None, pad_inches=0.1,frameon=None, metadata=None)
fname:路径
dpi:分辨率,以每英寸点数为单位
quality:图像质量,等级从1(最差)到95(最佳)
optimize:优化、仅在format为'jpg'或'jpeg'时适用,否则忽略。
progressive:图像是否应存储为渐进式JPEG文件
facecolor:图的面色颜色或'自动'
edgecolor:图的边缘颜色或'自动'
orientation:当前仅由postscript后端支持
papertype:纸张类型
format:文件格式
transparent:如果为True,则轴补丁将全部透明;图形补丁也将是透明的
bbox_inches:边框(以英寸为单位)
pad_inches:当bbox_inches为“ tight”时,图形周围的填充量
bbox_extra_artists:计算紧的bbox时将考虑的其他艺术家的列表
backend:使用非默认后端来渲染文件
metadata:要存储在图像元数据中的键/值对
pil_kwargs:保存图形时传递给的其他关键字参数
绘图风格:
使用matplotlib画图的时候,除了我们可以针对每一个样式自己定义以外,我们还可以使用系统定义好的样式快速配置。style是pyplot的一个子模块,方便进行风格转换,它里面定义了很多预设风格。
使用plt.style.available输出所有风格名称,共计26种。
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background',
'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
matplotlib.style.use(style)import matplotlib.pyplot as pltprint(plt.style.available)

matplotlib所绘制的每个组成部分都有对应一个对象,Line2D对象有很多属性可以设置。
matplotlib.lines.Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, marker=None,markersize=None, markeredgewidth=None, markeredgecolor=None, markerfacecolor=None,markerfacecoloralt='none', fillstyle=None, antialiased=None, dash_capstyle=None,solid_capstyle=None, dash_joinstyle=None, solid_joinstyle=None, pickradius=5, drawstyle=None,markevery=None, **kwargs)
配置文件:
matplotlib的配置文件异常强大,能够配置各种属性
matplotlib.RcParams(*args, **kwargs)
https://matplotlib.org/stable/api/matplotlib_configuration_api.html?highlight=rcparams#matplotlib.RcParams
其他:
分格图、图中图、工具包和3D、动画功能这里就不介绍了,下次单独讲
总结:


参考文档:
官方文档:https://matplotlib.org/




