python3__常用数据分析图形(热力图,雷达图,箱线图,平行坐标,3D表面图)

版权声明:本文为博主原创文章,未经博主允许不得转载,希望能在相互交流中共同成长。【大红色:一级标题 绿色:二级标题 二红色:三级标题 黄色:四级标题】 https://blog.csdn.net/admin_maxin/article/details/84942163

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 雷达图说明

在数据挖掘项目中多用于企业分析或价值分析的环节可视化(系统分析的有效方法)。同时,还可用于对聚类后结果的特征描述。

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.D表面图

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()

猜你喜欢

转载自blog.csdn.net/admin_maxin/article/details/84942163
今日推荐