[python][科学计算][matplotlib]使用指南

 

最后一次更新日期: 2019/4/20

Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。

按需导入以下模块:


import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np


 

点击下方链接可前往各小节

使用指南1 - 绘图结构 (图像,坐标轴/子图,显示,保存)

使用指南2 - 绘图设置 (投影类型,字体,颜色,标题,坐标轴,图例,标记样式,线条样式,透明度,旋转,子图布局)

使用指南3 - 常用绘图类型(散点图,曲线图,曲面图,条形图,直方图,饼图/环图,箱线图,等高线图,极坐标图)

使用指南4 - 其他绘图元素(注解,填充,图片,基本图形,数据表格)

 

一. 绘图结构

返回目录

1. 图像figure

In [71]: fig=plt.figure(1)
<Figure size 432x288 with 0 Axes>

In [72]: fig=plt.figure(2,figsize=(5,3))
<Figure size 360x216 with 0 Axes>

In [73]: fig.suptitle('title')
Out[73]: Text(0.5,0.98,'title')

Figure是所有绘图元素的顶级容器,可以认为是一张画布,第一个参数num设置图像的编号,第二个figsize参数设置图像大小。

Figure.suptitle方法用于设置图像的总标题(也可通过plt.suptitle设置),fontsize参数可以设置字体大小,xy参数设置位置坐标,取值为0.~1.的相对于Figure的宽和高的比例。

Figure上无法直接绘图,需要至少添加一个Axes,在调用plt的静态方法绘图时,会绘制在最近声明的一个Figure上,不显示声明则会自动按默认配置创建FigureAxesplt.gcf()方法可以获取当前正在绘制的Figure

Figure.axes可以获取图像下的所有Axes; Figure.clf()方法可以清空图像。

Artist是matplotlib中所有绘图对象的基类,Figure也是继承自该类,可在官方文档查看到完整的继承关系。

2. 坐标轴axes

x=np.arange(0,720,1)
y1=np.sin(x*np.pi/180)
y2=np.cos(x*np.pi/180)

#方法1
fig=plt.figure(figsize=(7.5,3))
fig.suptitle('sin/cos',fontsize=16)
ax=fig.add_axes((0,0,0.5,0.8),title='ax1')
ax.plot(x,y1)
ax=fig.add_axes((0.6,0,0.5,0.8),title='ax2')
ax.plot(x,y2)
plt.show(fig)

 

 

 

#方法2
fig=plt.figure(figsize=(10.5,3))
fig.suptitle('sin/cos',fontsize=16)
ax=fig.add_subplot(121,title='ax1', projection='3d')
ax.plot(x,y1)
ax=fig.add_subplot(122,title='ax2', projection='3d')
ax.plot(x,y2)
plt.show(fig)

 

 

 

Axes的意思是用于绘图的坐标轴,AxesSubplot是封装了Axes的子图,通过不同的方法创建,子图在布局上更方便,绘图时则没有明显的区别,下面会将Axes也称作子图。

绘制不同图像会使用不同轴类型,最常用的xy坐标轴和xyz坐标轴分别为AxesAxes3D。如果只需要一个Axes,可以不显示声明,直接调用plt的静态方法绘制,Axes会被自动创建(通过add_subplot(111))。当存在多个Axes时,可以调用Axes的方法绘图以保证图像被绘制在正确的子图上,调用静态方法绘制时实际上是通过plt.gca()获取了最后声明的Axes

Axes.plot是绘图方法,用于绘制曲线图。 Axes在绘图时需要提供x,y两个轴的坐标,而Axes3D需要提供x,y,z三个轴的坐标,上方的例子中没有提供z轴坐标所以图像被绘制在高度为0的一个平面上。

Axes是绑定在Figure上的,可通过调用Figureadd_axesadd_subplot方法创建新的Axes或是将已有Axes添加到Figure上。两种方法在子图的大小和位置的设置上有所区别,需要相应的调整参数。 add_axes方法的第一个参数rect通过一个浮点数序列设置Axes的位置和大小,格式为(left,bottom,width,height),值均为0.~1.的相对于Figure的宽和高的比例。 add_subplot方法的前三个参数分别设置区间划分的行数、列数、以及子图的索引,例如2,3,5表示将Figure划分为2行3列,在其中第5个区间上添加子图;前三个参数可以替换为单个3位整数表示同一含义,但每位的值不得超过10,例如2,3,5对应235。 title参数用于设置子图的标题,也可通过Axes.set_titleplt.title方法设置; projection参数设置投影类型,即坐标轴类型,其中,'rectilinear'表示直线(xy)坐标轴,也是默认值,'3d'表示3D(xyz)坐标轴。

