在机器学习中,可视化是数据特征分析和结果展示的一个重要手段。它可以提供数据的分布特征、统计特征,回归、分类和聚类等的结果。
目标: 将数据以图标的方式展示,从而分析出数据有价值的规律
绘图工具:(此处主要学习Matplotlib部分)
- Matplotlib(功能多)
- Seaborn库(基于Matplotlib绘制更多图表;擅长统计图和pandas更好结合)
- Pyecharts库(擅长地理图表的绘制)
绘图的一般流程:
一、Matplotlib可视化
1、折线图(趋势)?plot
折线图是用直线段将各数据点连接起来而组成的图形,以折线的方式显示数据的变化趋势。
# 导入 Numpy 模块
# 导入 matplotlib.pyplot 库
import numpy as np
import matplotlib.pyplot as plt
# 准备数据
x=np.linspace(0,10,30) # 0-10之间30个元素的等差数列
noise=np.random.randn(30) # 30个标准正态分布的元素
y1=x**2+2*noise # 数据1
y2=x**1+2*noise # 数据2
y3=x**1.5+2*noise # 数据3
plt.rcParams['font.sans-serif']='SimHei' # 设置字体为SimHei以显示中文
plt.rc('font',size=15) # 设置图中字号大小
plt.figure(figsize=(6,4)) # 设置画布
# 绘制折线图,设置颜色和线型:b蓝色 g绿色 r红色 y黄色 w白色 c青色 m紫色
plt.plot(x,y1,color='r',linestyle='--')
plt.plot(x,y2,color='b',linestyle='-')
plt.plot(x,y3,color='g',linestyle='-.')
plt.title('折线图') # 添加标题 title
plt.legend(['曲线y1','曲线y2','曲线y3']) # 添加图例 legend
plt.xlabel('x') # 添加横轴标签 xlabel
plt.ylabel('y') # 添加纵轴标签 ylabel
plt.show() # 显示图片
点线图:
# 绘制点线图
plt.figure(figsize=(6,4)) # 设置画布大小
# 绘制点线图,设置颜色、线型、点的形状
plt.plot(x,y1,color='r',linestyle='--',marker='o')
plt.plot(x,y2,color='b',linestyle='-',marker='*')
plt.plot(x,y3,color='g',linestyle='-.',marker='^')
plt.title('点线图') # 添加标题
plt.legend(['曲线 y1','曲线 y2','曲线 y3']) # 添加图例 legend
plt.ylabel('x') # 添加横轴标签
plt.ylabel('y') # 添加纵轴标签
plt.show() # 显示图片
?
2、柱状图? bar
柱状图又称长条图、柱状统计图,是一种以长方形的长度为变量的统计图表。
# 绘制柱状图
plt.figure(figsize=(6,4)) # 设置画布
plt.bar(x,y1,width=0.2) # 绘制柱状图:x=x轴数据,height=条形高度 width=宽默认0.8
plt.title('柱状图') # 添加标题
plt.xlabel('x') # 添加横轴标签
plt.ylabel('y1') # 添加纵轴名称
plt.show() # 显示图片
绘制数据y1、y2、y3各自的和的柱状图????????
# 绘制y1、y2、y3各自的和的柱状图
plt.figure(figsize=(6,4)) # 设置画布大小
plt.bar([0,1,2],[np.sum(y1),np.sum(y2),np.sum(y3)],width=0.5) # 绘制柱状图
plt.title('柱状图') # 添加标题
labels=['y1的和','y2的和','y3的和']
plt.xlabel('数据系列y') # 添加横轴标签
plt.ylabel('数据系列y的和') # 添加纵轴标签
plt.xticks(range(3),labels) # 横轴刻度与标签对准
plt.show() # 显示图片
?
堆叠柱状图
(两个数据系列y1、y2的堆叠柱状图)
# 绘制y1、y2叠加的堆叠柱状图
plt.figure(figsize=(6,4)) # 设置画布
plt.bar(x,y1,width=0.2) # 绘制柱状图
plt.bar(x,y2,width=0.2,bottom=y1) # 绘制柱状图,堆叠到y1上方
plt.title('堆叠柱状图') # 添加标题
plt.xlabel('x') # 添加横轴标签
plt.ylabel('y') # 添加纵轴标签
plt.legend(['y1','y2']) # 设置图例
plt.show() # 显示图片
(三个数据系列y1、y2、y3的堆叠柱状图)
# 绘制y1、y2、y3的堆叠柱状图
plt.figure(figsize=(6,4)) # 设置画布大小
plt.bar(x,y1,width=0.2) # 绘制柱状图
plt.bar(x,y2,width=0.2,bottom=y1) # 绘制柱状图,堆叠在y1上方
plt.bar(x,y3,width=0.2,bottom=y1+y2,color='r') # 绘制柱状图,堆叠在y1+y2上方
plt.title('堆叠柱状图') # 添加标题
plt.xlabel('x') # 添加横轴标签
plt.ylabel('y') # 添加纵轴标签
plt.legend(['y1','y2','y3']) # 添加图例
plt.show() # 显示图形
?
水平柱状图
# 绘制水平柱状图
plt.figure(figsize=(6,4)) # 设置画布
plt.barh(x,width=y1,height=0.2) # 水平柱状图
plt.title('水平柱状图') # 添加标题
plt.xlabel('y') # 添加纵轴标签
plt.ylabel('x') # 添加横轴标签
plt.show() # 显示图形
?
水平堆叠柱状图
# 绘制水平柱状图
plt.figure(figsize=(6,4)) # 设置画布大小
plt.barh(x,width=y1,height=0.2) # 绘制水平柱状图
plt.barh(x,width=y2,height=0.2,left=y1) # 绘制水平柱状图,堆叠到y1右侧
plt.barh(x,width=y3,height=0.2,left=y1+y2,color='red') # 绘制水平柱状图,堆叠到y1+y2右侧
plt.title('水平柱状图') # 添加标题
plt.xlabel('y') # 添加纵轴标签
plt.ylabel('x') # 添加横轴标签
plt.legend(['y1','y2','y3']) # 设置图例
plt.show() # 显示图形
?
3、 直方图 hist
直方图,又称作质量分布图,它是由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据的类型,纵轴表示分布情况。
# 绘制直方图
import numpy as np
x_norml=np.random.randn(1000) # 生成有1000个标准正态分布元素的数组
plt.rcParams['axes.unicode_minus']=False # 设置坐标刻度能显示负号
plt.figure(figsize=(6,4)) # 设置画布大小
plt.hist(x_norml,bins=50) # 绘制直方图,分箱数为50
plt.title('直方图(频数)') # 添加标题
plt.show() # 显示图形
?
绘制多个数组的直方图
# 绘制多个数组的直方图
x_norm2=2+np.random.randn(1000) # 生成以2为中心,有1000个正态分布元素的数组
x_norm3=4+np.random.randn(1000) # 生成以4为中心,有1000个正态分布元素的数组
plt.figure(figsize=(6,4)) # 设置画布大小
plt.hist(x_norm1,bins=50,density=True,color='r') # 绘制x_norm1的直方图
plt.hist(x_norm2,bins=50,density=True,color='g') # 绘制x_norm2的直方图
plt.hist(x_norm3,bins=50,density=True,color='b') # 绘制x_norm3的直方图
plt.title('直方图(概率)') # 添加标题
plt.show() # 显示图形
?
4、饼图 pie
饼图可以显示一个数据序列中各项的大小与各项总和的比例。每个数据序列具有唯一的颜色或图形,并且与图例中的颜色是相对应的。
绘制y1、y2、y3各自的和的饼图
# 绘制饼图
plt.figure(figsize=(6,4)) # 设置画布大小
plt.pie([np.sum(y1),np.sum(y2),np.sum(y3),],
labels=labels,
autopct='%1.1f%%') # 绘制饼图
plt.title('饼图') # 添加标题
plt.show() # 显示图形
?
绘制分离饼图
# 绘制和的分离饼图,并添加阴影
plt.figure(figsize=(6,4)) # 设置画布大小
plt.pie([np.sum(y1),np.sum(y2),np.sum(y3),],explode=(0,0,0.1),labels=labels,
autopct='%1.1f%%',shadow=True) # 绘制饼图
plt.title('分离饼图') # 添加标题
plt.show() # 显示图形
?
5、散点图? scatter
在回归分析中,散点图是指数据点在直角坐标系平面上的分布图,通常用于比较跨类别的数据。散点图包含的数据点越多,比较的效果就会越好。
# 绘制散点图
plt.figure(figsize=(6,4)) # 设置画布大小
plt.scatter(x,y1,marker='o') # 绘制y1散点图
plt.scatter(x,y2,marker='*') # 绘制y2散点图
plt.scatter(x,y3,marker='^') # 绘制y3散点图
plt.title('散点图') # 添加标题
plt.legend(['数据y1','数据y2','数据y3']) # 添加图例
plt.xlabel('x') # 添加横轴标签
plt.ylabel('y') # 添加纵轴标签
?
6、箱形图? ?boxplot
箱形图一般找数据中的异常的值,箱形图又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。
# 绘制箱形图
plt.figure(figsize=(6,4)) # 设置画布大小
labels=['数据y1','数据y2','数据y3'] # 设置箱形图数据系列的标签
plt.boxplot([y1,y2,y3],notch=True,labels=labels,meanline=True)
plt.title('箱形图') # 添加标题
plt.xlabel('数据y') # 添加横轴标签
plt.ylabel('数据y的值') # 添加纵轴名称
plt.show() # 显示图形
子图
一个画布上画多个图表,也就是figure划分成多个Axes对象,每个有自己独立的坐标系,称之为子图。API函数如下:
1、subplot
import matplotlib.pyplot as plt
plt.subplot(2,2,1) # 2,2,1 选中两行两列中的第一个图表
plt.plot([90,92,93])
plt.subplot(2,2,2)
plt.plot([90,92,93])
plt.subplot(2,2,3)
plt.plot([90,92,93])
plt.subplot(224) # ===》省略写法 221 逗号可以省略
plt.plot([90,92,93])
plt.show()
import numpy as np
nums=np.arange(0,101) # 100数据
nums
plt.subplot(2,2,1)
plt.plot(nums,nums) # 正比例函数(y=x)
plt.subplot(2,2,2)
plt.plot(nums,-nums) # 反比例函数(y=-x)
plt.subplot(2,1,2) # 占了两列
plt.plot(nums,nums**2) # 幂函数 (y=x^2)
plt.show()
2、subplots
import numpy as np
nums=np.arange(0,101) # 100数据
fig,axeses=plt.subplots(2,2)
#axeses代表所有的子图对象(根据索引定位,索引从0开始计算)
# 四个子图
ax1=axeses[0,0]
ax2=axeses[0,1]
ax3=axeses[1,0]
ax4=axeses[1,1]
ax1.plot(nums,nums) # 正比例
ax2.plot(nums,-nums) # 反比例
ax3.plot(nums,nums**2) # 幂函数
ax4.plot(nums,np.log(nums)) # log函数:y=log(x)
plt.show()
3、add_subplot
# 定义画布分割区域 有了画布往里面添加
import matplotlib.pyplot as plt
fig2=plt.figure(figsize=(20,8))
rand_arr=np.random.randn(100) # 创建符合正态分布数据
rand_arr1=np.random.randn(50)
fig2.add_subplot(2,2,1) # 2行2列4幅子图的第1幅
plt.plot(rand_arr1)
fig2.add_subplot(2,2,2) # 2行2列4幅子图的第2幅
plt.plot(rand_arr)
fig2.add_subplot(2,2,3) # 2行2列4幅子图的第3幅
plt.plot(rand_arr)
fig2.add_subplot(2,2,4) # 2行2列4幅子图的第4幅
plt.plot(rand_arr1)
plt.show()
?
# 绘制子图
fig=plt.figure(figsize=(12,12)) # 设置画布大小
# 子图 1 (点线图)
ax1=fig.add_subplot(2,2,1) # 2行2列4幅子图的 第1幅图
plt.plot(x,y1,color='r',linestyle='--',marker='o') # 绘制数据y1的折线图
plt.plot(x,y2,color='b',linestyle='-',marker='*') # 绘制数据y2的折线图
plt.plot(x,y3,color='g',linestyle='-',marker='^') # 绘制数据y3的折线图
plt.title('点线图') # 添加标题
plt.legend(['曲线y1','曲线y2','曲线y3']) # 设置曲线的图例
plt.xlabel('x') # 添加横轴名称
plt.ylabel('y') # 添加纵轴名称
# 子图 2 (柱状图)
ax1=fig.add_subplot(2,2,2) # 2行2列4幅子图的 第2幅图
plt.bar([0,1,2],
[np.sum(y1),np.sum(y2),np.sum(y3)],
width=0.3) # 绘制y1、y2、y3各自和的柱状图
plt.title('柱状图') # 添加标题
labels=['y1的和','y2的和','y3的和'] # 设置柱状图的标签
plt.xlabel('数据系列y') # 添加横轴名称
plt.ylabel('数据系列y的和') # 添加纵轴名称
plt.xticks(range(3),labels) # 设置横轴刻度及对应的标签
# 子图 3 (饼图)
ax1=fig.add_subplot(2,2,3) # 2行2列4幅子图的 第3幅图
plt.pie([np.sum(y1),np.sum(y2),np.sum(y3),],
labels=labels,
autopct='%1.1f%%') # 绘制3个数据系列和的饼图
plt.title('饼图') # 添加标题
# 子图 4 (箱形图)
ax1=fig.add_subplot(2,2,4) # 2行2列4幅子图的 第4幅图
labels=['数据y1','数据y2','数据y3'] # 设置箱线图的标签
plt.boxplot([y1,y2,y3],
notch=True,
labels=labels,
meanline=True) # 绘制3个数据系列的箱线图
plt.title('箱线图') # 添加标题
plt.xlabel('数据系列y') # 添加横轴标签
plt.ylabel('数据系列y的值') # 添加纵轴标签
plt.show() # 显示图形
|