Pandas数据可视化
文章目录
-
概述
- Matplotlib 数据可视化
- Matplotlib 的两套主要的绘图接口解析
- 展示单变量数据分布情况的方法——绘制直方图
- 分析两个变量之间关系的方式——绘制散点图
- Matplotlib 的两套主要的绘图接口解析
- Matplotlib 数据可视化
-
2 Pandas 的数据可视化
- 2.1 单一变量的数据可视化
-
2.1.1 类别型单一变量的可视化
-
2.1.2 继续型单一变量的直方图绘制
-
2.2 双变量可视化
-
- 2.2.1 散点图 scatter * 2.2.2蜂巢图 hexbin * 2.2.3堆叠图 stacked=True
-
- 2.1 单一变量的数据可视化
-
3 seaborn绘图
* 3.1 单变量可视化分析
* 3.1.1 分布直方图 histplot
* 3.1.2 核密度估计曲线(KDE曲线)kdeplot
* 3.1.3 分类数据分布条形可视化 countplot -
3.2 双变量分析
-
- 3.2.1 散点图(Scatter plot)
-
- 3.2.2 回归散点图(Reg plot)
-
- 3.2.3 蜂巢状分布(Joint plot)
-
- 3.2.4 二维核密度估计(2d KDE plot)
-
- 3.2.4 柱状分布(Bar plot)
-
- 3.2.5 箱线分布/提琴分布(Box/Violin plot)
-
-
3.2.6 成对关系分析(Pairwise relationship analysis)
-
3.3 多变量间的区分
-
- 通过颜色区分
- 通过大小和形状区分
-
3.4 主题和样式
-
4 今日小结
-
- 4.1 数据可视化
- 4.2 seaborn小结
-
-
0 简单介绍
数据可视化是指直观呈现数据,并作为数据分析流程的重要环节之一;常见的工具包及其特性包括功能强大、易用性强且拥有丰富的绘图能力等特性
-
Matplotlib(卓越的功能与较为复杂的代码设计)
-
该工具在多种任务处理上表现优异,并可将生成的可视化文件导出为PDF、SVG、JPG、PNG、BMP和GIF等多种常见格式。
-
可用于生成常见图表类型包括折线图、散点图、直方图、条形图、误差条状图、饼图以及箱线盒状图等多种图表形式,并支持生成三维图表。
-
Pandas(lightweight且便捷的库)
-
基于 matplotlib 的强大数据可视化工具包(是matplotlib的一个高级封装模块)
-
Series和DataFrames都提供了内置的 plot() 方法用于绘图(能够帮助用户轻松完成数据可视化任务)
-
Seaborn(代码基础且功能丰富)
-
基于 matplotlib ,采用了更为复杂的封装方案,并且绘图更加简便
-
echarts and pyecharts ( dedicated to visualizations )
-
Originally designed for seamless operation across both desktop and mobile platforms, echarts leverages the versatile vector graphics library ZRender to deliver robust, interactive, and highly customizable visualization charts that cater to diverse analytical needs.
-
As a Python-based tool, pyecharts provides convenient functionality for generating echats charts.
1 Matplotlib数据可视化
1.1 Matplotlib 两套基本绘图API介绍
matplotlib支持多种绘图方式:基于状态的接口(通过调用相关函数实现绘图功能)以及面向对象的方法(创建坐标系并利用坐标系属性进行操作)。
import matplotlib.pyplot as plt
x = [-3,5,7]
y = [10,2,5]
- 状态接口 plt 画图
plt.figure(figsize=(15,3)) #创建一个画布
plt.plot(x,y)
plt.xlim(0,10) # 设置坐标轴显示的范围
plt.ylim(-3,8)
plt.xlabel('X Axis') # x轴 名字
plt.ylabel('Y Axis',size=20) # Y轴 名字
plt.title('Line Plot',size=30) # 整个图表的名字
plt.grid(True) # 网格线
plt.show()
- 面向对象 plt 画图创建坐标系, 调用坐标系的设置属性的方法, 来绘图
plt.show()
#%%
fig,ax = plt.subplots(figsize=(15,3)) # fig画布 ax 坐标系
ax.plot(x,y) # 调用坐标系的方法
ax.set_xlim(0,10)
ax.set_ylim(-3,8)
ax.set_xlabel('x axis')
ax.set_ylabel('y axis',size = 20)
ax.set_title('Line Plot', size = 30)
plt.show()
- 设置子图区域
fig = plt.figure(figsize=(20,8))
# 绘图区域可以分成几行 几列 当前图绘制在第几个位置上 位置从1开始计数的
# fig.add_subplot(1,1,1)
fig.add_subplot(3,3,1)
fig.add_subplot(3,3,5)
fig.add_subplot(3,3,9)
1.2 单变量可视化 绘制直方图
fig = plt.figure(figsize=(16,8))
# hist 直方图
axis1 = fig.add_subplot(1,1,1)
axis1.hist(tips['total_bill'],bins=10)
axis1.set_title('Histogram of Total Bill')
axis1.set_xlabel('Total Bill')
axis1.set_ylabel('Frequency')
plt.show()
我们将对数据进行分箱处理,并将可视化结果展示出来。
我们关注的是总账单金额这一变量。
其范围从最低到最高分别为3{\.}07和5{\.}8{\.}
分箱数量设置为十。
将区间[ \texttt{3}{\.}(\texttt{>}?)?\texttt{~}~\texttt{5}{\.}(\texttt{>}?)?\texttt{]}划分为十个等宽区间。
具体区间如下:
[
[ \texttt{3}{\.}(\texttt{>}?)?\texttt{~}~\texttt{7}{\.}\texttt{(}\mathrm{\texttt{-}}\mathrm{\texttt{o}}\mathrm{\texttt{-}}\mathrm{\texttt{l}}\mathrm{\texttt{i}}\mathrm{\texttt{n}}\mathrm{\texttt{-}}\mathrm{\texttt{k}}\mathrm{\texttt{o}}\mathrm{\texttt{n}})???\;,\;
[ \dots , \dots )???;,;
$\dots???
]
- 直方图中每个柱子的宽度表示当前区间的起点与终点。
- 柱子的高度则反映了该区间内共有多少条数据。
1.3 双变量可视化 绘制散点图
绘制散点图, 可以观察两个变量是否具有相关性
- 相关性强 变量A 增加的时候, 变量B 也跟着一起增加/减少
散点图的API
fig = plt.figure(figsize=(12,8))
axis1 = fig.add_subplot(1,1,1)
# 绘制散点图 点一个参数散点的x坐标, 第二个参数就是点的y坐标
axis1.scatter(tips['total_bill'],tips['tip'])
散点图可以添加其它变量来表示更复杂的数据关系
def encode_sex(sex):
if sex == 'Female':
return 0
else:
return 1
tips['sex_color'] = tips['sex'].apply(encode_sex)
fig = plt.figure(figsize=(20,8))
axes1 = fig.add_subplot(1,1,1)
axes1.scatter(x = tips['total_bill'],y=tips['tip'],s = tips['size']*20, c= tips['sex_color'],alpha=0.5)
s 表示点的大小
c 控制点的颜色
hist/bar/scatter/plot/pie
2 Pandas 数据可视化
2.1 单变量数据可视化
2.1.1 类别型单变量可视化**
- 柱状图/条形图 bar
reviews['province'].value_counts().head(10).plot.bar()
#reviews['province'].value_counts().head(10).plot(kind='bar')
- 圆形统计图 * 当类别数量较小时(例如5至6个类别),同样可以用圆形统计图来表示。这种图表通常情况下适用于显示各部分占整体的比例。
- 局限性在于它主要适用于显示较少(两个至三个)类别的占比情况;而当遇到较多的分类时,则更适合使用柱状图。
reviews['province'].value_counts().head(10).plot.pie()
2.1.2 连续型变量单变量可视化 直方图
-
折线图 lines
如果要绘制的数据不是类别之间,则多个时间段更适合使用折线图。 -
柱状图与折现图的区别
- 柱状图表型直观且简洁地呈现数据特征
- 通过对比各柱的高度即可明确数值大小,并便于观察不同类别之间的差异程度
- 折现图表型不仅能够展示多组数据的变化趋势
reviews['points'].value_counts().sort_index().plot(kind='line')
- 直方图 histogram * 该方法更适合。
当数据在一个维度上呈现非均匀分布时被称为数据倾斜;使用直方图最适合于显示无倾斜的数据分布情况。
绘制直方图时需注意去除异常值(特别大或特别小)。
bin数目过多会导致每个bin内的样本数量减少。
建议避免设置过多的bin数目。
reviews[reviews['price']<150]['price'].plot.hist(bins=10)
2.2 双变量可视化
2.2.1 散点图 scatter
reviews[reviews['price']<100].sample(1000).plot.scatter(x = 'price',y = 'points')
使用x数据中的列来作为x轴坐标的变量数据,并使用y数据中的列用于绘制y轴坐标的变量数据来生成一个散点图。
- 散点图的最佳选择是用于小规模的数据集以及高度区分的变量;如果数据集中存在过多重复值,则会导致散点重合
- 处理数据过载的技术包括通过抽样减少数据量或采用蜂巢状图表
蜂巢图和散点图可以应用区间变量或有序分类变量的组合
2.2.2蜂巢图 hexbin
reviews[reviews['price']<100].plot.hexbin(x='price',y='points',gridsize=15,figsize=(14,8))
# 如果坐标缺失的话可以使用
fig,axes = plt.subplots(ncols=1,figsize=(16,8))
plt.rcParams['font.sans-serif']=['SimHei']
# ax = axes 说明图要绘制到上面创建的坐标系中
reviews[reviews['price']<100].sample(100).plot.hexbin(x = 'price',y = 'points',gridsize=15,ax = axes)
# 为坐标轴设置数值 如果坐标轴有缺失的话可以自己设置
axes.set_xticks([0,20,40,60,80,100])
Hexbin是一种用于显示数据分布的数据可视化方法,在其图表中x轴和y轴的作用与Scatter图表相似。
gridsize参数决定了每个蜂窝单元格(即六边形)的具体尺寸大小。
此外,在蜂巢图表中:
- 数据点被聚合成一个个六边形;
- 每个六边形内部的颜色深浅程度反映了该区域内聚集的数据点数量;
- 颜色越浓密的地方表示该区域内的数据点数量越多。
在Hexbin图表中:
- x轴和y轴的作用与Scatter图表一致;
- gridsize参数控制着每个六边形(即蜂窝单元格)的具体尺寸;
- 整个图表通过将大量散点聚合成多个小区域来进行数据呈现;
- 通过不同颜色深浅的变化来直观展示各区域的数据密度分布情况;
- 这种方法特别适用于需要同时观察多变量间关系及趋势的情况。
2.2.3堆叠图 stacked=True
堆叠图是将一个变量绘制在另一个变量顶部的图表
- 柱状图的分组形式
- 累积面积分布形式
- 当数据类别较多时不适合使用堆积图,并且该图表在直观解读能力上存在一定的局限性
wine_counts.plot.bar(stacked = True,figsize=(16,8))
绘制柱状图的时候, 设置stack参数为True时, 使多值并排显示
绘制柱状图是, 在制作柱状图时, 单行数据通常会横向排列展示
3 seaborn 绘图
Seaborn建立在Matplotlib的基础上,并且相较于 Matplotlib 和 pandas 而言,在视觉效果上更为出色;同时,在其API接口的使用效率上也更为卓越。
- api 优化了流程, 通过整合数据处理工作与绘图功能, 实现了更高的效率
- 常用的套路 sns.XXXplot(data = 使用的数据框, x = x轴对应的列名, y = 可选的y轴列名, hue = 可选的分类列名, 输入后该分类列包含多个类别值, 传入后会根据这些类别分别绘制对应的子图表)
3.1 单变量可视化
3.1.1 直方图 histplot
import seaborn as sns
tips = pd.read_csv('data/tips.csv')
fig,ax = plt.subplots(figsize=(12,6))
sns.histplot(x='total_bill',data=tips,hue='sex')
ax.set_title('总账单直方图')
plt.show()
3.1.2 kde图(密度图) kdeplot
除了直方图之外,在展示单变量数据分布时还有一种称为密度图的方法;它通过围绕每个数据点呈现实数分布并消除重叠区域的方式构造出一个平滑曲线,并确保曲线下面积为1
fig,ax = plt.subplots(figsize=(12,6))
sns.kdeplot(x='total_bill',hue='time', data=tips)
ax.set_title('总账单直方图')
plt.show()
3.1.3 计数图(条形图) countplot
直方图通过对数据分组来描述分布,计数图是对离散变量(分类变量)计数
fig,ax = plt.subplots(figsize=(12,6))
# 对每个类别分别计数(统计每个类别有多少条数据, 把统计的结果再绘图)
sns.countplot(x='day', data=tips)
ax.set_title('计数柱状图')
plt.show()
如果用Pandas实现上面的效果, 需要先统计, 再绘图
> tips['sex'].value_counts().plot.bar()
>
>
>
>
> ```
>
>
### 3.2 双变量可视化
#### 3.2.1 散点图 scatterplot
fig, ax = plt.subplots(figsize=(12, 6))
分别计算每个类别的数据数量,并将结果用于绘制图形
sns.scatterplot(x='total_bill', y='tip', hue='sex', data=tips)
ax.set_title('Total Bill and Tip Relationship')
plt.show()
#### 3.2.2 回归散点图 regplot
散点图基础上加一条拟合的回归直线,**没有hue参数**
fig,ax = plt.subplots(figsize=(12,6))
按类别逐一计算数量(计算每个类别的数据条数并将其展示出来)
sns.regplot(x='total_bill',y='tip', data=tips)
ax.set_title('总账金额与小费之间的关系')
plt.show()
>
>
> **lmplot 和 regplot作用类似, 只不过 lmplot直接在画布上绘图, regplot绘制在坐标系里**
>
>
lmplot
分别统计各类别中的数据数量,并将结果进行可视化展示。
fit_reg设置是否显示回归线
sns.lmplot(x='total_bill', y='tip', data=tips)
plt.title('总账金额与小费金额之间的关系')
plt.show()
#### 3.2.3 蜂巢图 jointplot
pairwise visualization object demonstrating the relationship between total amount spent and tip amount is created using seaborn's jointplot function with hexagonal binning plot.
该图表的主标题设置为单变量分布视图,并将其位置稍微向上偏移一点以提高可读性.
通过plt.show()命令生成并显示该可视化图表.
>
>
> jointplot 在散点图 上面 和右边 会加上X轴对应数据的直方图, 和Y轴对应数据的直方图
>
>
>
> kind=‘hex’ 中间就不是散点图而是蜂巢图
> 没有hue参数,Use of `hue` with `kind='hex'` is not currently supported
>
>
#### 3.2.4 2dkde图
sns.kdeplot(data=tips, x='data fields', y='bill amount', filled=True, colorbar=True)
plt.title('Exploring the relationship between total bills and tips')
plt.tight_layout()
plt.show()
>
>
> fill=True 是否填充颜色 默认fasle
>
>
>
> cbar=True 是否显示颜色深浅的图例 默认是false
>
>
#### 3.2.4 柱状图 barplot
先计算分组聚合之后的结果再绘制柱状图
sns.barplot(x='time',y='total_bill', data=tips,estimator='mean',errorbar=None)
>
>
> barplot 相当于对x分组, 对y计算均值
>
>
>
> 参数 estimator 可以调整统计方法 默认是mean 如果传max 相当于对x分组, 对y计算最大值
>
>
>
> errorbar 默认会显示一个置信区间(图中的黑线部分) , 如果当前数据是对一组海量数据的抽样, 此时计算出来的均值 不见得就是整体的真实的均值, errorbar 给出了真实的均值可能分布的区间, 这里可以关掉
>
>
>
> errorbar=None 不显示误差棒
>
>
#### 3.2.5 箱线图 box /提琴图violin
共同的特点 都会显示中位数 3/4分位数 1/4 分位数 和 离群点(异常值)
提琴图还会显示数据分布的情况, 鼓包鼓起来的越大, 说明数据量越多
sns.boxplot(data=tips,x='time',y='total_bill') # 能够反映各个分位点及其离群数据点的情况,并且无法呈现样本数量的信息
提琴图与箱线图相似,但提琴图不仅展示了数据分布情况还能反映数据分布的密度程度,通过鼓包大小可以直观地判断数据分布的密度
sns.violinplot(x='time', y='total_bill', data=tips)
其中一个重要参数是split参数,默认设置为False,该功能仅适用于二分类场景分析
#### 3.2.6成对关系图 pairplot
把所有的数值型变量, 两两绘制关系图(默认画散点图), 对角线画直方图
* 缺点是存在冗余信息,图的上半部分和下半部分相同
* sns.pairplot(tips)
* 可以指定两两关系图上一半下一半可以有区别
* pair_grid = sns.PairGrid(tips)
通过调用sns库中的pairplot方法绘制散点图,并指定数据参数为tips数据集
>
>
> map_upper 右上角
>
>
>
> map_lower 左下角
>
>
>
> map_diag 对角线
>
>
### 3.3 多变量间的区分
#### 通过颜色区分
双变量可视化的图形添加一个hue参数, 传入类别型值, 就可以通过颜色对类别进行区分, 相当于多了一个可视化的维度
使用matplotlib库中的subplots函数来配置子图尺寸为12乘以6英寸。
然后调用seaborn库中的violinplot函数来根据性别区分时间与总费用的分布情况,并设置数据源为titanic数据集中的tip信息,并将图形进行分段处理。
>
>
> split=True 只有 hue=参数对应的类别有两个取值的时候才可以使用
>
>
>
> hue=参数对应的类别有多个取值, split=True 此时会报错
>
>
sns.pairplot(tips,hue = 'sex')
散点图
sns.lmplot(x='total_bill',y='tip',data=tips,fit_reg=False,hue='sex',markers=['o','x'])
>
>
> markers 指定形状 [‘o’,‘x’]
>
>
#### 通过大小和形状区分
* 可以通过点的大小表示更多信息,但通过大小区分要谨慎使用,当差别不大时很难区分
* 在lmplot中可通过scatter_kws参数 来控制散点图点的大小
* markers控制形状
### 3.4 主题和样式
可以使用sns.set_style函数更改样式
* 该函数只要运行一次,后续绘图的样式都会发生变化
* 有5种样式:
* darkgrid 深色网格(默认)
* whitegrid 白色网格
* dark 深色背景
* white 白色背景
* ticks 坐标轴加刻度线,白色背景
支持的主题参数 [white, dark, whitegrid, darkgrid, ticks]
sns.set_style('tick style')
plt.subplots(figsize=(12,6))
sns.violinplot(x='time', y='total_bill', hue='sex', data=tips)
### 4 今日小结
#### 4.1 数据可视化
matplotlib, **pandas** , seaborn
单变量可视化
* 类别型 柱状图 饼图(所有的部分加起来是整体, 类别不要太多)
* 数值型 直方图
双变量可视化
* 散点图 研究两个变量之间是否有关联
* 蜂巢图
* 折线 一个变量随时间的变化情况
多变量可视化
* 散点图扩展: 气泡图
* 点指定大小
* 点区分颜色 (类别)
排好顺序之后, 各种操作的效率会提高, 并且可以做resample重采样
#### 4.2 seaborn小结
seaborn的使用,关键的参数
x, y, data , hue
**scatterplot**() 散点
* regplot() 拟合关系直线
* lmplot()
* jointplot
**histplot**() 直方
kdeplot() 核密度图
**barplot**() # x, y 数据使用x分组, 对y 聚合 默认求平均
**countplot**() # 计数条形图
**boxplot**() # 箱线图
violinplot() # 提琴图
pairplot() # 成对关系图