除以上两种方法,还可使用fig,ax_list = plt.subplots(figsize=(10.5,3),ncols=2,nrows=1)快速规划画布,只需要指定画布大小、列划分数量和行划分数量,省去写循环的时间。

get_children方法能够获取Axes下的所有绘图元素; collections属性能够获取所有绘图元素集合; 如想获取指定类型的元素,可使用get_xlabel等方法; cla方法可以清除当前轴的内容。

3. 显示show

plt.plot(x,y1)
plt.plot(x,y2)
plt.show()

 

 

 

plt.plot(x,y1)
plt.show()
plt.plot(x,y2)
plt.show()

 

 

plt.show()方法用于显示已绘制的图像,一般配合plt的静态绘图方法使用(即不显示声明Figure的情况)。在使用静态方法绘图时,如果不调用show,则代码段的中所有绘图元素将会绘制在自动创建的同一Figure的同一Axes上。

 

在ipython中,直接输入Figure的变量名也可以将其图像显示出来;在执行一段含绘图语句的代码段后,也会自动显示图像。

4. 保存save

fig.savefig('D:\\test.jpg')

 

Figuresavefig方法可以保存图片至指定路径,也可调用plt的静态方法保存,但必须和绘图的代码一起执行,且必须在show方法之前执行。

ipython中直接右键显示出来的图片也有保存的选项。

 

二. 绘图设置

返回目录

1. 投影projection

projection参数用于设置生成的Axes类型,在add_axesadd_subplot等方法中可使用。

常用的几个类型: 'rectilinear':直线坐标轴,即2d的xy坐标轴,默认值; '3d':3D的xyz坐标轴,绘制3d图像会使用这个,注意,使用该类型前必须先导入Axes3D; 'polar':极坐标轴。

2. 字体font

plt.rcParams['font.sans-serif']属性用于设置默认字体,当图像中中文显示存在问题时,可通过该项将字体设置为支持中文的字体,例如['SimHei']黑体; plt.rcParams['font.size']属性用于设置默认字体大小。

也可以仅在特定文本上应用字体,fontsize参数设置字体大小,fontproperties参数设置字体,在suptitleset_titletext等用于定义文字显示的方法中可使用。

当负号无法正常显示时,设置plt.rcParams['axes.unicode_minus']=False

3. 颜色color

多以colorcolors参数设置主体颜色或颜色序列,简写形式c,也有单独设置某个部分颜色的参数:facecolor设置填充颜色,简写形式fcedgecolor设置边缘颜色,简写形式ec

支持多种标识颜色的方式: (1). 以tuple表示的RGB或RGBA值,取值范围在0.~1.,例如(0.1,0.2,0.5); (2). 以str表示的16进制的RGB或RGBA值,取值范围00~FF,例如'#0F0F0F'; (3). 以str表示的颜色标签,可参考下图(官方示例)。

 

除了单个颜色外,matplotlib还提供了colormap,是特定主题的颜色集合,一般通过cmap参数设置,而预定义的colormap在plt.cm下,可用种类详见官方文档

4. 标题title

Figure.suptitleplt.suptitle方法用于设置总标题; Axes.set_titleplt.title方法以及创建Axes时的title参数用于设置子标题。

5. 坐标轴axis

xlabelylabelzlabel等方法用于设置坐标轴的标签; xticksytickszticks等方法用于设置坐标轴的刻度,传入参数为刻度值列表和刻度标签列表,第二个参数可以省略,会以刻度值作为标签文字; xlimylimzlim等方法用于设置坐标轴的范围,传入参数为开始值和结束值;

axis('off')可以关闭坐标轴显示; 以上方法均可通过Axesplt调用。

6. 图例legend

plt.plot(x,y1,label='sin')
plt.plot(x,y2,label='cos')
plt.legend()
plt.show()

 

legend方法用于显示图例,绘图元素必须有标签才能正常生成图例,可在绘制图像时通过label参数设置标签,或是调用legend方法时传入标签列表。 loc参数设置图例的位置,默认'best'自动选择。

7. 标记样式marker

