数据可视化
Matplotlib
首先创建Figure对象,类似一张画布,该对象通过plt.figure()来实例化
#使用MATLAB风格 x=np.linspace(0,2*np.pi,100) y1=np.sin(x) y2=np.cos(x) plt.plot(x,y1) #少了一行plt.figure(),默认创建了一个画布 plt.plot(x,y2) plt.show() #显示出图片
#面向对象绘图 fig=plt.figure() #创建一个画布 ax=fig.add_axes([0.1,0.1,0.8,0.8]) #四个参数分别为left,bottom,width,height 值为0-1 #新增子区域,该区域可坐落在figure的任意区域,可设置任意大小,从figure 10%的位置开始绘制,宽高是figure的80% x=np.linspace(0,2*np.pi,100) ax.plot(x,np.sin(x)) fig.savefig('sin.png') #将图片保存在磁盘上 plt.show()
设置坐标系
用Axes容器描述坐标系,说Axes是容器,是因为它包含了坐标系中各个轴的刻度线、刻度值,以及坐标网格,坐标轴标题等,这些都是Axes容器里的对象。
坐标网格,坐标轴
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
x=np.arange(0.0,5.0,0.02)
y=np.exp(-x)*np.cos(2*np.pi*x)
plt.plot(x,y)
plt.grid(color='red',linestyle='-',linewidth=2) #设置网格线
plt.xlabel('横坐标名称') #设置X轴标题
plt.xticks(np.linspace(0,5,11))
plt.xlim((0,5)) #以元组为参数,设置横坐标的范围
"""
参数介绍
axis默认=‘both',可以设置为x或者y,就是网格线垂直于X轴或者垂直于Y轴
color
linestyle 设置网格线的线形
linewidth
"""
plt.show()
locator对象描述刻度的刻线,formatter对象描述刻度的标示
ax=plt.axes() ax.plot(np.random.randn(50)) ax.yaxis.set_major_locator(plt.NullLocator()) #取消y轴上的刻线,标示也就没有了 ax.xaxis.set_major_formatter(plt.NullFormatter()) #取消x轴刻度上的标示,刻度还在 plt.show()
from sklearn.datasets import fetch_olivetti_faces faces=fetch_olivetti_faces().images #在线获取数据集 print(faces) #plt.subplots()方法将画布figure分成若干区,且返回值一共两个,一个是figure对象,另外一个是Axes容器对象 fig,ax=plt.subplots(5,5,figsize=(5,5)) fig.subplots_adjust(hspace=0,wspace=0) #调整分区之间的相对位置 print(type(ax)) #可以根据索引来得到某个分区的Axes对象 for i in range(5): for j in range(5): ax[i,j].xaxis.set_major_locator(plt.NullLocator()) ax[i,j].yaxis.set_major_locator(plt.NullLocator()) #无刻线 ax[i,j].imshow(faces[10*i+j],cmap='bone') #参数cmap(colormap)表示颜色图谱
t=np.linspace(0,100,100) s=9.8*np.power(t,2)/2 fig,ax=plt.subplots(figsize=(8,4)) ax.plot(t,s) ax.set_ylabel('displacement') ax.set_xlim(0,100) ax.set_xlabel('time') xmajor_locator=MultipleLocator(20) #每20一个主刻线 xmajor_formatter=FormatStrFormatter('%1.1f') #刻度的标识为小数点后一位 xminor_locator=MultipleLocator(5) #次刻度 ymajor_locator=MultipleLocator(10000) ymajor_formatter=FormatStrFormatter("%1.1f") yminor_locator=MultipleLocator(5000) ax.xaxis.set_major_locator(xmajor_locator) ax.xaxis.set_major_formatter(xmajor_formatter) ax.yaxis.set_major_locator(ymajor_locator) ax.yaxis.set_major_formatter(ymajor_formatter) ax.xaxis.set_minor_locator(xminor_locator) #次刻度没有标识 ax.yaxis.set_minor_locator(yminor_locator) ax.grid(True,which='both') #是否使用网格线,which参数 both表示主刻线和次刻线 minor major #得到主刻线 for tick in ax.xaxis.get_major_ticks(): tick.label1.set_fontsize(16) #设置主刻度”标识“字号 plt.show()
分区
plt.plot(),画布上仅有一个坐标系
plt.subplots() 在画布上生成多个坐标系,每个坐标系都是一个Axes容器对象
plt.subplot()得到分区中的一个子图
""" sharex, sharey: 设置为 True 或者 ‘all’ 时,所有子图共享 x 轴或者 y 轴, 设置为 False or ‘none’ 时,所有子图的 x,y 轴均为独立, 设置为 ‘row’ 时,每一行的子图会共享 x 或者 y 轴, 设置为 ‘col’ 时,每一列的子图会共享 x 或者 y 轴。 """ fig,ax=plt.subplots(3,3,sharex='col',sharey='row') for i in range(3): for j in range(3): #通过索引得到Axes对象,向该容器内添加文本内容,前面两个参数为x,y,表示文本在坐标系的位置 #规定x=0,y=0位置为左下角,当x=1,y=1的位置为右上角 ax[i,j].text(0.5,0.5,str((i,j)),fontsize=18,ha='center') plt.show()
使用plt.subplot()
#MATLAB 风格 for i in range(1,7): plt.subplot(2,3,i) plt.text(0.5,0.5,str((2,3,i)),fontsize=18,ha='center') plt.show() #面向对象 fig=plt.figure() #设置分区之间的间隔,参数hspace和wspace的值表示间隔为分区长或宽的40% fig.subplots_adjust(hspace=0.4,wspace=0.4) for i in range(1,7): ax=fig.add_subplot(2,3,i) ax.text(0.5,0.5,str((2,3,i)),fontsize=18,ha='center') plt.show()
使用类似切片的方式灵活实现布局
#将画布划分成3*3 g=plt.GridSpec(3,3,hspace=0.3,wspace=0.3) plt.subplot(g[0,0]) plt.subplot(g[:2,1:]) plt.subplot(g[1:,0]) plt.subplot(g[2,1:])
曲线
plt.plot()中的参数
color
linestyle线型
linewidth线的粗细
marker用来标记坐标点
markersize以及markerfacecolor坐标点的大小和颜色
markerevery:通过列表来指定要标记的点
在数据分析中,先通过试验,测出相关量,然后根据所测的量在坐标系中描点,根据描点的结果推测那些点符合什么规律,并用函数表示这些规律,这个过程称为回归。
图例
实现对图例操作的函数:plt.legend()
参数:
loc:图例的位置
handles:显示图例的线对象
bbox_to_anchor(x0,y0,width,height):创建一个“盒子”,(x0,y0)是0-1的浮点数,是盒子左下角和原点的位置,width,height是盒子的宽度和高度,然后通过参数loc确定图例在盒子的相对位置
frameon:图例周围是否绘制框架,默认为True
ncol:图例分为几列展示,默认为1
fancybox:True启用圆边 framealphat透明度 shadow:True有阴影
a=np.arange(0,3,0.02) b=np.exp(a) c=b[::-1] plt.plot(a,b,'k--',label='first') #将线型和颜色缩成一个字符串,k是black plt.plot(a,c,'r:',label='second') plt.plot(a,b+c,'b-',label='third') plt.legend(loc='upper right')
如果只需要对第一根线和第二根线进行标识
a=np.arange(0,3,0.02) b=np.exp(a) c=b[::-1] #可以使用逗号和索引两种方式取得曲线的对象 line1,=plt.plot(a,b,'k--',label='first') line2=plt.plot(a,c,'r:',label='second')[0] #plt.plot()返回的是列表 line3=plt.plot(a,b+c,'b-',label='third')[0] plt.legend(handles=(line1,line2),loc='best')
散点图
如果不知道函数关系,只能绘制出一些分散的点,这种图被称为“散点图”
散点图不仅能够把数据直观地用图像进行表达,而且方便我们通过视觉观察数据分布。
plt.scatter()
rng=np.random.RandomState(0) #伪随机数发生器 x=rng.randn(100) #得到一维数组,该数据符合正态分布 y=rng.randn(100) colors=rng.rand(100) #得到100个0-1的随机数 sizes=1000*rng.rand(100) plt.scatter(x,y,c=colors,alpha=0.3,s=sizes) plt.colorbar()#色彩条
plt.scatter()与plt.plot()对比
对于大型数据,plt.plot()要比plt.scatter()快很多,原因是plt.scatter()要对每一个散点进行大小和颜色的定义,而plt.plot()所有点的颜色,大小只需配置一次
常用统计图
1.柱形图
plt.bar()
参数:
x:竖直中线的位置
height:柱子的高度
width:柱子的宽度,默认0.8
bottom:柱子与X轴的距离,默认为None,即0
tick_label:X轴刻度的标示,替代默认的数字
装饰柱子的参数 边线颜色,线型,宽度,填充内部的图形等等
堆积柱形图
position=np.arange(1,6) a=np.random.random(5) b=np.random.random(5) labels=['beijing','shanghai','zhejiang','tianjin','wuhan'] plt.bar(position,a,label='a',tick_label=labels,color='r') plt.bar(position,b,bottom=a,label='b',color='g')
簇状柱形图
簇状就是几个“柱子”一组
total_width=0.8 n=2 #一簇两个柱子 width=total_width/n plt.bar(position,a,width=width,label='a',color='r') plt.bar(position+width,b,width=width,label='b',color='b')
条形图
plt.barh() 将bar(柱状图)变为horizontal(水平)
将“柱子”横过来变成“条" 根据柱状图的思路就可以绘制“堆积”、“簇状”
正负条形图
用于比较某些对象
position=np.arange(1,6) a=np.random.random(5) b=np.random.random(5) plt.barh(position,a,color='b',label='a') plt.barh(position,-b,color='y',label='b') plt.legend(loc=0) plt.show()
箱线图
能显示出一组数据的最大值、最小值、中位数以及上下四分位数
使用plt.boxplot()绘制
饼图
显示一个数据系列中各项的大小与各项总和的比例
使用pie()方法绘制
x=[2,4,6,8] labels=['A','B','C','D'] plt.pie(x,labels=labels,autopct='%1.1f%%',startangle=90,explode=[0.1,0.1,0.1,0.1]) plt.show()
参数:
autopct:显示百分比
startangle:第一个扇形开始角度,默认逆时针旋转
explode:指定扇面的偏离
直方图
注意直方图与柱形图区别:
柱形图每个柱子单独渲染,这个与scatter()与plot()的关系
以频数为高就是频数直方图plt.hist(),以频率为高就是频率直方图
绘制三维图像
三维坐标系中画散点图和曲线图
from mpl_toolkits import mplot3d #绘制三维图像
fig=plt.figure() ax=plt.axes(projection='3d') x_line=np.linspace(0,15,1000) y_line=np.sin(x_line) z_line=np.cos(x_line) ax.plot3D(x_line,y_line,z_line,c='blue') x_point=15*np.random.random(100) y_point=np.sin(x_point)+0.1*np.random.randn(100) z_point=np.cos(x_point)+0.1*np.random.randn(100) ax.scatter3D(x_point,y_point,z_point) plt.show()

绘制三维等高线
x=np.linspace(-6,6,30) y=np.linspace(-6,6,30) X,Y=np.meshgrid(x,y) #X,Y是30*30的矩阵 Z=np.sin(np.sqrt(X**2+Y**2)) fig=plt.figure() ax=plt.axes(projection='3d') ax.contour3D(X,Y,Z,50,cmap='Blues') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('z') ax.view_init(60,35) #实现坐标系方位的旋转 plt.show()


浙公网安备 33010602011771号