目录
一、数据分析绘图库Matplotlib
1.绘图基础知识
2.常用图形
3. 绘图步骤
4.属性详解
5.多图绘制
1)绘图步骤
2)多图案例
3)案例一:散点图绘制
4)案例二:曲线图绘制
5)子图绘制
6.案例三(柱状图绘制)
二、K近邻算法分类可视化分析
1.K近邻算法原理
2.K近邻算法数据集
三、K近邻算法回归可视化分析
四.seaborn库
1.seaborn整体风格
2.seaborn设置子图风格
3.seaborn内容风格
一、数据分析绘图库Matplotlib
- matplotlib是python比较底层的可视化库,可定制性强、图表资源丰富、简单易用、达到出版质量级别。
- Seaborn是在matplotlib的基础上进行了更高级的API封装, 作图更加容易。
- 它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
- Matplotlib 是 Python 的绘图库。
- 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。
- 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。
1.绘图基础知识
- 图例Legend 代表图形里的内容
- 网格Grid,图形中的虚线,True显示网格
- 点 Markers:表示点的形状。

2.常用图形
- 基本的视觉元素有三种:点、线、柱状。分析下面需求绘制什么图形?
- 学生为某科课程花费的时间和考试成绩两者之间的关系,查看两者之间的相关性。

3. 绘图步骤

4.属性详解

maker标记样式

标记颜色color
例如:第一个图形绘制完整顺序
# 1). 导入绘图库
import matplotlib.pyplot as plt
import numpy as np
# 2). 创建画板figure
figure = plt.figure(figsize=(10, 10))
# 3). 创建子图subplot/Axes
ax = plt.subplot(1, 1, 1)
# 4). 准备数据
# 从0-50分割成100份
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 6). 绘制
ax.plot(x, y, color='orange', marker='*', linestyle='-.')
ax.set_title('y = sinx')
ax.set_xlabel('x')
ax.set_ylabel('y')
# 7). 显示图形或者保存图形到文件中
# plt.show()
plt.savefig('barbar.png')
运行结果:

第一个图形绘制快速版:
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
# 1). 准备数据信息
x = np.linspace(0, 20, 100)
y = np.sin(x)
# 设置seaborn的主题样式
sns.set(style='ticks')
# 2). 直接绘图
plt.plot(x, y)
# plt.scatter(x, y)
plt.title('y = sinx')
plt.xlabel('x')
plt.ylabel('y')
# 去掉上边框和右边框(在绘图之后进行设置)
sns.despine(top=True, right=True)
# 3). 绘制图形并显示或者存储在文件中
# plt.show()
plt.savefig('barbar.png')
运行结果:

5.多图绘制
1)绘图步骤

2)多图案例

3)案例一:散点图绘制
绘图需求: 基于某函数,并在其一定范围震动的离散图。一定范围内震动呢?y加个随机数

import numpy as np
import matplotlib.pyplot as plt
def trans(x):
"""
按照函数定义x,y之间的关系,y是含有50个元素的数组
:param x:
:return:
"""
#Numpy具有焊好的传播机制:数字间或者数组间计算,只需要关注逻辑
#随机范围-5~5之间
random_data = -5 + 10 * np.random.random(x.shape)
y = 1 / 100 * x ** 4 - 8 / 300 * x ** 3 - 3 + np.log(x) + random_data
return y
if __name__ == '__main__':
# x:-10到10之间,等分为50个数字,返回的x是一个长度为50的以为数组
x = np.linspace(-10,10,50)
#y :函数计算结果
y = trans(x)
print(x,y)
#绘图1:创建绘制图像的容器figure
fig = plt.figure()
#绘图2:创建一个绘图区域axes
ax = fig.add_subplot(111)
#绘图3:绘制散点图,填充x,y,散点样式和颜色
ax.scatter(x,y,marker='x',color='r')
#绘图4:显示散点图到页面或者存储到文件中
plt.show()
#fig.savefig('a.png)
数据运行结果:

散点图绘制结果:

