1.matplotlib.pyplot简介
matplotlib.pyplot是一个有命令风格的函数集合,它看起来和MATLAB很相似。每一个pyplot函数都使一副图像做出些许改变,例如创建一幅图,在图中创建一个绘图区域,在绘图区域中添加一条线等等。在matplotlib.pyplot中,各种状态通过函数调用保存起来,以便于可以随时跟踪像当前图像和绘图区域这样的东西。绘图函数是直接作用于当前axes(matplotlib中的专有名词,图形中组成部分,不是数学中的坐标系。)
2.热力图
查看数据表中多个特征两两的相似度。
2.1 函数接口
import seaborn as sns
seaborn.heatmap(data, vmin=None, vmax=None,cmap=None, center=None, robust=False, annot=None, fmt=’.2g’, annot_kws=None,linewidths=0, linecolor=’white’, cbar=True, cbar_kws=None, cbar_ax=None,square=False, xticklabels=’auto’, yticklabels=’auto’, mask=None, ax=None,**kwargs)
2.1.1 输入数据
data: 矩阵数据集,可以是numpy的数组(array),也可以是pandas的DataFrame。如果是DataFrame,则df的index(行标)/column(列标)信息会分别对应到heatmap的columns和rows,即pt.index是热力图的行标,pt.columns是热力图的列标
2.1.2 热力图矩阵块颜色设置
vmin\vmax: 热力图的颜色取值最大和最小范围,默认是根据data数据表里的取值确定
cmap: 从数字到色彩空间的映射,取值是matplotlib包里的colormap名称或颜色对象,或者表示颜色的列表;改参数默认值:根据center参数设定
center: 数据表取值有差异时,设置热力图的色彩中心对齐值;通过设置center值,可以调整生成的图像颜色的整体深浅;设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变
robust: 默认取值False;如果是False,且没设定vmin和vmax的值,热力图的颜色映射范围根据具有鲁棒性的分位数设定,而不是用极值设定
2.1.3 矩阵块注释参数
annot: 矩阵块是(True)否(False)写入数据。如果是矩阵,在热力图每个方格写入该矩阵对应位置数据
fmt: 字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字
annot_kws: 默认取值False;如果是True,设置热力图矩阵上数字的大小颜色字体,matplotlib包text类下的字体设置
2.1.4 矩阵块间隔与间隔线
linewidths:定义热力图里“表示两两特征关系的矩阵小块”之间的间隔大小(块之间的间隔)
linecolor:切分热力图上每个矩阵小块的线的颜色,默认值是’white’(切分矩阵块的线的颜色)
2.1.5 侧边颜色刻度条设置
cbar: True.矩阵侧边绘制颜色刻度条
cbar_kws: 侧边颜色刻度条字号,字体,颜色等的设置
cbar_ax: 侧边颜色条位置设置
2.1.6 其他设置
square: 设置热力图矩阵小块形状,默认值是False
xticklabels, yticklabels: xticklabels控制每列标签名的输出;yticklabels控制每行标签名的输出。默认值是auto。如果是True,则以DataFrame的列名作为标签名。如果是False,则不添加行标签名。如果是列表,则标签名改为列表中给的内容。如果是整数K,则在图上每隔K个标签进行一次标注。 如果是auto,则自动选择标签的标注间距,将标签名不重叠的部分(或全部)输出
mask: 控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame,则将DataFrame里True的位置用白色覆盖掉
ax: 设置作图的坐标轴,一般画多个子图时需要修改不同的子图的该值
**kwargs:All other keyword arguments are passed to ax.pcolormesh
2.2 实战代码(特征筛选)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# ====热力图
data = pd.read_csv("data/all_data_standard.csv", encoding="utf-8")
data.drop_duplicates()
data.columns = [i for i in range(data.shape[1])]
# 计算两两属性之间的皮尔森相关系数
corrmat = data.corr()
f, ax = plt.subplots(figsize=(12, 9))
# 返回按“列”降序排列的前n行
k = 16
cols = corrmat.nlargest(k, data.columns[15]).index
# 返回皮尔逊积矩相关系数
cm = np.corrcoef(data[cols].values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt=".2f", annot_kws={"size": 10}, yticklabels=cols.values, xticklabels=cols.values)
plt.ylabel("features", fontsize=15)
plt.xlabel("features", fontsize=15)
plt.title("Thermal map", fontsize=15)
plt.show()
3.雷达图(聚类特征描述)
3.1 雷达图说明
1.雷达图作用是把信息在多个轴上进行评估,从而知道哪个轴数据表现优秀
2.还可用于对聚类后结果的特征描述。
3.2 函数接口
正常的plot图像不作过多解释,直接上代码
3.3 雷达图方法一
import pandas as pd
import numpy as np
import seaborn as sns
From sklearn.cluster import KMeans
# ==========绘制聚类结果雷达图
df_features = pd.read_csv("real_data.csv", encoding="utf-8")
# 构建聚类模型
estimater = KMeans(n_clusters=3)
estimater = estimater.fit(X=data)
# 统计样本属性个数
N = len(estimater.cluster_centers_[0])
# 将360度N等分,注意:要首位相接
angles = np.linspace(0, 2*np.pi, N, endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
# 画布上构建子图
fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, polar=True)
Sam = ["r", "g", "b"]
# 待显示的图例标签
lab = []
# 遍历所有聚类中心
for i in range(len(estimater.cluster_centers_)):
values = estimater.cluster_centers_[i]
features = data.columns
values = np.concatenate((values, [values[0]]))
ax.plot(angles, values, Sam[i], linewidth=2)
# 颜色填充
# ax.fill(angles, values, alpha=0.25)
# 摆放特征名称
ax.set_thetagrids(angles*180/np.pi, features)
# 显示轴网络
ax.grid(True)
lab.append("customer"+str(i))
plt.title("title")
# 显示图例
plt.legend(lab)
plt.show()
3.4 雷达图方法二
pygal
一个python svg图形绘图库。免费的第三方库,可自由进行修改,但没有任何保证。内部提供的是一些绘图的接口(条形图,堆积条形图,点状图,漏斗图,箱型图,仪表图,实心仪表,直方图,水平条形图,水平堆积条形图,线性图,水平线图,堆积线图,水平堆积线图,饼图,水平金字塔图,垂直金字塔图,雷达图,日期横坐标xy图,DateTime横坐标xy图,时间横坐标xy图,TimeDelta横坐标xy图,树状图,XY线图,),可直接进行绘图,相对于pyplot要简便一些。
import matplotlib.pyplot as plt
import pandas as pd
import pygal as pg
centers = [[55.46, 0.82, 30.06],
[10.33, 0.88, 30.18],
[10.71, 0.75, 29.84]]
df_features = pd.DataFrame(centers)
df_features.columns = ["a", "b", "c"]
df_features.index = ["aa", "bb", "cc"]
# 构建雷达图对象
radar_chart = pg.Radar()
# 设置雷达图标题
radar_chart._title = "Rader graph"
# 设置雷达图x轴标签
radar_chart.x_labels = df_features.index
# 在图中添加对象
radar_chart.add("customer1", centers[0])
radar_chart.add("customer2", centers[1])
radar_chart.add("customer3", centers[2])
# 将图写入文件(可浏览器打开)
radar_chart.render_to_file('bar_chart.svg')
4.箱线图
4.1 箱线图简介
箱线图是一种用作显示一组数据分散情况的统计图。常用于品质管理。主要用于反应原始数据的分布特征,还可进行多组数据分布特征的比较。从箱线图中可找出最大值、最小值、中位数、下四分位数(25%)、上四分位数(75%)、异常值。
注意:区间[Q1-1.5△Q, Q3+1.5△Q]之外的数据值被认为是异常值,应当被忽略。
4.2 第一种实现方式
通过matplotlib.pyplot实现
plt.boxplot(x, whis=None, labels=None)
参数:
x: 输入数据。数组(array)或容器的序列(a sequence of vectors)
whis: 浮点型,序列、字符串(默认为1.5)。调整的是判断异常值式(Q3-Q1)所占的权重
labels: 序列(sequence)。并且,长度必须与数据集的维度相同。
import matplotlib.pyplot as plt
import pandas as pd
array = dataFile.iloc[:, 10:15].values
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["font.sans-serif"] = "SimHei"
plt.boxplot(x=array, labels=["one", "two", "three", "four", "five"], whis=1.5)
plt.xlabel("Attribute")
plt.ylabel("Score")
plt.show()
4.3 第二种实现方式
pandas自带的画图工具(图片感觉不美观)
DataFrame.boxplot(grouped, subplots=True, column=None, fontsize=None, rot=0, grid=True, ax=None, figsize=None, layout=None, **kwds)
plt.show()
参数:
column: 待绘制箱线图的属性列。列名(字符串)、列表、容器。
fontsize: 图中文字大小。整形(int)或字符型(str)
rot: xlabels倾斜的角度。整形(int: 正负均可)、浮点型(float)、字符串(str)
grid: 是否显示图片中的网格。默认为True
figsize: 图片大小。元组 -> (长,宽)
import pandas as pd
import matplotlib.pyplot as plt
dataFile = pd.read_csv("dataTest.csv", header=None, prefix="V")
dataFile = dataFile.iloc[:, 10:15]
dataFile.boxplot(column="V10", fontsize="22", rot=45)
plt.show()
4.4 第三种方式实现
from pylab import *
boxplot(x, whis=None, labels=None)
参数:
x: 绘制箱线图的属性列数据。array
whis: 判断异常值时的权重 [Q1-whis * △Q, Q3+whis * △Q]
labels: xlabels的名称。列表,长度应当与绘图数据的属性个数相同
show()
from pylab import *
import matplotlib.pyplot as plt
import pandas as pd
dataFile = pd.read_csv("dataTest.csv", header=None, prefix="V")
dataFile = dataFile.iloc[:, 10:15]
boxplot(dataFile.values, whis=0.5, labels=["V10", "V11", "V12", "V13", "V14"])
show()
5. 平行坐标
平行坐标是一种比较常见的可视化方法,用于对高纬集合和多元数据的可视化。平行坐标为了表示在高纬空间中的一个点集,在N条平行的线的背景下(一般这N条线都竖直且等距),一个在高纬空间的点被表示为一条拐点在N条平行坐标轴的折线,在第K个坐标轴的位置就表示这个点在第K纬的值,平行坐标是信息可视化的一种重要技术。
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
df_features = pd.read_csv("dataTest.csv", encoding="utf-8", header=None, prefix="V")
summary = df_features.describe()
minRings = -1
maxRings = 99
nrows = 10
for i in range(nrows):
dataRow = df_features.iloc[i, 1:10]
labelColor = (df_features.iloc[i, 10] - minRings)/(maxRings - minRings)
# dataRow.plot(colors=plt.cm.RdY1Bu(labelColor), alpha=0.5)
dataRow.plot(alpha=0.5)
plt.xlabel("Attribute")
plt.ylabel("Score")
plt.show()
6.3D表面图
6.1 所需第三方库
from mpl_toolkits.mplot3d import Axes3D
mplot3d模块中的Axes3D绘图类
from matplotlib.ticker import LinearLocator, FormatStrFormatter
ticker模块主要提供“刻度的划分”和“刻度值的格式化”
matplotlib包中ticker模块中LinearLocator类(刻度划分)和FormatStrFormatter类(使用“%”来格式化轴刻度值)from matplotlib import cm
matplot内置的色彩映射模块
6.2 重点函数
①ax = Axes3D(fig):将matplotlib.figure.Figure对象转换成rect=[left, bottom, width, height]的3D对象
②np.meshgrid(*xi, indexing, sparse, copy, **kwargs):将坐标向量转换成坐标矩阵
【参数】
*xi:表示网格坐标的一维数组
indexing:设置输出索引的形式。(笛卡尔("xy")和矩阵("ij"))
sparse: 默认为False.若为True,则为节省内存返回稀疏网格
copy: 默认为True.若为False, 则为节省内存返回原始数组。(sparse=False, copy=False很有可能返回非连续数组)
【调整结果展示】①x1:向下拓展
②x2:向右拓展
③组合成(x1, x2)坐标,并将其定位;
④将(x1, x2)带入f中求解出对应的Z轴数值
③Axes3d.plot_surface(x, y, z, rcount, ccount, rstride, cstride, color, cmap, facecolors, norm, vmin, vmax, shade, *kwargs): 创建表面图
【参数】
x, y, z: 二维数组
rcount, ccount: 每个方向上的最大样本数。默认为50
rstride, cstride: 同rcount 和 ccount的作用都是为了精简坐标轴不同方向的样本数量,因此不能同时设置。默认为10.
color: 表面贴片的颜色surface patches
cmap: 表面贴片的颜色映射 Colormap
facecolors: 每个小块的颜色(list形式)
norm, vmin, vmax: 颜色映射标准化,标准化的下限和上限
shade: 是否给表面的颜色打上阴影
linewidth: 线条的宽度
antialiased: 是否平滑(True or False)
# ==========python绘制3D表面图(3维图)
# class Axes3D: 3D绘图类
# module ticker: 提供 ”刻度的定位“ 及 ”刻度的格式化“
# class LinearLocator: 刻度划分
# class FormatStrFormatter: 使用“%”来格式化轴刻度值
# module cm: 内置的色彩映射模块
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
from matplotlib import cm
fig = plt.figure(figsize=(10, 8))
# 将matplotlib.figure.Figure对象转换成rect=[left, bottom, width, height]的3D对象
ax = Axes3D(fig=fig)
X = np.arange(-5, 5, step=0.1)
Y = np.arange(-5, 5, step=0.1)
# np.meshgrid: 坐标向量转变为坐标矩阵
X, Y = np.meshgrid(X, Y, indexing="xy", sparse=True, )
R = np.sqrt(X**2 + Y**2)
Z = np.cos(R)
# ax.plot_surface: 创建表面图
# ax.set_zlim: 设置3D图中z轴的数值
# ax.zaxis: 初始化3D轴
# LinearLocator(numticks=10): 将z轴刻度划分为10部分
# FormatStrFormatter("%.2f"):z轴刻度值表里路两位小数
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap("rainbow"), linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)
ax.xaxis.set_major_locator(LinearLocator(numticks=10))
ax.xaxis.set_major_formatter(FormatStrFormatter("%.1f"))
ax.yaxis.set_major_locator(LinearLocator(numticks=10))
ax.yaxis.set_major_formatter(FormatStrFormatter("%.1f"))
ax.zaxis.set_major_locator(LinearLocator(numticks=10))
ax.zaxis.set_major_formatter(FormatStrFormatter("%.1f"))
# fig.colorbar: 创建颜色栏
# shrink: 颜色条长度的收缩比
# aspect: 颜色条宽度
fig.colorbar(surf, aspect=5, shrink=0.5)
plt.show()
7.绘制混淆矩阵
混淆矩阵是机器学习当中一中评价模型分类效果的方法,通过决策矩阵就可计算出单分类的准确率(accuracy)、查全率、查准率、召回率(recall_score)和F1-score等。
from sklearn.metrics import confusion_matrix # 生成混淆矩阵函数
import matplotlib.pyplot as plt # 绘图库
import numpy as np
import tensorflow as tf
def plot_confusion_matrix(cm, labels_name, title):
# 归一化
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
# 在特定的窗口上显示图像
plt.imshow(cm, interpolation='nearest')
plt.title(title)
# 标度条
plt.colorbar()
num_local = np.array(range(len(labels_name)))
# 设定x轴标签
# rotation:为标签的旋转角度
plt.xticks(num_local, labels_name, rotation=90)
plt.yticks(num_local, labels_name)
plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.show()
# 此处混淆矩阵为模型实际生成值,因此,此处只给出模型的计算结果
pred_y = session.run(tf.argmax(y_, 1), feed_dict={X: test_x})
cm = confusion_matrix(np.argmax(test_y, 1), pred_y,)
print(cm)
# [[100 1 0 1 6 0 0]
# [ 2 111 3 0 2 1 24]
# [ 0 2 68 5 4 3 2]
# [ 2 0 1 120 7 26 0]
# [ 2 5 3 2 120 11 14]
# [ 2 0 2 12 8 115 1]
# [ 2 25 0 1 14 4 302]]
# 调用绘制混淆矩阵的函数
plot_confusion_matrix(cm, labels_name, "HAR Confusion Matrix")
8.饼状图
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
labels = ["鸭子", "狗子", "牛子", "猪子"]
values = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)
plt.figure(figsize=(6, 3))
plt.pie(x=values, explode=explode, labels=labels, autopct="%1.1f")
# 获取或设置轴属性的便捷方法
# equal: 保持图形的形状,不会随着x或者y的拉伸而拉伸
plt.axis("equal")
plt.show()
9.3D散点图
from mpl_toolkits.mplot3d import Axes3D
mplot3d模块中的Axes3D绘图类
from matplotlib.ticker import LinearLocator, FormatStrFormatter
ticker模块主要提供“刻度的划分”和“刻度值的格式化”
matplotlib包中ticker模块中LinearLocator类(刻度划分)和FormatStrFormatter类(使用“%”来格式化轴刻度值)from matplotlib import cm
matplot内置的色彩映射模块
# ! /usr/bin/env python
# coding:utf-8
# python interpreter:3.6.2
# author: admin_maxin
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn import preprocessing
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
plt.rcParams["font.sans-serif"] = ["SimHei"] # 设置显示字体
plt.rcParams["axes.unicode_minus"] = False # 设置正常显示符号
data = pd.read_csv("data1.csv", encoding="utf-8", header=0, index_col=0)
X = data
# X = preprocessing.minmax_scale(X)
# X = pd.DataFrame(X)
# 构造聚类模型
estimator = KMeans(n_clusters=3)
estimator.fit(X)
label_pred = estimator.labels_
# 绘制k-means结果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
# x3 = X[label_pred == 3]
# 绘制三维散点图
fig = plt.figure()
# ax = fig.add_subplot(111, projection='3d')
ax = Axes3D(fig)
# x,y,s要求是list等的array_list类型的数据
ax.scatter(list(x0.iloc[:, 0]), list(x0.iloc[:, 1]), list(x0.iloc[:, 2]), c="red", marker='o', label='label0')
ax.scatter(list(x1.iloc[:, 0]), list(x1.iloc[:, 1]), list(x1.iloc[:, 2]), c="green", marker='*', label='label1')
ax.scatter(list(x2.iloc[:, 0]), list(x2.iloc[:, 1]), list(x2.iloc[:, 2]), c="blue", marker='+', label='label2')
# ax.scatter(list(x3.iloc[:, 0]), list(x3.iloc[:, 1]), list(x3.iloc[:, 2]), c="pink", marker='x', label='label3')
ax.set_xlabel('属性个数')
ax.set_ylabel('标签个数')
ax.set_zlabel('样本量')
data["label"] = "0"
for i in range(data.shape[0]):
data.iloc[i, 3] = list(estimator.labels_)[i]
data.to_csv("mydata.csv", sep=",", header=True, index=True, encoding="utf-8")
plt.legend()
plt.show()