参数marker设置标记样式,可选的样式参考官方文档-markers; 参数smarkersize设置标记大小。

标记样式可在散点图、曲线图等中设置。

8. 线条样式linestyle

参数linestyle设置线条样式,一般默认'-'实线,可选的样式见下方表格; 参数linewidth设置线的宽度,简写形式lw

linestyle

说明

'-' or 'solid'

实线

'--' or 'dashed'

虚线

'-.' or 'dashdot'

点划线

':' or 'dotted'

点虚线

'None' or ''

不绘制

线条样式在所有含线条的绘图对象中几乎都可以设置。

9. 透明度alpha

参数alpha设置点的透明度,一般默认1.,值越小透明度越高。

透明度在所有含平面的绘图对象中几乎都可以设置。

10. 旋转rotation

绘图元素旋转
fig=plt.figure(figsize=(4.5,3))
ax=fig.add_axes((0,0,1,1))
ax.plot(x,y1)
for tick in ax.get_xticklabels():
    tick.set_rotation(90)

 

复制代码

部分绘图元素是支持旋转的,可通过set_rotation方法设置或是创建时通过rotation参数设置,也有通过angle参数控制旋转的。

3D图像旋转
fig=plt.figure(figsize=(12,3))
ax=fig.add_subplot(131,title='ax1',projection='3d')
ax.plot(x,y1)
ax=fig.add_subplot(132,title='ax2',projection='3d')
ax.view_init(30,80)
ax.plot(x,y1)
ax=fig.add_subplot(133,title='ax3',projection='3d')
ax.view_init(60,120)
ax.plot(x,y1)

Axes3D的旋转通过view_init方法实现,第一个参数elev控制纵向的旋转角度,默认值30;第二个参数azim控制横向的旋转角度,默认值120。

 

11. 子图布局调整adjust

#自动收缩布局
fig.tight_layout()
#调整子图分布
fig.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.1, hspace=0.1)
复制代码

 

三. 常用绘图类型

返回目录

1. 散点图

n = 100
x = np.random.randn(n)
y = np.random.randn(n)
z = np.random.randn(n)

fig=plt.figure(figsize=(9,3))
ax=fig.add_subplot(121,title='2d scatter')
ax.scatter(x,y,s=100,c=['g','r','y'],marker='*',alpha=0.5,linewidths=1,edgecolor='k')
ax=fig.add_subplot(122,title='3d scatter',projection='3d')
ax.scatter(x,y,z)
plt.show()

 

 

scatter方法用于绘制散点图: 参数s设置点的大小(面积),默认20; 参数c设置点的颜色,可以是单个也可以多个,默认'b'蓝色; 参数marker设置点的样式,默认'o'圆; 参数alpha设置点的透明度,默认1.,值越小透明度越高; 参数linewidths设置边缘线的宽度,默认None; 参数edgecolor设置边缘线的颜色,默认None

2. 曲线图

n = 100
x = np.arange(0,8*n,8)
y = np.sin(x*np.pi/180)
z = np.cos(x*np.pi/180)

fig=plt.figure(figsize=(9,3))
ax=fig.add_subplot(121,title='2d plot')
ax.plot(x,y,'g<-',alpha=0.5,linewidth=2, markersize=8)
ax=fig.add_subplot(122,title='3d plot',projection='3d')
ax.plot(x,y,z)
plt.show()

 

 

plot方法用于绘制散点图: 参数fmt设置整体样式,紧跟坐标参数之后,是cmarkerlinestyle三个参数的整合,用于快速设置,也可选择单独设置这三个参数; 参数c设置线和标记的颜色,只能是单个颜色,默认'b'蓝色; 参数marker设置标记样式,默认None; 参数linestyle设置线条样式,默认'-'实线; 参数alpha设置点的透明度,默认1.,值越小透明度越高; 参数linewidth设置线的宽度; 参数markersize设置标记的大小。

 

3. 曲面图

#曲面图
n = 480
x = np.arange(n)
y = np.arange(n)
x,y = np.meshgrid(x,y)
z = np.cos(x*np.pi/180)+np.sin(y*np.pi/180)

fig=plt.figure()
ax=fig.add_subplot(111,title='3d surface',projection='3d')
ax.plot_surface(x,y,z,rstride=10,cstride=10,cmap=plt.cm.winter)
plt.show()

 