4)案例二:曲线图绘制
import numpy as np
import matplotlib.pyplot as plt
def trans(x):
"""
按照函数定义x,y之间的关系,y是含有50个元素的数组
:param x:
:return:
"""
#Numpy具有焊好的传播机制:数字间或者数组间计算,只需要关注逻辑
#随机范围-5~5之间
random_data = -5 + 10 * np.random.random(x.shape)
y = 1 / 100 * x ** 4 - 8 / 300 * x ** 3 - 3 + np.log(x) + random_data
return y
if __name__ == '__main__':
# x:-10到10之间,等分为50个数字,返回的x是一个长度为50的以为数组
x = np.linspace(-10,10,50)
#y :函数计算结果
y = trans(x)
print(x,y)
#绘图1:创建绘制图像的容器figure
fig = plt.figure()
#绘图2:创建一个绘图区域axes
ax = fig.add_subplot(111)
#绘图3:绘制散点图,填充x,y,散点样式和颜色
ax.plot(x,y,ls = '-.',label = '$y = 1/100x^4 - 8 / 300x^3-3+ln(x$')
#绘图4:显示散点图到页面或者存储到文件中
plt.show()
#fig.savefig('a.png)
曲线图如下:

5)子图绘制
# 1). 导入绘图库
import matplotlib.pyplot as plt
import numpy as np
# 2). 创建画板figure
figure = plt.figure(figsize=(10, 10))
# 3). 创建子图subplot/Axes, 生成2行一列的子图,
# 第一行第一列绘制sinx的图形, 第二行第一列绘制cosx的图形
ax1 = plt.subplot(2, 1, 1)
ax2 = plt.subplot(2, 1, 2)
# 4). 准备数据
# 从0-50分割成100份
x = np.linspace(0, 50, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 6). 绘制
ax1.plot(x, y1, color='orange', linestyle='-.')
ax1.set_title('y = sinx')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax2.plot(x, y2, color='m', linestyle='-.')
ax2.set_title('y = cosx')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
# 7). 显示图形
plt.show()
绘制结果:

6.案例三(柱状图绘制)
条形图(bar chart),也称为柱状图,是一种以长方形的长度为变量的统计图表,长方形的长度与它所对应的变量数值呈一定比例。
假设某项针对男女大学生购买饮用水爱好的调查结果如下表:

需求1):画出男生和女生饮用水情况的柱状图
(1)竖向条形图绘制:
import matplotlib.pyplot as plt
# 1. 创建figure
fig = plt.figure()
# 2. 创建子图(1行2列)
ax1 = plt.subplot(1, 2, 1)
ax1.set_title('男生购买饮用水情况的调查结果')
ax2 = plt.subplot(1, 2, 2)
ax2.set_title('女生购买饮用水情况的调查结果')
# ***********中文乱码如何解决
plt.rcParams['font.sans-serif'] = ['SimHei']
# 3. 加载数据信息
waters = ['碳酸饮料', '绿茶', '矿泉水', '其它', '果汁']
boy_buy_num = [6, 7, 6, 2, 1]
girl_buy_num = [9, 4, 4, 6, 5]
# 4. 绘制条形图
bar_width = 0.4
ax1.bar(waters, boy_buy_num, bar_width, color='orange')
ax2.bar(waters, girl_buy_num, bar_width, color='g')
# 5. 保存图片到本地
# plt.show()
plt.savefig('bar.png')
绘图结果:

(2)横向条形图绘制:
import matplotlib.pyplot as plt
# 1. 创建figure
fig = plt.figure()
# 2. 创建子图(1行2列)
ax1 = plt.subplot(2, 1, 1)
ax1.set_title('男生购买饮用水情况的调查结果')
ax2 = plt.subplot(2, 1, 2)
ax2.set_title('女生购买饮用水情况的调查结果')
# ***********中文乱码如何解决
plt.rcParams['font.sans-serif'] = ['SimHei']
# 3. 加载数据信息
waters = ['碳酸饮料', '绿茶', '矿泉水', '其它', '果汁']
boy_buy_num = [6, 7, 6, 2, 1]
girl_buy_num = [9, 4, 4, 6, 5]
# 4. 绘制条形图
bar_width = 0.4
ax1.barh(waters, boy_buy_num, height=bar_width, color='orange')
ax2.barh(waters, girl_buy_num, height=bar_width, color='g')
# 5. 保存图片到本地
# plt.show()
plt.savefig('bar.png')

