【数据分析入门】Task 04 数据可视化
2.7 数据可视化
2.7.1 matplotlib简介
数据分析初始阶段,通常都要进行可视化处理。数据可视化旨在直观展示信息的分析结果和构思,令某些抽象数据具象化,这些抽象数据包括数据测量单位的性质或数量。
在数据可视化中常用的包是matplotlib
,它是建立在Numpy之上的一个Python图库,随着时间的推移,matplotlib催生了许多用于数据可视化的附加工具包,如seaborn
。
matplotlib官网:http://matplotlib.org/
2.7.2 matplotlib绘图基础
(1) Figure对象
在任何绘图之前,都需要一个Figure对象,可以理解成我们需要一张画板才能开始绘图。
基本语法
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
参数 | 说明 |
---|---|
num | 图像编号或名称,数字为编号 ,字符串为名称 |
figsize | 指定figure的宽和高,单位为英寸; |
dpi | 指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张 |
facecolor | 背景颜色 |
edgecolor | 边框颜色 |
frameon | 是否显示边框 |
#导入matplotlib.pyplot包
import matplotlib.pyplot as plt
fig=plt.figure() #在IPython中,将出现一个空的绘图窗口,但是在Jupyter中,直到我们使用更多命令之前,什么都不会显示
(2) add_subplot添加子图
基本语法:
subplot(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)
例如
ax = fig.add_subplot(223)
#参数一:子图行数
#参数二:子图总列数
#参数三:子图位置
#所以上面的111代表这是一个2*2网格的第三个子图,也就是左下角那个
相关资料:https://www.cnblogs.com/huangchenggener/p/10954920.html
(3) Axes坐标轴
在拥有Figure对象之后,在作画前我们还需要轴,没有轴的话就没有绘图基准,所以需要添加Axes。
fig = plt.figure()
ax = fig.add_subplot(111)#111”表示“1×1网格,第一子图”,“234”表示“2×3网格,第四子图
ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',
ylabel='Y-Axis', xlabel='X-Axis')
"""
xlim:x轴坐标范围, ylim:y轴坐标范围
title:图标名
xlabel:x轴名,ylabel:y轴名)
"""
plt.show()
对于子图的实现也可以使用axes的二维形式实现
fig, axes = plt.subplots(nrows=2, ncols=2)
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')
参数详细介绍见:
(4)plot函数
plot() 函数是 matplotlib 的 pyplot 模块中最常用的绘图函数
基本语法plot([x], y, [fmt], **kwargs)
参数 | 含义 |
---|---|
[x] | 可选参数,横坐标轴数据 |
y | 纵坐标轴数据 |
[fmt] | 可选参数,字符串,定义图形的基本样式:颜色,点形,线形 |
**Kwargs | 不定长的关键字参数,用字典形式设置图形的其他属性 |
2.7.3 pandas中绘图
先通过Series或DataFrame产生数据,然后传递给matplotlib进行绘制
(1)Series.plot方法的参数
(2)DataFrame.plot的参数
(3)图例注解相关函数
plt.lengend()
用于给图像加图例,图例是集中于地图一角或一侧的地图上各种符号和颜色所代表内容与指标的说明,有助于更好的认识地图
语法参数
matplotlib.pyplot.legend(*args, **kwargs)
常用的几个参数
- 设置图列位置
plt.legend(loc='upper center')
,也可以为‘best’(自动安排的最佳位置),‘upper right’,‘center’等 - 设置图例字体大小
fontsize : int or float or {‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’}
- 设置图例边框及背景
plt.legend(loc='best',frameon=False) #去掉图例边框
plt.legend(loc='best',edgecolor='blue') #设置图例边框颜色
plt.legend(loc='best',facecolor='blue') #设置图例背景颜色,若无边框,参数无效
- 设置图例标题
legend = plt.legend(["CH", "US"], title='China VS Us')
- 设置图例名字及对应关系
legend = plt.legend([p1, p2], ["CH", "US"])
(4)常见可视化图形
- 用来描述图中各数据序列的图例,matplotlib提供的
legend()
函数可以为每个数据序列提供相应的标签。 - 对图中要点的注解。可以借助matplotlib提供的
annotate()
函数。 - 横轴和纵轴的标签,可以通过
xlabel()
和ylabel()
绘制出来。 - 一个说明性质的标题,通常由matplotlib的
title
函数来提供. - 网格,对于轻松定位数据点非常有帮助。
grid()
函数可以用来决定是否使用网格。
图例 | 参数设置 | 特点 | 图像 |
---|---|---|---|
折线图 | kind='line' | 折线图是我们观察趋势常用的图形,可以看出数据随着某个变量的变化趋势,对于数据使用df.plot()默认画的是折线图 | |
柱状图 | kind='bar' | 对于分类数据这种离散数据,需要查看数据是如何在各个类别之间分布的,可以使用柱状图,为每个类别画出一个柱子 | |
条形图 | kind='barh' | 条形图就是将竖直的柱状图翻转90度得到的图形。与柱状图一样,条形图也可以有一组或多种多组数据 | |
直方图 | 直方图是柱形图的特殊形式,当我们想要看数据集的分布情况时,选择直方图。直方图的变量划分至不同的范围,然后在不同的范围中统计计数。在直方图中,柱子之间的连续的,连续的柱子暗示数值上的连续 | 箱线图 | |
散点图 | kind='scatter' | 通过散点图可以探索变量之间的关系 | |
饼状图 | kind='pie' | 饼图是用面积表示一组数据的占比 |
2.7.4 Seaborn
Seaborn是基于matplotlib的Python可视化库。 它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,不需要经过大量的调整就能使图变得精致
相关资料:
2.7.4 对泰坦尼克号数据集的数据可视化探索
任务一:导入数据和包
#加载所需要的库
# 如果出现 ModuleNotFoundError: No module named 'xxxx'
# 你只需要在终端/cmd下 pip install xxxx 即可
%matplotlib inline
'''
在使用jupyter notebook 或者 jupyter qtconsole的时候,才会经常用到%matplotlib,
%matplotlib具体作用是当你调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,
或者生成一个figure画布的时候,可以直接在你的python console里面生成图像
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#导入文件
text=pd.read_csv(r'result.csv') #前面加r'表示不转义
text.head()
任务二:使用柱状图可视化展示泰坦尼克号数据集中男女中生存人数分布情况
通过柱状图可以看出女性生存人数更多
sex=text.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('Survived_count')
plt.show()
任务三:使用柱状图可视化展示泰坦尼克号数据集中男女中生存人与死亡人数的比例
可以看出女性存活人数比男性多,并且存活率也比男性高
#查看各个性别的存活的与死亡的数量
a=text.groupby(['Sex','Survived'])['Survived'].count()
a
#使用unstack旋转索引
a=text.groupby(['Sex','Survived'])['Survived'].count().unstack()
a
#可视化
text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked=True)
plt.title('survived_count')
plt.ylabel('count')
任务四:使用折线图可视化展示泰坦尼克号数据集中不同票价的人生存和死亡人数分布情况
【1】不对人数进行排序
fare_sur1 = text.groupby(['Fare'])['Survived'].value_counts()
fare_sur1
可以看出人数是无序的
fig = plt.figure(figsize=(10, 9)) #figure设置长宽大小
fare_sur1.plot(grid=True) #grid=True显示网格
plt.legend()#显示图例
plt.show()
【2】对人数进行排序
可以发现排序后的图像更容易查看票价与人数之间关系
#按人数进行了排序
fare_sur=text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
fare_sur
#排序后绘制折线图
fig=plt.figure(figsize=(20,18)) #figsize设置长宽大学
fare_sur.plot(grid=True)#grid=True显示网格
plt.legend()#显示图例
plt.show()
任务五:使用柱状图可视化展示泰坦尼克号数据集中不同仓位等级的人生存和死亡人员的分布情况
此处调用了seaborn库,可以看出其代码比matplotlib更为简洁
通过条形图可以发现一等舱存活人数最多,三等舱的最少
#1表示活着,0表示死亡
pclass_sur=text.groupby(['Pclass'])['Survived'].value_counts()
pclass_sur
import seaborn as sns #调用seaborn
sns.countplot(x='Pclass',hue='Survived',data=text)
#countplot画条形图,x为列名,hue(str):dataframe的列名,按照列名中的值分类形成分类的图,data为dataframe或数组
任务六:可视化展示泰坦尼克号数据集中不同年龄的人生存与死亡人数分布情况
facet=sns.FacetGrid(text,hue='Survived',aspect=3)
facet.map(sns.kdeplot,'Age',shade=True)
facet.set(xlim=(0,text['Age'].max())) #set(**kwargs) | 在每个子图集坐标轴上设置属性。
facet.add_legend()
任务七:用折线可视化展示泰坦尼克号数据集中不同仓位等级的人年龄分布情
text.Age[text.Pclass==1].plot(kind='kde')
text.Age[text.Pclass==2].plot(kind='kde')
text.Age[text.Pclass==3].plot(kind='kde')
plt.xlabel('age')
plt.legend((1,2,3),loc='best')