plot_surface方法用于绘制曲面图: 参数rstridecstride设置x、y轴方向上的采样步长,被采样的数据才会用于曲面的绘制,值越小表示采样精度越高,绘制的图像越精细,绘制时间也更长,与rcountccount参数不兼容; 参数rcountccount设置x、y轴方向上的采样总数,默认50; 参数cmap设置曲面颜色集,需要是colormap,默认蓝色单色渐变; 参数alpha设置点的透明度,默认1.,值越小透明度越高。

 

绘制曲面图需要构造xy平面上的网格数据以及对应的z值,可使用numpy的mgrid索引器或meshgrid方法实现。

4. 条形图

x = np.array([1,2,3,4])
y1 = np.array([4,3,3,1])
y2 = np.array([2,5,1,3])
tick_label = ['a','b','c','d']

fig=plt.figure(figsize=(10,3))
ax=fig.add_subplot(131,title='2d bar')
ax.bar(x+0.15,y1,width=0.3,color='y',label='y1',alpha=0.7, tick_label=tick_label)
ax.bar(x-0.15,y2,width=0.3,color='g',label='y2',alpha=0.7, tick_label=tick_label)
ax.legend()

ax=fig.add_subplot(132,title='2d bar in 3d axes',projection='3d')
ax.bar(x,y1,0,'y',label='y1',edgecolor='k',linewidth=1)
ax.bar(x,y2,1,'y',label='y2',edgecolor='k',linewidth=1)
ax.legend(facecolor='none')

ax=fig.add_subplot(133,title='3d bar',projection='3d')
bar3d1=ax.bar3d(x,0,0,0.5,0.25,y1,label='y1')
bar3d2=ax.bar3d(x,1,0,0.5,0.25,y2,label='y2')
bar3d1._facecolors2d=bar3d1._facecolors3d
bar3d1._edgecolors2d=bar3d1._edgecolors3d
bar3d2._facecolors2d=bar3d2._facecolors3d
bar3d2._edgecolors2d=bar3d2._edgecolors3d
ax.legend()
plt.show()

 

 

 

bar方法用于绘制条形图(水平条形图请使用barh):

2D

第一个参数x是条形的横坐标,对齐的基准由align参数设置,默认是与中心对齐; 第二个参数height设置条形的高度; 第三个参数width设置条形的宽度; 第四个参数bottom设置条形底部的起始纵坐标,默认0; 参数color设置条形的颜色; 参数tick_label设置横坐标刻度标签; 参数edge_colorlinewidth设置边缘线的颜色和粗细; 参数label设置此次绘制的类别标签; 参数alpha设置点的透明度,默认1.,值越小透明度越高。

2d条形图在绘制时视需要调整x的值,不然多次绘制的条形会重叠在一起。

2D in Axes3D

第一个参数left设置条形的起始横坐标,相当于2d情况下设置align='edge'; 第二个参数height设置条形的高度,与2d情况下一样; 第三个参数zs设置z轴的取值; 第四个参数zdir设置作为z轴的轴,默认'z'; 其余拓展参数和2d的一样。

3D

第1,2,3个参数x,y,z设置条形的位置坐标; 第4,5,6个参数dx,dy,dz设置条形的长宽高; 其余拓展参数和2d的一样。

3D条形图需要显示图例时必须为_facecolors2d_edgecolors2d赋值,因为生成图例使用的是2d的色彩设置,这应该是一个bug。

5. 直方图

x = np.random.randn(1000)
y = np.random.randn(1000)

fig=plt.figure(figsize=(9,3))
ax=fig.add_subplot(121,title='hist')
result1=ax.hist(x,bins=20,color="g",edgecolor="k",alpha=0.5,density=True)
ax=fig.add_subplot(122,title='hist2d')
result2=ax.hist2d(x,y,bins=20)
plt.show()

 

 

hist方法用于绘制直方图: 第1个参数x设置需要统计的数据,y轴数据是统计频次,自动计算不需要自行设置; 第2个参数bins设置分箱数量,即分成多少个等间隔的统计区间,默认10; 参数colorfacecolor设置条形的颜色;参数edgecolor设置边缘线的颜色; 参数density设置是否归一化,False时统计频次,True时统计概率密度,默认False; 参数alpha设置点的透明度,默认1.,值越小透明度越高。

 

hist2d方法用于绘制二维直方图: 第1,2个参数x,y设置需要统计的数据,二维直方图中统计频次以颜色来体现; 第3个参数bins设置分箱数量,即分成多少个等间隔的统计区间,默认10,x,y可以分别设置; 参数cmap设置颜色集。

