可视化数据
简介:
数据可视化是机器学习的核心,利用它有助于制定正确的的策略来理解数据。数据的视觉表示帮助我们选择正确的算法。数据的可视化的主要目标之一就是用图和表清晰的表达数据,以便我们更准确、更有效的交流信息。
在现实世界中总会存在各种数值数据,我们想将这些数值数据编码成图、线、点、条等,以便直观的显示出这些数值中包含的信息,同时可以使复杂分布的数据更容易被理解和应用。这一过程被广泛应用于各种场合之中,包括对比分析,增长率跟踪、市场分析、民意调查。
我们用不同的图来展示各个变量之间的模式或关系,比如用直方图展示数据的分布。如果想查找一个特定的测量,可以用表格表示。我们将讨论各种场景下最合适的可视化方式。
画3D散点图
(1)生成一个Python文件,并导入以下程序包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
(2)生成一个空白图像
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d')
(3)定义应该生成的值的个数
n=250
(4)生成一个lambda函数来生成给定范围的值
f=lambda minval,maxval,n:minval +(maxval-minval)*np.random.rand(n)
(5)用这个函数生成X,Y和Z值:
x_vals=f(15,41,n)
y_vals=f(-10,70,n)
z_vals=f(-52,-37,n)
(6)画出这些值
ax.scatter(x_vals,y_vals,z_vals,c='k',marker='o')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
plt.show()
运行代码后,结果如图:
画气泡图
import numpy as np
import matplotlib.pyplot as plt
#定义要生成值的个数
num_vals=40
#生成随机的X值和Y值
#生成随机数
x=np.random.rand(num_vals)
y=np.random.rand(num_vals)
#定义每个点的面积
#指定最大半径
max_radius=25
area=np.pi*(max_radius*np.random.rand(num_vals))**2
#定义颜色
colors=np.random.rand(num_vals)
#画出这些值
#画出数据点
plt.scatter(x,y,s=area,c=colors,alpha=1.0)
plt.show()
画饼图
import numpy as np
import matplotlib.pyplot as plt
#按顺时针方向定义各标签和相应的值
data={
'Apple':26,
'Mango':17,
'Pineapple':21,
'Banana':29,
'Strawberry':11
}
#定义可视化颜色
colors=['orange','lightgreen','lightblue','gold','cyan']
#定义一个变量以突出饼图的一部分,将其与其他部分离开,如果不想突出任何部分,将所有值设为0
#定义是否需要突出一部分
#explode=(0,0,0,0,0)
explode=(0,0.2,0,0,0)
#画饼图
plt.pie(list(data.values()),explode=explode,labels=data.keys(),
colors=colors,autopct='%1.1f%%',
shadow=False,startangle=90)
#设置饼图的宽高比,“equal”表示我们希望它是圆形的
plt.axis('equal')
plt.show()
运行结果如图所示:
画直方图
import numpy as np
import matplotlib.pyplot as plt
#输入数据
#对比苹果和橘子的产量
apples=[30,25,22,36,21,29]
oranges=[24,33,19,27,35,20]
#设置数组
num_groups=len(apples)
#创建图像
flg,ax=plt.subplots()
#定义x轴
indices=np.arange(num_groups)
#直方图的宽度和透明度
bar_width=0.4
opacity=0.6
#画直方图
hist_apples=plt.bar(indices,apples,bar_width,
alpha=opacity,color='g',label='Apples')
hist_oranges = plt.bar(
indices+bar_width, oranges, bar_width, alpha=opacity, color='r', label='Oranges')
#设置直方图的参数
plt.xlabel('Month')
plt.ylabel('Production quantity')
plt.title('Comparing apples and Oranges')
plt.xticks(indices+bar_width,('Jan','Feb','Mar','Apr','May','Jun'))
plt.ylim([0,45])
plt.legend()
plt.tight_layout()
plt.show()
运行结果,如图所示:
6画可视化热力图
import numpy as np
import matplotlib.pyplot as plt
#定义两组数据
group1=['France','Italy','Spain','Portugal','Germany']
group2=['Japan','China','Brazil','Russia','Australia']
#生成一个随机二维矩阵
#生成一些随机数
data=np.random.rand(5,5)
#创建一个图像
fig,ax=plt.subplots()
#创建一个热力图
heatmap=ax.pcolor(data,cmap=plt.cm.gray)
#画出这些值
#将坐轴放在图块的中间
ax.set_xticks(np.arange(data.shape[0])+0.5,minor=False)
ax.set_yticks(np.arange(data.shape[1])+0.5,minor=False)
#让热力图显示成一张表
ax.invert_yaxis()
ax.xaxis.tick_top()
#增加坐标轴标签
ax.set_xticklabels(group2,minor=False)
ax.set_yticklabels(group1,minor=False)
plt.show()
运行结果,如图所示
动态信号的可视化模拟
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
#创建一个函数,用于生成阻尼正弦信号
#生成信号数据
def generate_data(length=2500,t=0,step_size=0.05):
for count in range(length):
t+=step_size
signal=np.sin(2*np.pi*t)
damper=np.exp(-t/8.0)
yield t,signal*damper
#定义初始化函数
def initializer():
peak_val=1.0
buffer_val=0.1
#设置这些参数
ax.set_ylim(-peak_val*(1+buffer_val),peak_val*(1+buffer_val))
ax.set_xlim(0,10)
del x_vals[:]
del y_vals[:]
line.set_data(x_vals,y_vals)
return line
#定义一个函数来画出这些值
def draw(data):
#升级数据
t,signal=data
x_vals.append(t)
y_vals.append(signal)
x_min,x_max=ax.get_xlim()
#如果这些值超出当前X轴最大值的访问,那么更新X轴最大值并扩展图像
if t>=x_max:
ax.set_xlim(x_min,2*x_max)
ax.figure.canvas.draw()
line.set_data(x_vals,y_vals)
return line
if __name__ == '__main__':
#创建图形
fig,ax=plt.subplots()
ax.grid()
#提取线
line, =ax.plot([],[],lw=1.5)
#创建变量
x_vals,y_vals=[],[]
#用动画器对象定义并启动动画:
animator=animation.FuncAnimation(fig,draw,generate_data(),
blit=False,interval=10,repeat=False,init_func=initializer)
plt.show()
运行结果: