13_Pandas和Seaborn数据可视化

Pandas数据可视化

学习目标

本章内容不需要理解和记忆,重在【查表】!

  • 知道数据可视化的重要性和必要性
  • 知道如何使用Matplotlib的常用图表API
  • 能够找到Seaborn的绘图API

1 Pandas数据可视化

一图胜千言,人是一个视觉敏感的动物,大多数人对数字无法在较短的时间内找到规律和业务意义,可视化就势在必行。视觉化效应 (Visual effects) 是指人类认知过程中,只要将非视觉性信息转化成视觉信息,可以大大增强海马体的记忆与前额叶皮质的思维反应速度。

  • Pandas的数据可视化依赖于matplotlib模块的pyplot类,在安装Pandas时会自动安装Matplotlib
  • Matplotlib是一个专门的绘图可视化包,可以对图形做细节控制,绘制出出版质量级别的图形,通过Matplotlib,可以简单地绘制出常用的统计图形。
  • 除了Matplotlib以外还有很多用于可视化的包,比如Seaborn

1.1 Pandas内置Matplotlib

  • Pandas内置图表功能依赖其自带的Matplotlib包
  • dataframe对象或seriers对象直接调用plot()函数即可绘图
  • Pandas绘图的API使用方法和Matplotlib包相同
import pandas as pd
# 加载 anscombe数据
anscombe = pd.read_csv('data/anscombe.csv')
df1 = anscombe[anscombe['dataset']=='I']
df2 = anscombe[anscombe['dataset']=='II']
df3 = anscombe[anscombe['dataset']=='III']
df4 = anscombe[anscombe['dataset']=='IV']

df1.plot()  # 默认折线图
df1['x'].plot.bar()

# df.plot.line() # 折线图的全写方式
# df.plot.bar() # 柱状图
# df.plot.barh() # 横向柱状图 (条形图)
# df.plot.hist() # 直方图
# df.plot.box() # 箱形图
# df.plot.kde() # 核密度估计图
# df.plot.density() # 同 df.plot.kde()
# df.plot.area() # 面积图
# s.plot.pie() # 饼图
# df.plot.scatter() # 散点图
# df.plot.hexbin() # 六边形箱体图,或简称六边形图
plt.show()

返回结果如下:我们会在本章节《2. Pandas图表绘制》中详细讲解各种图形的绘制

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2 解决中文显示以及关闭警告

  • 运行下边的代码,中午字符无法正常显示,而且出现警告信息
fig.suptitle('可视化技术让数据更加直观') # 为画布大图添加标题
fig # 显示画布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 忽略警告

    import warnings
    # 忽略warnings
    warnings.filterwarnings('ignore')
    
  • 改变字体即可正常显示中文

    • simhei.ttf 字体文件放到 /root/anaconda3/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf 目录下

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • 修改 /root/anaconda3/lib/python3.8/site-packages/matplotlib/mpl-data 目录下的 matplotlibrc 文件

      vim matplotlibrc
      # 增加以下内容
      font.family			 : sans-serif
      font.sans-serif		 : SimHei
      axes.unicode_minus   : False
      

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • 删除 /root/.cache 目录下的 matplotlib 文件

      cd /root/.cache
      rm -rf matplotlib
      

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2 Pandas图表绘制

2.1 折线图line

df1.plot() # 默认折线图
#df1.plot(kind='line') # 结果与df1.plot()
#df1.plot.line() # 结果与df1.plot()
# x轴是索引值,y轴是各列的具体值
# 也可以通过参数指定xy轴对应的列名
df1.plot.line(x='x', y='y')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.2 柱状图bar

df1.plot.bar() # 柱状图
df1.plot.bar(stacked=True) # 柱状堆积
# 也可以通过参数指定xy轴对应的列名
df1.plot.bar(x='x', y='y')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.3 水平条形图barh

df1.plot.barh() # 水平条形图
df1.plot.barh(stacked=True) # 水平条形堆积图
# 也可以通过参数指定xy轴对应的列名
df1.plot.barh(x='x', y='y')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.4 饼图pie