调用绘图方法后会得到返回值:频次和频率的统计结果。

6. 饼图/环图

x1 = np.array([1,2,3,4])
x1_labels = ['a','b','c','d']
x1_explode = [0.2,0,0,0]
x2 = np.array([2,2,1,5])

fig=plt.figure(figsize=(9,4))
ax=fig.add_subplot(121,title='pie')
ax.pie(x1,explode=x1_explode,labels=x1_labels,shadow=True,autopct='%1.1f%%')
ax=fig.add_subplot(122,title='ring')
ax.pie(x1,radius=1,wedgeprops=dict(width=0.3, edgecolor='w'))
ax.pie(x2,radius=0.7,wedgeprops=dict(width=0.3, edgecolor='w'))
plt.show()

 

 

pie方法用于绘制饼图: 第一个参数x设置每个扇形的比重,会自动计算x/sum(x)应用于绘制,但在sum(x)<1时,不会进行该计算; 第二个参数explode设置每个扇形偏离中心的距离,默认None; 第三个参数labels设置每个扇形的标签; 第四个参数colors设置颜色序列,绘制扇形时会轮流使用该序列中的颜色; 参数shadow设置是否绘制阴影,默认False; 参数labeldistance设置扇形标签与中心的距离; 参数radius设置扇形的半径,默认为1; 参数autopct设置扇形上显示的信息,可以是一个字符串格式或是一个函数; 参数wedgeprops设置扇形的样式,其中width是宽度,与radius一致时绘制出来的就是饼图,小于radius则是环图,edgecolorlinewidth可以设置边缘线的颜色和宽度; 参数center设置饼图的中心,默认(0,0)。

7. 箱线图

def test_data():
    spread = np.random.rand(50)
    center = np.ones(25) * 0.5
    flier_high = np.random.rand(10)+1
    flier_low = np.random.rand(10)-1
    return np.r_[spread,center,flier_high,flier_low]

x1 = test_data()
x2 = test_data()

fig=plt.figure()
ax=fig.add_subplot(111,title='box')
ax.boxplot([x1,x2],labels=['x1','x2'],widths=0.3)
plt.show()

 

 

boxplot方法用于绘制箱线图: 第一个参数x设置用于绘图的数据,当有多组时可以放在一个list中传入; 参数labels设置每组数据的类别标签; 参数width设置图形的宽度。

 

8. 等高线图

x = np.arange(-3,3,0.01)
y = np.arange(-3,3,0.01)
x,y = np.meshgrid(x,y)
z = (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)+1

fig=plt.figure(figsize=(13.5,3))
ax=fig.add_subplot(131,title='2d contourf')
c=ax.contour(x,y,z,colors='k',linewidths=0.5)
ax.clabel(c,fontsize=10)
cf=ax.contourf(x,y,z,cmap='YlOrRd')
cbar=fig.colorbar(cf)

ax=fig.add_subplot(132,title='3d contourf',projection='3d')
ax.contourf(x,y,z,cmap='YlOrRd')
ax.contour(x,y,z,colors='k',linewidths=0.2)

ax=fig.add_subplot(133,title='3d surface with contour',projection='3d')
ax.plot_surface(x,y,z,cmap='YlOrRd',alpha=0.7)
ax.contour(x,y,z,colors='k',linewidths=1)
plt.show()

 

 

 

contour方法用于绘制等高线图: 第1,2,3个参数x,y,z设置用于绘图的数据,z是高度; 第4个参数levels设置等高线的数量; 参数colors设置等高线使用的颜色序列; 参数linewidths设置等高线的宽度序列; 参数linestyles设置等高线的样式序列。

contourf方法用于填充等高线图: 第1,2,3个参数x,y,z设置用于绘图的数据,z是高度; 第4个参数levels设置等高线的数量; 参数cmap设置用于填充的颜色集; 参数alpha设置点的透明度,默认1.,值越小透明度越高。

clabel方法用于设置等高线标签; colorbar方法用于设置参考颜色条;

9. 极坐标图

theta=np.linspace(0,2*np.pi,100)

fig=plt.figure(figsize=(10,5))
ax=fig.add_subplot(121,title='polar1',projection='polar')
ax.plot(theta,theta,c='b',lw=2)
ax.set_rmax(theta.max())

