数据可视化

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()

 

posted @ 2021-05-28 21:07  我的愿望是如你所愿  阅读(179)  评论(0)    收藏  举报