# 饼图,只能展示一维数据
# 参数y指定列名
# 参数autopct='%.2f%%'指定显示百分比 %.2f%%表示保留2位小数
# 参数radius=0.9 指定饼图直径的比例,最大为1
# 参数figsize=(16, 8) 设定图片大小
df1.plot.pie(y='x', autopct='%.2f%%', radius=0.9, figsize=(16, 8)) 
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.5 散点图scatter

# 指定xy轴,grid=True开启背景辅助线
df1.plot.scatter(x='x', y='y', grid=True)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.6 气泡图-特殊的scatter

# 参数s表示每个点的大小,与普通散点图相比能够描述三维数据
df1.plot.scatter(x='x', y='y', grid=True, s=df1['x']*100)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.7 箱线图boxplot

  • 箱线图用于显示多种统计信息:最小值,1/4分位,中位数,3/4分位,最大值,以及离群值(如果有)
df1.boxplot()
# df1.plot.boxplot() # 报错
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.8 直方图hist

  • 直方图描述的是数据在不同区间内的分布情况,描述的数据量一般比较大,图示如下:
# 描述数据出现的次数
df1['x'].plot.hist()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.9 蜂巢图hexbin

  • 蜂巢图又叫做六边形分箱图(Hexagonal Binning),也称六边形箱体图,或简称六边形图,是一种由六边形为主要元素的统计图表。它是一种比较特殊的图表,既是散点图的延伸,又兼具直方图和热力图的特征。
    • 颜色深浅表示该值出现的频率
# gridsize=12设定蜂箱格子的大小,数字越小格子越大
df1.plot.hexbin(x='x', y='y', gridsize=12)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3 Seaborn图表绘制

  • Seaborn是基于matplotlib的图形可视化python包。Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。

  • Matplotlib的API是按照图形的种类进行设计的,比如直方图、散点图等等; 而Seaborn不同,它的绘图API的设计初衷是为了更好的展示数据之间的关系,我们查看Seaborn的官方文档就能很直观的发现这一点。

  • Seaborn的官方文档和版本号

    • API文档 https://seaborn.pydata.org/api.html
    • 历史版本API文档 https://seaborn.pydata.org/archive.html
    • 本课程使用的Seaborn版本为 0.10.1
  • seaborn图的分类

    • 关系图:relplot关系类图表的接口,其实是下面两种图的集成,通过指定kind参数可以画出下面的两种图
      • 散点图 scatterplot() (kind=“scatter”)
      • 线形图 lineplot() (kind=“line”)
    • 分布图
      • 单变量分布图
        • 直方图,质量估计图 distplot()
        • 核密度估计图 kdeplot()
      • 双变量关系图
        • 双变量关系图 jointplot()
        • 变量关系组图 pairplot()
        • 将数组中的数据点绘制为轴上的数据 rugplot()
    • 类别图:catplot 分类图表的接口,其实是下面八种图表的集成,通过指定kind参数可以画出下面的八种图
      • 分类散点图
        • stripplot() (kind=“strip”)
        • swarmplot() (kind=“swarm”)
      • 分类分布图
        • boxplot() (kind=“box”)
        • violinplot() (kind=“violin”)
        • boxenplot() (kind=“boxen”)
      • 分类估计图
        • pointplot() (kind=“point”)
        • barplot() (kind=“bar”)
        • countplot() (kind=“count”)
    • 回归图
      • 回归模型图 Implot()
      • 线性回归图 regplot()
      • 线性回归残差图 residplot()
    • 矩阵图组合图
      • 热力图 heatmap()
      • 聚集图 clustermap()
  • 如果说Matplotlib的API规定了各种图形,那么Seaborn的API设计理念是为了更好的展示数据之间的关系;接下来我们就讲解较为常用的Seaborn绘图API

# 导包
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns # Anaconda内置,无需额外安装
# 加载数据
tips_df = pd.read_csv('data/05_tips.csv')
print(tips_df)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.1 scatterplot关系散点图