(3)并列条形图: 若要将男生与女生的调查情况画出两个条形图一块显示,则可以使用 bar两次,并调整 条形图位置坐标以及相应刻度,使得两组条形图能够并排显示。
import matplotlib.pyplot as plt
import numpy as np
# ***********中文乱码如何解决
plt.rcParams['font.sans-serif'] = ['SimHei']
# 加载数据信息
waters = ['碳酸饮料', '绿茶', '矿泉水', '其它', '果汁']
boy_buy_num = [6, 7, 6, 2, 1]
girl_buy_num = [9, 4, 4, 6, 5]
# 调整条形图的横坐标
bar_width = 0.4
boy_index = np.arange(len(waters)) # [0, 1, 2, 3, 4]
girl_index = boy_index + bar_width # numpy传播机制, [0.4, 1.4, 2.4, 3.4, 4.4]
# 绘制条形图
plt.bar(boy_index, boy_buy_num, bar_width, color='orange', label='男生')
plt.bar(girl_index, girl_buy_num, bar_width, color='g', label='女生')
# 修改无意义的横坐标为有意义的横坐标
plt.xticks(boy_index + bar_width / 2, waters)
plt.ylabel("购买量")
plt.title("购买饮水情况的调查表")
plt.legend()
# 保存图片到本地
# plt.show()
plt.savefig('bar.png')
绘制图形:

二、K近邻算法分类可视化分析
1.K近邻算法原理
- K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。
- 该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。
- K近邻算法,即近朱者赤,近墨者黑。新的数据点离谁(一个或多个近邻点)最近, 就和谁属于同一类。

2.K近邻算法数据集
在skilit-learn中内置了若干个玩具数据集(Toy Datasets), 还有一些API可以自己动手生成数据集, 如下面代码所示:
# 导入数据集生成器
from sklearn.datasets import make_blobs
# 导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
# 导入画图工具
import matplotlib.pyplot as plt
# 导入数据集拆分工具(训练集和测试集的分割)
from sklearn.model_selection import train_test_split
# 生成样本数为200, 分类数为2的数据集.
# random_state随机种子,保证每次随机生成的样本信息一致。
X, y = make_blobs(n_samples=200, centers=2, random_state=8)
# cmap: 色彩盘, edgecolors:轮廓颜色
plt.scatter(X[:, 0], X[:, 1], edgecolors='c')
plt.title('KNN')
plt.show()
生成结果:

我们已经生成一系列数据集当作机器学习的训练数据集,接下来就是根据KNN算法找一个模型, 然后根据模型对未知数据进行分类。
import matplotlib.pyplot as plt
# 导入数据集生成器
from sklearn.datasets import make_blobs
# 导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
# 生成样本数为200, 分类数为2的数据集.
# random_state随机种子,保证每次随机生成的样本信息一致。
X, y = make_blobs(n_samples=200, centers=2, random_state=8)
# 绘图观察到新数据点的分类
plt.scatter(X[:, 0], X[:, 1], edgecolors='c')
plt.scatter(6.75, 4.82, marker='*', c='red', s=200)
plt.title('Classifier: KNN')
plt.show()
# 通过机器学习训练的模型计算出新数据点的分类
clf = KNeighborsClassifier()
clf.fit(X, y)
print("新数据点的分类是: ", clf.predict([[6.75, 4.82]]))
分类结果如下:

代码合在一起如下:
from sklearn.datasets import make_blobs
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
# 生成数据集, eg: x=(花瓣长度, 花茎的长度), y=(第一种花: 鸢尾花1). 训练集
X, y = make_blobs(n_samples=200, n_features=2, centers=2, random_state=8)
# 如何去寻找一个模型,并最终根据模型预判新的测试数据所属的分类?
# 机器学习: 寻找一个函数/模型的过程. f(x)='xxxxxxx', f(image)='cat', f(alpha-go)=5x5, f('对话')=‘对话’
clf = KNeighborsClassifier()
clf.fit(X, y) # 拟合(找模型的过程)
test_data = [6, 3] # 测试集: 测试模型好坏/正确率的数据集
class_name = clf.predict([test_data])
print("新数据点的分类是: ", class_name)
# 给定一个新的特征信息, 分析属于哪一类?
test_data = [6, 3]
# 通过绘制散点图, 清楚的看到分为2类
plt.scatter(X[:, 0], X[:, 1], edgecolors='orange', color='white')
plt.scatter(test_data[0], test_data[1], marker='*', color='r')
plt.show()
生成结果:

