Data exploration---Matplotlib

信息可视化(也叫绘图)是数据分析中最重要的工作之一。它可能是探索过程的一部分,例如,帮助我们找出异常值、必要的数据转换、得出有关模型的idea等。另外,做一个可交互的数据可视化也许是工作的最终目标。Python有许多库进行静态或动态的数据可视化,这里重要关注于matplotlib(http://matplotlib.org/)和基于它的库。

(本文基于莫烦的教学视频结合其他前辈的笔记做出个人整理,只涉及部分做图;只说明方法,无其他数据来源,未涉及项目可视化)

作图基本步骤:

1、导入对应库:matplotlib 等
2、获取数据:可以自建可以导入
3、绘图:散点图(scatter)、条形图(bar)等
4、个性化参数设置:边框、线条颜色、透明度(alpha)、坐标轴等等

散点图

import matplotlib.pyplot as plt
import numpy as np

n=1024
X=np.random.normal(0,1,n)
Y=np.random.normal(0,1,n)

T=np.arctan2(Y,X)   # for color value
plt.scatter(X,Y,s=75,c=T,alpha=0.5) #绘制散点图。大小=75,颜色是T,cmap选择默认。

plt.xlim((-1.5,1.5))
plt.ylim((-1.5,1.5))  #设置x/y 的范围

#隐藏tick的值
plt.xticks(()) #隐藏所有的刻度
plt.yticks(()) 

plt.show()
image.png

条形图

# 绘制条形图
import matplotlib.pyplot as plt
import numpy as np

n=12
X=np.arange(n)
# X 的值是 0,1,2,3,4,5,6,7,8,9,10,11 一共12个数

Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n)  #np.random.uniform随机生成 范围内的实数
Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n) 
#numpy.random.uniform(low=0.5,high=1,size=12)
#uniform 均匀分布的随机数;normal 正态分布的随机数;这里是产生12个0.5~1的均匀分布的随机数

plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')  
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')  
#水平柱状图plt.barh,
#打印出两组数据(有间隔)是用+:plt.bar(X+0.05......
#facecolor柱状图里面填充颜色
#edgecolor是边框的颜色
#想把一组数据打到下边,Y2前面用负号

#给条形图增加数值说明:text
for x,y in zip(X,Y1):
    #ha:horizontal alignment
    #只有用zip才能每次输出x/y两个值
    
    plt.text(x+0.6,y+0.05,r'%.2f'%y,ha='center',va='bottom')  
    #横向对齐方式为居中;纵向对齐方式
             
for x,y in zip(X,Y2):    

    plt.text(x+0.6,-y-0.05,r'%.2f'%y,ha='center',va='top')
             
plt.xlim(-1.5,n)
plt.xticks(())
plt.ylim(-1.1,1.1)
plt.yticks(())

plt.show()
image.png

如果想设置边框的有无,可以通过以下代码:

 ax=plt.gca()  
#获得子图的对象
 ax.spines['right'].set_color('none')
 ax.spines['top'].set_color('none')
#分别设置右边和顶部的边框为0

3D图

# 3d 图,首先导入对应库
from  mpl_toolkits.mplot3d import Axes3D

定义一个figure:窗口。添加3d坐标轴

fig=plt.figure()
ax=Axes3D(fig)

接下来再给出X值和Y值,并将X值和Y值编织成栅格。每一个(X,Y)点对应的高度值,用下面这个函数进行计算:

X=np.arange(-4,4,0.25)
Y=np.arange(-4,4,0.25)
X,Y=np.meshgrid(X,Y)
R=np.sqrt(X**2+Y**2)
Z=np.sin(R)
image.png

下一步需要做出一个三维曲面,并将用colormap rainbow填充颜色,之后将三维图像投影到XY平面做一个等高线图。plot 3D 图像:

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))

其中,rstride 和 cstride分别代表row 和 column的跨度

之后,我们添加XY平面的等高线:

ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap=plt.get_cmap('rainbow'))

如果zdir选择了x,那么效果将会是对于XZ平面的投影。

因此,整个项目的代码为:

fig=plt.figure()
ax=Axes3D(fig)

X=np.arange(-4,4,0.25)
Y=np.arange(-4,4,0.25)
X,Y=np.meshgrid(X,Y)
R=np.sqrt(X**2+Y**2)
Z=np.sin(R)

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))
ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap=plt.get_cmap('rainbow'))
#offset 决定投影所在平面的位置

plt.show()
image.png

如何设置双坐标轴?

import  matplotlib.pyplot as plt
import numpy as np

x=np.arange(0,10,0.1)  
#创建随机数,以0起始,10为终,步长为0.1

y1=0.05*x**2
y2=-1*y1
#建立x,y关系

fig,ax1=plt.subplots()
ax2=ax1.twinx()
# 用镜面效果把y1的轴颠倒,作为y2的轴(-5.0)

ax1.plot(x,y1,'r-')
ax2.plot(x,y2,'b--')
#绘制Y1/Y2的图像,分别设置为 红色实线,蓝色虚线


ax1.set_xlabel('Xdata')
ax1.set_ylabel('Y1',color='r')
ax2.set_ylabel('Y2',color='b')
#设置x/y1/y2的标签和颜色


plt.show()
image.png

多合一:一个窗口绘制多图

import matplotlib.pyplot as plt
plt.figure()

plt.subplot(2,1,1)       # 两行一列,占用三个空间
plt.plot([0,1],[0,1])

plt.subplot(2,3,4)     #两行三列,在第4个位置
plt.plot([0,1],[0,2])

plt.subplot(2,3,5)
plt.plot([0,1],[0,3])

plt.subplot(2,3,6)
plt.plot([0,1],[0,4])


plt.show()
image.png

图片保存

fig.savefig('filename.png')

发现

以下两种方式,输出结果是等效的:
1.直接把图像绘制在创建的窗口中

x=np.arange(0,5,0.01)
y=x**2
fig,axes=plt.subplots()
axes.plot(x,y,'g-')

2.先创建窗口,再在里面绘制图像

x=np.arange(0,5,0.01)
y=x**2
fig=plt.figure()
axes=fig.add_axes([0.1,0.1,0.8,0.8])
#(底部边框距离,左边框距离,宽度,高度)
axes.plot(x,y,'g-')

[莫烦视频]https://www.bilibili.com/video/av16378354/?p=19

你可能感兴趣的:(Data exploration---Matplotlib)