# 指定数据集,指定x轴为消费订单金额,y轴为消费金额,
# 散点图通用的可选参数 hue='sex'通过颜色指定分组
# 散点图通用的可选参数 style='smoker' 通过形状指定分组
# 散点图通用的可选参数 size='time' 通过大小指定分组
sns.scatterplot(
    data=tips_df, 
    x='total_bill', 
    y='tip', 
    hue='sex', 
    style='smoker', 
    size='time'
)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2 relplot关系散点线形图

sns.relplot(data=tips_df, x='total_bill', y='tip') # 默认 kind='scatter'
sns.relplot(data=tips_df, x='total_bill', y='tip', kind='line')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.3 stripplot分类散点图

f = plt.figure()
f.add_subplot(2,1,1)
# 按照x属性所对应的类别分别展示y属性的值,适用于分类数据
# 不同饭点的账单总金额的散点图
sns.stripplot(data=tips_df, x='time', y='total_bill')
f.add_subplot(2,1,2)
# hue通用参数按颜色划分
# jitter=True 当数据点重合较多时,尽量分散的展示数据点
# dodge=True 拆分分类
sns.stripplot(data=tips_df, x='time', y='total_bill', jitter=True, dodge=True, hue='day')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[TIPS解决多图同时展示问题]
# 下边的代码只能输出一张图表
sns.stripplot(data=tips_df, x='time', y='total_bill')
sns.stripplot(data=tips_df, x='time', y='total_bill', jitter=True, dodge=True, hue='day')
plt.show()
# 所以我们使用下面的方法进行多图的输出
# f = plt.figure() # 创建画布
# f.add_subplot(2,1,1) # 在画布上申请图表空间,参数2,1,1表示2行1列中的第1个
# 图1 # sns.stripplot(data=tips_df, x='time', y='total_bill')
# f.add_subplot(2,1,2) # 在画布上申请图表空间,参数2,1,2表示2行1列中的第2个
# 图2 # sns.stripplot(data=tips_df, x='time', y='total_bill', jitter=True, dodge=True, hue='day')
# plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.4 violinplot分类小提琴图

  • 在箱线图基础上额外描述了数值出现的频率
# 下图分别描述午餐账单、晚餐账单的最大值、最小值、三个四分位数,以及所有账单金额出现的次数(频率)
sns.violinplot(data=tips_df, x='time', y='total_bill')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.5 barplot分类平均值分布图

# 下图中黑色的粗线条展示了数据的分布(误差线), 线条越短, 数据分布越均匀
# 下图中每个柱的顶点就是该分类y指定列的平均值
sns.barplot(data=tips_df, x='day', y='total_bill')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.6 countplot分类计数图

# 按x指定的列值分组统计出现次数
sns.countplot(data=tips_df, x='day')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.7 heatmap矩阵热力图

  • 将二维的矩阵数据输出为热力图,颜色深浅就表示数值的大小
# 男女在午餐晚餐的平均消费
new_df = tips_df.pivot_table(index='sex', columns='time', values='total_bill', aggfunc='mean')
print(new_df)
# 输出为热力图:男性在晚餐花费最多
sns.heatmap(data=new_df)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.8 pairplot成对关系图

  • 能够将df中所有或指定的数值类型的列,成对的进行组合展示两者之间的关系
sns.pairplot(tips_df)
#sns.pairplot(df) # 全部数值列进行两两组合
#sns.pairplot(df, vars=['列名1', '列名2']) # 指定要组合展示的列名
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 按右上、左下、中间轴线(左上至右下)的方式分别设置图表类型
pair_grid = sns.PairGrid(tips_df)
# 中间轴线上的图设为kdeplot
pair_grid.map_diag(sns.kdeplot) 
# 右上设为lineplot
pair_grid.map_upper(sns.lineplot) 
# 左下设为scatterplot
pair_grid.map_lower(sns.scatterplot) 
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.9 通用配置

  • 将 Seaborn 提供的样式声明代码 sns.set() 放置在绘图前,就可以设置图像的样式
