Matplotlib数据可视化基本操作
matplotlib是一个Python的2D绘图库,最流行的Python底层绘图库,主要做数据可视化。
matplotlib使用时需要先导入库,有两种导入方式
from matplotlib import pyplot as plt import matplotlib.pyplot as plt
绘制一个简单的方程y=2x+1
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1,1,50) y = 2 * x + 1 plt.plot(x,y) plt.show()
如果有多方函数可以定义多个figure,并指定figure的一些参数,也可以指定所画方程的一些参数
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3,3,50) y1 = 2 * x + 1 y2 = x ** 2 plt.figure(num=1) #序号为1的figure plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--') #指定y1方程的颜色,线的宽度为1.0,线的形状为虚线 plt.figure(num=2,figsize=(8,5)) #序号为2的figure,并指定的这个figure的长为8,高为5 plt.plot(x,y2) plt.show()
xlim,ylim可以自定义坐标轴的范围。xlabel,ylabel描述x轴、y轴。ticks用来设置坐标轴单位的小标。
import numpy as np x = np.linspace(-3,3,50) y1 = 2 * x + 1 y2 = x ** 2 plt.figure() plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--') plt.plot(x,y2) plt.xlim((-1,2)) #x坐标轴的范围 plt.ylim((-2,3)) #y坐标轴的范围 plt.xlabel('I am x') #描述x轴 plt.ylabel('I am y') #描述y轴
new_ticks=np.linspace(-1,2,5)
plt.xticks(new_ticks) #对x轴的小标进行修改
plt.yticks([-2,-1.8,-1,1.22,3],[r'$really\ bad$','$bad$','$normal$','$good$',r'$really\ good$'])
#对y轴的小标进行修改,里面为两个列表,第一个列表为y轴上的数据,第二个列表为y轴上的数据对应的小标
plt.show()
对坐标轴进行操作
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3,3,50) y1 = 2 * x + 1 y2 = x ** 2 plt.figure() plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--') plt.plot(x,y2) plt.xlim((-1,2)) #x坐标轴的范围 plt.ylim((-2,3)) #y坐标轴的范围 plt.xlabel('I am x') #描述x轴 plt.ylabel('I am y') #描述y轴 ax = plt.gca() ax.spines['right'].set_color('none') #去掉右边的坐标轴 ax.spines['top'].set_color('none') #去掉上边的坐标轴 ax.xaxis.set_ticks_position('bottom') #用下边的坐标轴表示x轴 ax.yaxis.set_ticks_position('left') #用左边的坐标轴表示y轴 ax.spines['bottom'].set_position(('data',0)) #设置下边的坐标轴(即x轴)的位置 ax.spines['left'].set_position(('data',0)) #设置左边的坐标轴(即y轴)的位置 plt.show()
legend图例。不指定参数采用默认打印图例用plt.legend(),如果指定参数,handles说明图例的线条,labels用来指定对应线条的名字,loc用来指定legend的位置
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3,3,50) y1 = 2 * x + 1 y2 = x ** 2 plt.figure() plt.xlim((-1,2)) #x坐标轴的范围 plt.ylim((-2,3)) #y坐标轴的范围 plt.xlabel('I am x') #描述x轴 plt.ylabel('I am y') #描述y轴 line1, = plt.plot(x,y2,label='up') line2, = plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='down') plt.legend(handles=[line1,line2],labels=['aaa','bbb'],loc='best') plt.show()
annotation标注
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3,3,50) y = 2 * x + 1 plt.figure(num=1,figsize=(8,5)) plt.plot(x,y) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') ax.spines['bottom'].set_position(('data',0)) ax.spines['left'].set_position(('data',0)) x0 = 1 y0 = 2 * x0 + 1 plt.scatter(x0,y0,s=50,color='b') #展示(x0,y0)这个点,大小为50,颜色为blue plt.plot([x0,x0],[y0,0],'k--',lw=2.5) #(x0,y0)和(x0,0)两个点之间生成一条颜色为黑色的虚线,线宽2.5 plt.annotate(r'$2x+1=%s$' % y0,xy=(x0,y0),xycoords='data',xytext=(+30,-30),textcoords='offset points', fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2')) #arrowprops表示箭头的类型
plt.text(-3,3,r'$This\ is\ some\ text.\mu\ \sigma_i\ \alpha_t$',fontdict={'size':16,'color':'red'})
plt.show()
实例:用matplotlib绘制sin(x)和cos(x)的函数图像,其中要包含图例,在x=1处进行标注。
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-np.pi,np.pi,256,endpoint=True) c = np.cos(x) s = np.sin(x) plt.figure() plt.plot(x,c,color='blue',linewidth=1.0,linestyle='--',label='cos',alpha=0.5) plt.plot(x,s,color='red',linewidth=1.0,label='sin',alpha=0.5) plt.title('cos & sin') ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') ax.spines['bottom'].set_position(('data',0)) ax.spines['left'].set_position(('data',0)) plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi], [r'$-\ pi$',r'$-\ pi/2$',r'$0$',r'$+\ pi/2$',r'$+\ pi$']) plt.yticks(np.linspace(-1,1,5,endpoint=True)) for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(16) label.set_bbox(dict(facecolor='white',edgecolor='none',alpha=0.2)) #facecolor为背景颜色,edgecolor为边缘颜色 plt.legend(loc='best') plt.grid() #设置网格线 plt.fill_between(x,np.abs(x)<0.5,c,c>0.5,color='green',alpha=0.25) t=1 plt.plot([t,t],[0,np.cos(t)],'y',linewidth=3,linestyle='--') plt.annotate('cos(1)',xy=(t,np.cos(1)),xycoords='data',xytext=(+10,+30),textcoords='offset points', arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2')) plt.show()
scatter散点图
import matplotlib.pyplot as plt import numpy as np n = 128 X = np.random.normal(0,1,n) Y = np.random.normal(0,1,n) T = np.arctan2(Y,X) #设置颜色 plt.scatter(X,Y,s=75,c=T,alpha=0.5) #其实s是size的缩写,c是color的缩写,alpha表示透明度 plt.xlim(-1.5,1.5) plt.ylim(-1.5,1.5) plt.xticks(()) #将x轴上的小标设置为空 plt.yticks(()) #将y轴上的小标设备为空 plt.title('scatter') plt.xlabel('x') plt.ylabel('y') plt.show()
bar柱状图
import matplotlib.pyplot as plt import numpy as np n = 12 X = np.arange(n) Y1 = (1-X/float(n))*np.random.uniform(0.5,1.0,n) Y2 = (1-X/float(n))*np.random.uniform(0.5,1.0,n) plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white') #+Y1表示向上 plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white') #-Y2表示向下 for x,y in zip(X,Y1): plt.text(x,y+0.05,'%.2f' %y,ha='center',va='bottom') #ha表示横向对齐,va表示纵向对齐 for x,y in zip(X,Y2): plt.text(x,-y-0.05,'%.2f' %y,ha='center',va='top') plt.xlim(-0.5,n) plt.xticks(()) plt.ylim(-1.25,1.25) plt.yticks(()) plt.show()
更详细的内容可以参照 https://mp.weixin.qq.com/s/e_JICIHfp5ZTdX9PTx6FQw