信息可视化(也叫绘图)是数据分析中最重要的工作之一。它可能是探索过程的一部分,例如,帮助我们找出异常值、必要的数据转换、得出有关模型的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()
条形图
# 绘制条形图
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()
如果想设置边框的有无,可以通过以下代码:
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)
下一步需要做出一个三维曲面,并将用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()
如何设置双坐标轴?
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()
多合一:一个窗口绘制多图
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()
图片保存
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