其中:新数据点的分类是: [1]
三、K近邻算法回归可视化分析
K近邻算法也可以用于回归, 原理和分类相同。 计算每个数据点的预测值时,模型会选择离该数据点最近的若干个点,并将它们的y值取平均值,并作为新数据点的预测值。
# 导入回归分析的数据集生成器
from sklearn.datasets import make_regression
from sklearn.neighbors import KNeighborsRegressor
import numpy as np
import matplotlib.pyplot as plt
# 生成特征数量为1,噪音为50的数据集
"""
n_features :特征个数= n_informative() + n_redundant + n_repeated
n_informative:多信息特征的个数
n_redundant:冗余信息
"""
X, y = make_regression(n_features=1, n_informative=1,
noise=50, random_state=8)
# 预测
reg = KNeighborsRegressor()
reg.fit(X, y)
# reshape(-1, 1)生成n行1列的矩阵
z = np.linspace(-3, 3, 200).reshape(-1, 1)
predict_z = reg.predict(z)
# 用散点图可视化
plt.scatter(X, y, c='orange', edgecolors='k')
plt.plot(z, predict_z, c='k', linewidth=2)
plt.title('KNN Regressor')
plt.show()
回归结果如下:

再比如:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_regression
from sklearn.neighbors import KNeighborsRegressor
# 产生回归的数据集(训练集)
X, y = make_regression(n_samples=100, n_features=1, n_informative=1,
noise=50, random_state=8)
# 通过K近邻的回归器, 拟合/寻找模型
reg = KNeighborsRegressor()
reg.fit(X, y)
# 给定一些新的数据(测试集),预测y值
"""
一维数组: np.linspace [1, 2, 3, 4, 5]
n*1数组: rwshape(-1, 1)
reg.predict([[1], [2]]) # 预测市需要传递的信息
"""
test_x = np.linspace(-3, 3, 100).reshape(-1, 1)
test_y = reg.predict(test_x)
print("模型的准确度: ", reg.score(X, y))
# ***********中文乱码如何解决
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 绘制图形
plt.scatter(X, y, marker='*', color='orange', edgecolors='orange', label='训练集')
plt.plot(test_x, test_y, color='black', label='测试集')
plt.title('KNN Regressor')
plt.legend()
plt.show()
回归结果:

四.seaborn库
官方网址: https://seaborn.pydata.org/introduction.html
1.seaborn整体风格
Seaborn共提供5种主题风格,分别为darkgrid、whitegrid、dark、 white以及ticks。
利用set()和set_style()两个函数对整体风格进行控制。
import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 定义一个绘图函数
def sinplot(flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, 7):
plt.plot(x, np.sin(x + i*.5)*(7-i)*flip)
# 设置sns的风格
sns.set(style='ticks')
sinplot()
# True代表不显示(右和上边框不显示)
sns.despine(top=True, right=True)
plt.show()
绘制结果:

2.seaborn设置子图风格
通过关键字with,对不同子图设置风格
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
figure = plt.figure(figsize=(10, 10))
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
with sns.axes_style(style='dark'):
ax1 = plt.subplot(2, 1, 1)
ax1.plot(x, y1, color='orange', linestyle='-.')
ax1.set_title('y = sinx')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
with sns.axes_style(style='whitegrid'):
ax2 = plt.subplot(2, 1, 2)
ax2.plot(x, y2, color='m', linestyle='-.')
ax2.set_title('y = cosx')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
plt.show()
绘制结果:

或者:
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
# 对子图设置不同风格
with sns.axes_style('darkgrid'):
ax1 = plt.subplot(211)
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax1.plot(x, y)
ax1.set_title('y = sin x')
# 对子图设置不同风格
with sns.axes_style('dark'):
ax2 = plt.subplot(212)
x = np.linspace(0, 10, 100)
y = np.cos(x)
ax2.plot(x, y)
ax2.set_title('y = cos x')
plt.show()
绘制结果:

3.seaborn内容风格
对图中内容进行设置,包括线条颜色,粗细和刻度等
import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 定义一个绘图函数
def sinplot(flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, 7):
plt.plot(x, np.sin(x + i*.5)*(7-i)*flip)
#对图中内容进行设置,包括线条颜色,粗细和刻度等
sns.set_context("talk",font_scale=1.5,rc={'line.linewidth':3})
plt.figure(figsize=(10,6))
sinplot()
plt.show()
绘制结果:

|