最后一次更新日期: 2019/4/20
Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
按需导入以下模块:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
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
设置整体样式,紧跟坐标参数之后,是c
、marker
、linestyle
三个参数的整合,用于快速设置,也可选择单独设置这三个参数;
参数
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
方法用于绘制曲面图:
参数
rstride
和cstride
设置x、y轴方向上的采样步长,被采样的数据才会用于曲面的绘制,值越小表示采样精度越高,绘制的图像越精细,绘制时间也更长,与rcount
和ccount
参数不兼容;
参数
rcount
和ccount
设置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_color
和linewidth
设置边缘线的颜色和粗细;
参数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;
参数
color
或facecolor
设置条形的颜色;参数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
则是环图,edgecolor
和linewidth
可以设置边缘线的颜色和宽度;
参数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
等方法绘图时,原本的x
和y
分别对应到角度和极径。