ax=fig.add_subplot(122,title='polar2',projection='polar')
ax.plot(theta,theta,c='r',lw=2)
ax.set_rmax(theta.max())
ax.set_rlabel_position(90)
ax.set_theta_offset(np.pi)
ax.set_thetagrids(np.arange(0,360,15))
ax.set_rticks(np.arange(0,6.5,0.5))
ax.set_theta_direction(-1)

 

 

 

通过设置projection='polar'创建PolarAxes坐标轴,即可实现极坐标作图:set_rmax,set_rmin,set_rlim方法分别可以设置极径的最大值,最小值,以及范围;set_rlabel_position方法设置极径标签的位置,以角度表示; set_theta_offset方法设置角度的偏移量,以弧度表示; set_thetagrids方法设置角度刻度序列,会影响网格线; set_rticks方法设置极径刻度序列,会影响网格线; set_theta_direction方法设置角度增长方向。

在调用plot等方法绘图时,原本的xy分别对应到角度和极径。

 

四. 其他绘图元素

返回目录

1. 注解annotate

fig=plt.figure(figsize=(10,3.5))
ax=fig.add_subplot(121,title='annotate')
ax.scatter([-0.25],[-0.25],s=100)
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])

bbox_style = dict(boxstyle="square", fc='white', ec='black',lw=1)
arrow_style = dict(arrowstyle='->',color='black',lw=2)
ax.annotate('This is a dot.',(-0.24,-0.24),(-0.14,0.16),
            arrowprops=arrow_style,bbox=bbox_style,fontsize=15)

ax=fig.add_subplot(122,title='arrow+text')
ax.scatter([-0.25],[-0.25],s=100)
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])

ax.arrow(0.09,0.06,-0.25,-0.23,fc='k',ec='k',
         width=0.01,head_width=0.07,head_length=0.07)
ax.text(-0.14,0.16,'This is a dot.',fontsize=15,bbox=bbox_style)

 

 

annotate方法用于向图像上添加注解: 第一个参数s设置注释的文本; 第二个参数xy设置要注释的点位置,tuple类型表示的坐标; 第三个参数xytext设置注释文本的位置,tuple类型表示的坐标; 参数xycoordstextcoords设置注释点位置和文本位置所采用的坐标系,默认'data'和数据的坐标系一致; 参数arrowprops设置箭头,dict类型,其中arrowstyle属性设置样式,color属性设置颜色,lw属性设置箭头宽度; 以上三个参数具体信息建议参考官方文档-annotate; 参数bbox设置文本框样式,dict类型,其中boxstyle属性设置样式,fc属性设置填充颜色,ec属性设置边缘颜色,lw属性设置边缘线宽度; bbox中的详细设置建议参考官方文档-Rectangle; 参数fontsize设置字体大小。

 

注解也可通过arrow+text实现。

arrow方法用于添加箭头: 第1,2个参数x,y设置箭头的起始位置; 第3,4个参数dx,dy设置箭头往xy方向延伸的长度; fc参数设置填充颜色;ec参数设置边缘颜色; width参数设置箭头线宽度; head_width参数设置箭头头部的宽度; head_length参数设置箭头头部的长度。

text方法用于添加文本: 第1,2个参数x,y设置文本的位置; 第3个参数s设置要显示的文本; 参数fontsize设置字体大小; 参数bbox设置文本框样式,与annotate相同。

arrow绘制的箭头在有所倾斜时无法保证头部的底部与线垂直,对此有要求只能使用annotate

2. 区域填充fill

x=np.arange(0,720,1)
y1=np.sin(x*np.pi/180)
y2=np.cos(x*np.pi/180)

fig=plt.figure(figsize=(10,3.5))
ax=fig.add_subplot(121,title='fill')
ax.plot(x,y1)
ax.plot(x,y2)
ax.fill(x,y1,color='g',alpha=0.3)
ax.fill(x,y2,color='b',alpha=0.3)

ax=fig.add_subplot(122,title='fill between')
ax.plot(x,y1)
ax.plot(x,y2)
ax.fill_between(x,y1,y2,color='g',alpha=0.3)

 

fill方法用于填充多边形: 第1,2个参数x,y设置边的xy坐标,该绘图方法不适合填充不封闭的曲线,会如上图出现无法预估的绘制效果。

 

