1. 导入库:import matplotlib.pyplot as plt
2. 传入数据:比如plt.plot([y1,y2...]),此时只传入了一个数组,那么库会假定传入的是图表的y值,于是将其跟一个序列的x值对应起来,x取值为0、1、2、...
又比如plt.plot([x1,x2...],[y1,y2...]),此时传入的是两个数组,第一个数组为x轴上各数值,第二个数组为y轴上各数值
其实,[x1,x2...]和[y1,y2...]就是NumPy数组,可以直接把NumPy数组作为输入数据,同时数组经过pandas处理后也无需进一步处理,比如plt.plot(t,y1)
3. 绘制图表:plt.show()
此外还可以绘制子图,用subplot()函数先进行区域设置,其中参数由3个连续整数组成,分别表示垂直方向、水平方向被分成几部分以及可以直接用命令控制的子图
# 比如要分成上下两个子图,则先plt.subplot(211)然后绘制第一个,接着plt.subplot(212)然后绘制第二个
# 再比如要分成左右两个子图,则先plt.subplot(121)然后绘制第一个,接着plt.subplot(122)然后绘制第二个
4. 修饰图表元素:
(1) 带颜色的数据点:比如'ro'红色圆点,'b*'蓝色星星点,'g^'绿色正三角点,'ys'黄色正方形点等等,就是'颜色+形状'做参数加到plt.plot()里头去就行了
# 注意默认的是实线,如果用了这个参数,图表里面就没实线了,全是点。对于颜色,还有:'c'蓝绿色、'm'洋红、'k'黑色、'w'白色
(2) 带颜色的其他线型:比如'b--'是蓝色虚线,'r-.'红色点线等等
(3) 改变线条粗细:增加参数linewidth,比如设置linewidth=2.0
(4) axis():定义x轴和y轴的取值范围,plt.axis([xmin,xmax,ymin,ymax]) # 一般提前进行的,比如不合理的轴取值可能会让数据点在边缘
(5) title():为图表增加标题,plt.plot('My first plot')
(6) xlabel()和ylabel():添加轴标签
# 对于(4)~(6),还可以参加参数来修改文本属性,比如fontsize=20、fontname='Times New Roman'、color='gray'
(7) text():为各个数据点添加标签,它有四个参数text(x,y,s,fontdict=None,**kwargs),其中x,y,s表示三维坐标点,如果两维则x,y即可,fontdict为文本要使用的字体,**kwargs为要添加的标签
比如plt.text(1,1.5,'First')则为数据点(1,1.5)添加了字符串标签First,fontdict参数如果没特别要求可以不管
此外,text()中还能支持latex表达式,即**kwargs处添加r'$y=x^2$',注意3点,一是用r开头,二是用''引用,三是用$$界定公式范围
(8) grid():添加网格,用plt.grid(True)即可
(9) legend():添加图例,比如:plt.plot([1,2],[2,3],'ro') plt.plot([2,3],[1,2],'b*') plt.legend(['First series','Second series'])
意思就是分别给'ro'和'b*'两个数据集添加图例(图例实际上就是在图标里弄个小框标注哪些线或点表示什么意思)
legend()函数默认为1,即右上角添加,还可以添加关键字参数loc来指定,loc取值从0~10分别表示最佳位置、右上角、左上角、右下角、左下角、右侧、左侧垂直居中、右侧垂直居中、下方水平居中、上方水平居中、正中间
5. 保存图片:plt.savefig('图片名.png') # 切记在最后一行使用
6. 处理日期值:如果让matplotlib自动管理可读,会在时间轴(x轴)出现不清晰,很混乱,所以要人为设置时间格式
有set_major_locator()、set_minor_locator()、set_major_formatter()等函数,需要的时候网上copy一段代码即可,这波操作有代码片段滴!
7. 画线形图:
(1) 绘制由数学函数生成的数据点:比如x=np.arange(-2*np.pi,2*np.pi,0.01) y=np.sin(3*x)/x,还是得先单独指定x范围
# 注意上面这个例子,x的范围是-2pi~2pi,但刻度标签默认使用数值形式,如果要用pi的倍数代替数值,则以下代码操作一波
# plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],[r'$-2\pi$',r'$-np.pi$',r'$0$',r'$+\pi$',r'$+2\pi$']),格式就是两个列表,后面那个用latex表达式,且套上独有的界定符
# 如果要修改纵轴,使用yticks()函数即可
(2) 绘制一系列数据点:需要创建两个NumPy数组,一个包含x值,另一个包含每个x值所对应的y值
(3) 让x,y轴穿过(0,0)的方法:(下面实际是一大段代码,没咋看懂...)
ax=plt.gca() ax=spines['right'].set_color('none') ax=spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0))
(4) 注释+箭头标明曲线上某一数据点:
plt.annotate(r'&Latex表达式&'或'字符串',xy=[注释数据点的x坐标,注释数据点的y坐标],xycoords='data',xytext=[30,30],fontsize=16,textcoords='offset points',arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.2"))
# 参数比较繁琐,最后的效果就是这个表达式或字符串伸个箭头指向要曲线上要注释的这个数据点的位置
(5) 为DataFrame绘制线形图:直接一个plot(),就按每个索引同时呈现多条曲线的,再来个legend()函数,则会以索引名为图例名添加相应个图例
8. 画直方图:hist()函数,比如:n,bins,patches=plt.hist(pop,bins=20)
# 其中pop是数据,pop=np.random.randint(0,100,100),bins参数指定了将样本个体分到多少个面元中,如果未指定,则默认为10个面元
# hist()函数除了以图表形式表示外,还能以元组形式返回,也就是上面的n,bins,patches,返回成(n,bins,patches)
9. 画条状图:
(1) 一般条状图:
(a) 垂直:bar()函数,如plt.bar(index,values),其中index和values是指定的两个列表,分别作为图表中的x轴和y轴的值,各x值显示在每个条形块的左下角
plt.xticks(index+0.4,['A','B','C','D','E']),让x值显示从左下角到居中,并将x显示值换成A到E,即标签
增加误差线元素:plt.bar(index,values,yerr=std1,error_kw={'ecolor':'0.1','capsize':6},alpha=0.7,label='First')
其中ecolor指定误差线的颜色,capsize指定误差线两头横线的宽度,alpha取值为0~1,0表示对象完全透明
(b) 水平:barh()函数,其用法和bar()类似,但需要注意的是,水平条状图中,类别分布在y轴,数值显示在x轴
(2) 多序列条状图:
(a) 需要多少个序列共用一个类别,则把每个类别占据的空间分为多少个部分即可
比如默认每个类别空间宽度为1:bw=0.3 plt.bar(index,values1,bw,color='b') plt.bar(index+bw,values2,bw,color='g') plt.bar(index+2*bw,values3,bw,color='r')就ok了
接着上述例子,同样可以plt.xticks(index+1.5*bw,['A','B','C','D','E']),index后面加上的增量要讲究以下
如果要生成水平方向的,用barh()即可,参数用法等一样哒
(b) 为DataFrame绘制多序列条状图:可以快速完成,实现自动化,df.plot(kind='bar')就ok了,其中df=pd.DataFrame(data),做好的图自动添加图例
同样,水平则kind='barh'即可,美滋滋!
(3) 多序列堆积条状图: # 比如想表示总和是由几个条状图相加得到的,就用它啦!
(a) s1,s2,s3是三个numpy序列,则plt.bar(index,s1,color='r') plt.bar(index,s2,color='b',bottom=s1) plt.bar(index,s3,color='g',bottom=(s2+s1)) 就OK了,关键就是在bottom参数
水平的殊途同归,bar()换成barh()就OK了 # 同时应当注意,水平的“x轴”相应变到了y上,所以原本的xticks()也要换成yticks()
(b) 为DataFrame绘制堆积条状图:df.plot(kind='bar',stacked=True)即可,df是DataFrame对象
(4) 其他条状图:
(a) 前面都是用颜色填充,实际上还可以用不同阴影填充,先把条状图颜色设置成白色,然后用hatch关键字参数指定影线的类型
不同影线用不同的字符(|、/、-、\、*)表示,且同一符号出现的次数越多,则形成的阴影的线条越密集,比如///就比//密集
(b) 两列有着共同类别的数据,其条状图分列于x轴两侧,分别向+y和-y生长,比如以下这段代码:
plt.ylim(-7,7)
plt.bar(x0,y1,0.9,facecolor='r',edgecolor='w')
plt.bar(x0,-y2,0.9,facecolor='b',edgecolor='w')
plt.xticks(())
plt.grid(True)
for x,y in zip(x0,y1):plt.text(x+0.4,y+0.05,'%d'%y,ha='center',va='bottom')
for x,y in zip(x0,y2):plt.text(x+0.4,-y-0.05,'%d'%y,ha='center',va='top')
# 其中 x0,y1,y2分别是np数组。这段code先记下,来日方长
10. 画饼图:
(1) labels=['A','B','C'] values=[1.2.3] colors=['yellow','green','red']
plt.pie(values,labels=labels,colors=colors)
plt.axis('equal') # 为了绘制标准的圆形图饼,还需要在代码最后调用axis()函数
同时还可以添加很多参数,explode表示某块是否突出,其取值为0~1,0表示没有抽取;startangle用来调整饼图的旋转角度,取值为0~360;
autopct在每一块的中间位置添加文本标签来显示百分比;shadow用来添加阴影效果,设置为True即可
这样一来:plt.pie(values,labels=labels,colors=colors,explode=explode,shadow=True,autopct='%1.1f%%',startangle=180),其中explode=[0.3,0,0]
(2) 为DataFrame绘制饼图:df['s1'].plot(kind='pie',figsize=(6,6)),其中为了绘制一个标准的圆形饼图就有必要添加figsize关键字,df['s1']则只讲DataFrame对象中的s1序列做成图
11. 画等值线图:
X,Y=np.meshgrid(x,y)
def f(x,y):return (1-y**5+x**5)*np.exp(-x**2-y**2)
C=plt.contour(X,Y,f(X,Y),8,colors='black') # 用contour()函数生成三维结构表面的等值线图
plt.contourf(X,Y,F(X,Y),8)
plt.clabel(C,inline=1,fontsize=10)
plt.colorbar() # 增加图例作为对图表中所有颜色的说明
12. 画极区图: # 可以将其视作兼有饼图和条状图特点的图表
theta=np.arange(0.,2*np.pi,2*np.pi/N) # 这里是平均分配的,实际上可以按照它们所占比例来分配角度,就和饼图一样,所以说它兼顾了饼图的特征
radii=np.array([4,7,5,3,1,5,6,7]) # 这里体现了极区图兼顾条状图的特点
plt.axes([0.025,0.025,0.95,0.95],polar=True)
colors=np.array(懒得敲代码了)
bars=plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors) # 使用bar函数,然后注意各个参数