matplotlib的绘图功能据传是参照MATLAB而来,是Python最基础也是最强大的,可惜对于我这样不了解MATLAB也不懂程序开发的人来说理解起来颇为困难。
matplotlib绘图基础系列将试图梳理一下matplotlib的绘图细节。不一定准确,仅供参考。
1、Python的绘图体系
首先来看一张图,图片来源:lemonbit
可见,由matplotlib和JavaScript衍生出许多可用的优秀绘图包。pandas、seaborn、bokeh对日常工作图表党较为常用,当然还有最近发布的pycharts也是不错的绘图工具。
2、matplotlib的总体结构
理论上,matplotlib绘图是这样的结构,来源Chris_Chen:
上面图的意思是,在pyplot下,我们定义一个画布叫fig(fig=plt.figure())。fig下可以定义多个axes(plt.subplots()等方法),即一张画布上划分多个小图。然后对每个小图设置xy轴、标题、数据展示等等。理论上如此,但实际操作起来比较不便,总给人一种缺少一本手册的感觉。
3、直接使用plt绘图的参数
废话少说,直接上代码
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y = 2*np.cos(x)**4 + 5*np.sin(x)**3
#设置画布编号,大小,画布颜色
plt.figure(num=1, figsize=(8, 5),facecolor='#eeeeff')
#绘制数据(line1,和line2,是为了便于后面使用legend添加的,注意,必须添加逗号。
line1,=plt.plot(x, y,label='line1')
line2,=plt.plot(x,y*y,label='line2')
#定义xy轴标题,字体大小,旋转角度
plt.ylabel('This is Y',fontsize=14)
plt.xlabel('This is X',fontsize=14,rotation=0)
#定义图表所有轴的范围,顺序依次为xmin,xmax,ymin,ymax
plt.axis([-4,4,-6,6])
#定义标题
plt.title('This is big 标题',fontsize=25,color='#3546ff')
#在某个位置添加文本,是xy轴对应的位置
plt.text(0,8,'这是波谷哇')
#如果需要对典型值进行标记,如需标记x=[-3,-2,-1,0,1,2,3]对应的y值,则需要使用循环依次添加
x1=[-3,-2,-1,0,1,2,3]
y1=[2*np.cos(i)**4 + 5*np.sin(i)**3 for i in x1]
for a,b in zip(x1,y1):
plt.text(a,b+0.05,'%.1f' % b,ha='center',va='bottom',fontsize=10,color='g',bbox=dict(facecolor='g',alpha=0.2))
#添加网格线
plt.grid(True,alpha=0.1,color='#ff0000',linewidth=1)
#重新定义y轴的范围,这里会将plt.axis定义的y轴范围覆盖
plt.ylim(-10,30)
#添加带箭头的文本
plt.annotate(r'$2*np.cos(x)**4+5*np.sin(x)**3$',xy=(1.5,25),xycoords='data',xytext=(+0.2,0.1),arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))
#添加图例,如果这里不加labels,则默认为line1,定义的label,即labels可以更改默认图例
plt.legend(loc='best',handles=[line1,line2],labels=['label3','label2'])
#重设X轴标签,想放多少个就设置多少个
#plt.xticks([-4,-3,-2,-1,0,1,2,3,4],list('ABCDEFGHI'),size='medium',rotation=0)
plt.xticks([-4,-2,0,2,4],list('ABCDE'),size='medium',rotation=0)
#自动优化图表,没有也没关系
plt.tight_layout()
plt.show()
结果就是这样了,基本上可以满足大部分的图表自定义调整。