fill_between方法用于填充两条曲线中间的区域: 第1,2,3个参数x,y1,y2设置x坐标和两条曲线的y坐标; 第4个参数where设置绘制的横坐标范围,布尔数组类型,相当于对前三个参数执行索引筛选。

3. 图片image

from PIL import Image
image1=Image.open('D:\\training_data\\used\\cifar-10-batches-py\\test\\1_猫.png')
image2=Image.open('D:\\training_data\\used\\cifar-10-batches-py\\test\\2_船.png')

fig=plt.figure(figsize=(8,4))
ax=fig.add_subplot(121,title='image1')
ax.imshow(image1)
ax=fig.add_subplot(122,title='image2')
ax.imshow(image2)

 

imshow用于显示图片,默认是会显示坐标轴和刻度的,可通过Axes.axis('off')关闭。

4. 基本图形patch

import matplotlib.patches as patches
from matplotlib.collections import PatchCollection

fig=plt.figure(figsize=(9,3))

ax=fig.add_subplot(121,title='Rectangle')
rects=[]
x=[1.5,3.5,5.5,]
y=[3,4.5,3]
for i in range(3):
    rect=patches.Rectangle((x[i],y[i]),3,3)
    rects.append(rect)
pc=PatchCollection(rects,linewidth=1,edgecolor='r',facecolor='none')
#ax.add_patch(rect)
ax.add_collection(pc)
ax.set_xlim([0,10])
ax.set_ylim([0,10])

ax=fig.add_subplot(122,title='Ellipse')
ells=[]
for i in range(5):
    ell=patches.Ellipse((5,5),6,3,angle=i*36)
    ells.append(ell)
pc=PatchCollection(ells,facecolor='g',alpha=0.5)
#ax.add_patch(ell)
ax.add_collection(pc)
ax.set_xlim([0,10])
ax.set_ylim([0,10])

绘制基本图形和相应集合需要导入patchesPatchCollection

 

patches提供了各种图形的构造: Rectangle是矩形类,第1个参数xy设置左下角顶点的坐标,第2,3个参数width,height设置宽度和高度,第4个参数angle设置旋转角度; Ellipse是椭圆类,第1个参数xy设置椭圆中心的坐标,第2,3个参数width,height设置横轴和竖轴的长度(直径),第4个参数angle设置旋转角度。

PatchCollection用于构造patches集合并设置通用的拓展参数: linewidth参数设置边缘线宽;edgecolor参数设置边缘颜色; facecolor参数设置填充颜色,facecolor='none'可以设置不填充(在创建图形类时,fill=False也能设置不填充); alpha参数设置透明度。

add_patch用于向Axes中添加单个图形; add_collection用于向Axes中添加图形集合;Axes.patches可以查看Axes下的所有Patch绘图对象; Axes.collections可以查看Axes下的所有绘图集合。

5. 数据表格table

data=np.array([[1,2,3],[4,5,6],[7,8,9]])
row_labels=['row1','row2','row3']
row_colors=plt.cm.BuPu(np.linspace(0, 0.5, len(row_labels)))
col_labels=['col1','col2','col3']
col_index=np.arange(3)

fig=plt.figure()
ax=fig.add_subplot(111,title='table')
for i in range(len(row_labels)-1,-1,-1):
    ax.bar(col_index,data[i],color=row_colors[i],linewidth=0.5,edgecolor='k')
ax.table(cellText=data,
         rowLabels=row_labels,
         rowColours=row_colors,
         colLabels=col_labels,
         loc='bottom')
ax.set_xticks([])

 

table方法用于添加表格: cellText参数设置单元格数据,二维序列类型,默认NonecellColors参数设置单元格颜色,二维序列类型,默认None; cellTextcellColors两个参数至少有一个要赋值; cellLoc参数设置单元格位置,默认'right'; colWidths参数设置列宽,一维序列类型,可选; rowLabels参数设置行标签,一维序列类型,可选; rowColors参数设置行标签颜色,一维序列类型,可选; rowLoc参数设置行标签位置,默认'left'; colLabels参数设置列标签,一维序列类型,可选; colColors参数设置列标签颜色,一维序列类型,可选; colLoc参数设置列标签位置,默认'center'; loc参数设置表格位置,默认bottom; bbox参数设置方框样式,可选。

更详细的设置可以自行创建Table对象,通过Axes.add_table方法添加; Axes.tables可以查看Axes下的所有Table绘图对象。