数据可视化
本文记录2022年3月组队学习-动手学数据分析教程知识点,采用kaggle上泰坦尼克的任务,实战数据分析全流程。
教程内容开源地址:
github
: https://github.com/datawhalechina/hands-on-data-analysis
gitee
:https://gitee.com/datawhalechina/hands-on-data-analysis
接下来要重点研究一下数据可视化。本章我们着重研究一下matplotlib绘图库
。Matplotlib可以说是python数据可视化最重要且常见的工具之一,每一位和数据打交道的人几乎都不可避免要用到,此外也有大量的可视化工具是基于matplotlib做的二次开发。
matplotlib
官网指南:https://matplotlib.org/stable/tutorials/introductory/usage.html
4.1 准备
本次实验平台为: Jupyter Notebook
、Numpy
、Pandas
、maplotlib
# 导入基本库
# 设置matplotlib在jupyter notebook的图表绘图
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置图表中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
4.2 matplotlib相识
4.2.1 认识matplotlib
知识点:
Matplotlib
是一个Python 2D
绘图库,用来绘制各种静态,动态,交互式的图表。Matplotlib
可用于Python脚本
,Python
和IPython Shell
、Jupyter notebook
,Web
应用程序服务器和各种图形用户界面工具包等。主要提供三个接口:plt
接口、面向对象接口
和pylab接口
。本文主要研究plt()
接口。
4.2.2 matplotlib画像
1. 图像创建
- Matplotlib的图像是画在
figure
(如windows
,jupyter窗体
)上的,每一个figure
又包含了一个或多个axes
(一个可以指定坐标系的子区域)。最简单的创建figure
以及axes
的方式是通过pyplot.subplots
命令,创建axes
以后,可以使用Axes.plot
绘制最简易的折线图。
例如:绘制折线图。
fig, ax = plt.subplots() # 创建一个包含一个axes的figure
ax.plot([1, 2, 3, 4], [1, 3, 2, 4]) # 绘制图像
2. Figure的组成
Figure
:顶层级,用来容纳所有绘图元素 。Axes
:matplotlib宇宙的核心,容纳了大量元素用来构造一幅幅子图,一个figure可以由一个或多个子图组成。Axis
:axes的下属层级,用于处理所有和坐标轴,网格有关的元素。Tick
:axis的下属层级,用来处理所有和刻度有关的元素。Grid
:添加图表网格线。legend
:在图表中添加label图例参数后。xlabel/ylabel
:分别用于设置x、y轴标题。xticks/yticks
:分别用于自定义坐标轴刻度显示。text/arrow/annotation
:分别在图例指定位置添加文字、箭头和标记。
3. 常用图表
plot
:折线图或点图。scatter
:散点图。bar/barh
:条形图或柱状图。hist
:直方图。pie
:饼图。
4.3 绘图实战
知识点:
绘图流程主要分为三步:
- 创建画板(包括创建
figure
对象和axes
对象)。 - 绘制图表(条形图,折线图等)。
- 配置图例(title、legend等)。
接下来我们将按照三步规律
完成任务。
4.3.1 可视化展示泰坦尼克号男女生中生存人数分布情况
- 首先我们要先处理数据,因为需要用到对于性别与生存人数的统计,我们需要用到前面学到的
groupby()
归类后分别对人数进行sum()
求和,得到目标数据的dataframe
。 - 接下来创建画布,在figure对象进行绘画。
- 选择图表为柱状图来直观展示分布情况。
- 图例添加title。
sex = result.groupby('Sex')['Survived'].sum()
# 这里sex为dataframe可以直接调用plot绘制图表
sex.plot.bar()
plt.title('survived_count')
plt.show()
sex = result.groupby("Sex")["Survived"].sum()
plt.figure(figsize=(1,3))
plt.bar("Sex", sex["male"])
plt.bar("Sex", sex["female"], bottom = sex["male"])
plt.legend()
plt.title("生存人数分布情况")
plt.show()
4.3.2 可视化展示泰坦尼克号男女生中生存与死亡比例图
- 首先我们要先处理数据,因为需要用到对于性别与生存人数的统计,我们需要用
groupby()
归类后分别对人数以及生存人数进行分类,再加上count()
得到多维索引数据,要通过unstack()
降维度,得到目标数据的dataframe
。 - 接下来创建画布,在figure对象进行绘画。
- 选择图表为柱状图堆叠来直观展示分布情况。
- 图例添加图例、标题。
label = ["female", "male"]
Survived_temp = result.groupby(["Sex","Survived"])["Name"].count()
plt.figure(figsize=(5, 5))
plt.bar(label[0], Survived_temp[label[0]][0], label="女生死亡")
plt.bar(label[0], Survived_temp[label[0]][1], label="女生生存", bottom=Survived_temp[label[0]][0])
plt.bar(label[1], Survived_temp[label[1]][0], label="男生死亡")
plt.bar(label[1], Survived_temp[label[1]][1], label="男生生存", bottom=Survived_temp[label[1]][0])
plt.legend()
plt.title('survived_count')
plt.ylabel('count')
plt.show()
# 提示:计算男女中死亡人数 1表示生存,0表示死亡
# 使用unstack()降维
result.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('survived_count')
plt.ylabel('count')
4.3.3 可视化展示泰坦尼克号不同票价的人生存和死亡人数分布情况
- 使用
groupby()
对Fare
进行聚类,获得其中的Survived
的人数数据,并对人数按照票价索引进行排序。 - 接下来创建画布,在figure对象进行绘画。
- 选择图表为折线图来直观展示分布情况。
- 图例添加方格线、标题。
result.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False).plot(grid=True)
plt.legend()
plt.title("Survived")
plt.show()
4.3.4 可视化展示泰坦尼克号不同仓位等级的人生存和死亡人员的分布情况
- 对仓位等级以及生存情况进行聚类,统计
Survived
存活人数的count()
,使用unstack()
降维,获得目标DataFrame
。 - 接下来创建画布,在figure对象进行绘画。
- 选择图表为柱状图来直观展示分布情况。
- 图例添加标题。
result.groupby(["Pclass", "Survived"])["Survived"].count().unstack().plot(kind="bar")
import seaborn as sns
sns.countplot(x="Pclass", hue="Survived", data=text)
4.3.5 可视化展示泰坦尼克号不同年龄的人生存与死亡人数分布情况
- 分别统计
Survived
存活人数的年龄count()
,获得目标DataFrame
。 - 接下来创建画布,在figure对象进行绘画。
- 选择图表为密度曲线来直观展示分布情况。
result["Age"][result["Survived"] == 0].plot(kind='kde')
result["Age"][result["Survived"] == 1].plot(kind='kde')
plt.xlabel("age")
plt.legend(("死亡","生存"),loc="best")
sns.kdeplot(result[result['Survived'] == 0]['Age'], label='死亡')
sns.kdeplot(result[result['Survived'] == 1]['Age'], label='存活')
facet = sns.FacetGrid(text, hue="Survived",aspect=3)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, text['Age'].max()))
facet.add_legend()
4.3.6 可视化展示泰坦尼克号不同仓位等级的人年龄分布情况
- 分别统计
"Pclass"
不同等级下人物的年龄count()
,获得目标DataFrame
。 - 接下来创建画布,在figure对象进行绘画。
- 选择图表为密度曲线来直观展示分布情况。
result.Age[result.Pclass == 1].plot(kind='kde')
result.Age[result.Pclass == 2].plot(kind='kde')
result.Age[result.Pclass == 3].plot(kind='kde')
plt.xlabel("age")
plt.legend((1,2,3),loc="best")
sns.kdeplot(result[result['Pclass'] == 1]['Age'], label='仓位等级1')
sns.kdeplot(result[result['Pclass'] == 2]['Age'], label='仓位等级2')
sns.kdeplot(result[result['Pclass'] == 3]['Age'], label='仓位等级3')
4.4 总结
数据可视化的重点在于能够发现数据之间变化的趋势,整体的规律,能够最快最直观的理解数据所要表达的具体内涵,这样才能有助于我们进一步去挖掘甚至于使用。