sns.set(
    context='paper', 
    style='darkgrid', 
    palette='deep', 
    font='sans-serif', 
    font_scale=1
)
# context: 参数控制着默认的画幅大小,分别有 {paper, notebook, talk, poster} 四个值。其中,poster > talk > notebook > paper。
# style:参数控制默认样式,分别有 {darkgrid, whitegrid, dark, white, ticks},你可以自行更改查看它们之间的不同。
# palette:参数为预设的调色板。分别有 {deep, muted, bright, pastel, dark, colorblind} 等,你可以自行更改查看它们之间的不同。
# font:用于设置字体
# font_scale:设置字体大小

sns.scatterplot(data=tips_df, x='total_bill', y='tip', hue='sex', style='smoker', size='time')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结

请对下面的内容 有印象、能找到、能理解、能看懂

  • Matplotlib:各种图形的API

    • 折线图 df.plot.line()
    • 柱状图 df.plot.bar()
    • 水平条形图 df.plot.barh()
    • 饼图 df.plot.pie()
    • 散点图 df.plot.scatter()
    • 气泡图 df.plot.scatter()
      • 在散点图的基础上,除了xy参数以外再增加一个s参数,可以展示三维数据
    • 面积图 df.plot.area()
    • 箱线图 df.boxplot()
      • 可以展示最大值、最小值、1/4分位数、中位数、3/4分位数
    • 直方图 df.plot.hist()
      • 描述一维数据,展示数据出现的次数
    • 蜂巢图 df.plot.hexbin()
      • 描述二维数据的同时,展示数据出现的次数
  • Seaborn:实现各种统计功能的图表API

    • API文档 https://seaborn.pydata.org/api.html
    • 历史版本API文档 https://seaborn.pydata.org/archive.html
    • 关系图:relplot关系类图表的接口,其实是下面两种图的集成,通过指定kind参数可以画出下面的两种图
      • 散点图 scatterplot() (kind=“scatter”)
      • 线形图 lineplot() (kind=“line”)
    • 分布图
      • 单变量分布图
        • 直方图,质量估计图 distplot()
        • 核密度估计图 kdeplot()
      • 双变量关系图
        • 双变量关系图 jointplot()
        • 变量关系组图 pairplot()
        • 将数组中的数据点绘制为轴上的数据 rugplot()
    • 类别图:catplot 分类图表的接口,其实是下面八种图表的集成,通过指定kind参数可以画出下面的八种图
      • 分类散点图
        • stripplot() (kind=“strip”)
        • swarmplot() (kind=“swarm”)
      • 分类分布图
        • boxplot() (kind=“box”)
        • violinplot() (kind=“violin”)
        • boxenplot() (kind=“boxen”)
      • 分类估计图
        • pointplot() (kind=“point”)
        • barplot() (kind=“bar”)
        • countplot() (kind=“count”)
    • 回归图
      • 回归模型图 Implot()
      • 线性回归图 regplot()
      • 线性回归残差图 residplot()
    • 矩阵图组合图
      • 热力图 heatmap()
      • 聚集图 clustermap()
  • Pyecharts

    • 官方文档 https://pyecharts.org/#/zh-cn/intro
    • 官方案例 https://gallery.pyecharts.org/#/README

ot() (kind=“strip”)
- swarmplot() (kind=“swarm”)
- 分类分布图
- boxplot() (kind=“box”)
- violinplot() (kind=“violin”)
- boxenplot() (kind=“boxen”)
- 分类估计图
- pointplot() (kind=“point”)
- barplot() (kind=“bar”)
- countplot() (kind=“count”)

  • 回归图

    • 回归模型图 Implot()
    • 线性回归图 regplot()
    • 线性回归残差图 residplot()
  • 矩阵图组合图

    • 热力图 heatmap()
    • 聚集图 clustermap()
  • Pyecharts

    • 官方文档 https://pyecharts.org/#/zh-cn/intro
    • 官方案例 https://gallery.pyecharts.org/#/README
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值