Summary of learning data analysis(四)
数据可视化
在进行数据可视化时,经常会使用到两个可视化库,seaborn库和matplotlib库
difference&connection
seaborn库使用matplotlib库作为底层,正如某位大牛所言“matplotlib试着让表达简单的事情更加简单,表达困难的事情变得可能,那么seaborn就是让表达困难的事情变得简单”,使用matplotlib库最大的困难是其默认的各种参数,而seaborn则避免这个问题。简而言之,seaborn较于matplotlib更高级,但是matplotlib的困难也是其特点所在,各种参数的设置可以更好的满足designer的个性化需求。在对于创建用于打印或者网页的静态图形,建议默认使用matplotlib和附加的库,如pandas和seaborn
matplotlib
导入绘图库库
通常采用如下代码引入matplotlib绘图库
import matplotlib.pyplot as plt
## 在Jupyter notebook进行交互式绘图常补充
# %matplotlib notebook
绘图
利用pyplot进行绘图的流程大致如下
-
第一部分
- 创建画布:
plt.figure(n)
,n为画布编号,可不填。事实上,这一步也可省略,直接执行第二步,因为直接执行第二步时后台会自动执行这一步 - 创建子图并选定子图:
plt.subplot(2,2,1)
,将当前画布分为四个绘图区域(axes),221(中间逗号可省略)表示将画布分为两行两列,并在第一个绘图区域绘图
- 创建画布:
-
第二部分
- 绘图:
plt.plot(x,y,'g--')
,matplotlib的plot函数接受一组X和Y坐标,还可以接受一个表示颜色和线型的字符串缩写,关于添加标题等操作下面进行统一总结
- 绘图:
-
第三部分
- 显示图片:
plt.show()
- 保存图片:
plt.savefig("xxx.svg")
(将图表保存为SVG格式)
- 显示图片:
matplotlib操作汇总
- 默认可视化操作
代码 | 说明 |
---|---|
plt.plot() | 画图 |
plt.show() | 显示 |
- 设置参数
代码 | 说明 |
---|---|
plt.xticks(rotation) | 变量名倾斜 |
plt.xlable(’“变量名”) | x轴名称 |
plt.ylable(“变量名”) | y轴名称 |
plt.title(“标题名”) | 标题名称 |
- 子图
代码 | 说明 |
---|---|
fig=plt.figure | 指定默认画图空间 |
fig.add_subplot(4,1,x) | x代表相对位置 |
- 加注释
代码 | 说明 |
---|---|
plt.legend(loc=‘best’) | 'best’代表注释框的位置 |
- 绘图种类
代码 | 说明 |
---|---|
fig,ax=plt.subplots() | ax是画图的轴,实际画图;fig用来设置参数 |
ax.bar(bar_positions, bar_heights, 0.5) | 柱形图—0.5代表柱宽 |
ax.barh() | 橫柱形图 |
ax.scatter(x, y) | 散点图 |
ax.hist(y, range(4,5), bins=20) | 直方图—range设置了值的范围 |
ax.set_ylim(0.5) | 直方图—设置y轴范围 |
ax.boxplot() | 盒图 |
- 在某元素上加文字
代码 | 说明 |
---|---|
ax.text(x, y, ‘text’) | 加text |
seaborn
使用seaborn时,可以使用库本身提供的内置数据集,也可以加载通过pandas导入的dataframe/series数据。
若是使用内置的seaborn数据集,可以使用load_dataset()函数,要查看内置的所有数据集可以查看,下面来使用内置数据集进行绘图分析https://github.com/mwaskom/seaborn-data
# Import necessary libraries
import seaborn as sns
import matplotlib.pyplot as plt
# Load iris data
iris = sns.load_dataset("iris")
# Construct iris plot
sns.swarmplot(x="species", y="petal_length", data=iris)
# Show plot
plt.show()
(ps:在运行代码时可能会出现<urlopen error [Errno 11004] getaddrinfo failed >的报错信息,关于解决方案可参考:https://blog.csdn.net/qq_43474959/article/details/107902588
至于使用通过pandas导入的数据集进行绘图分析,方法大同小异,在这仅给出一份优秀博客的链接供参考:https://www.jianshu.com/p/5ff47c7d0cc9
seaborn操作汇总
-
Seaborn库是在Matplotlib库基础上的封装
-
设置风格
- sns.set():默认风格 sns.set_style(“风格”):5种风格 with
sns.axes_style(“风格”):with下的语句全部使用这种风格
- sns.set():默认风格 sns.set_style(“风格”):5种风格 with
-
布局
- sns.despline(offset, left):设置轴线的偏置及显示
sns.set_context(“paper”):设置图中曲线大小
- sns.despline(offset, left):设置轴线的偏置及显示
-
调色板:sns.color_palette(),共有6个主题
- 圆形画板:sns.color_palette(“hls”)
- 成对:“Paired”
- 连续型
- sns.color_palette(“Blues”):由浅到深
- sns.color_palette(“Blues_r”):由深到浅
- sns.light_palette(“green”):由浅到深,reverse=True表示由深到浅
- sns.dark_palette(“green”):由深到浅
- 线型:sns.cubehelix_palette(8, start, rot)
-
变量分析
- 单变量:sns.distplot(x, kde, bins, fit)——直方图
- x:变量
- kdn:估计和密度
- bins:将x轴分为几份
- fit:分布状态
- 双变量:
- sns.jointplot(x, y, data)——散点图
- sns.jointplot(x, y, kind=“hex”,
color)——可体现数据密度
- 多变量
- sns.pairplot():体现两两变量之间的关系
- sns.stripplot(x, y, data):不推荐,数据量大时连成一条线
- 优化方法:
- sns.stripplot(x, y, data, jitter=True)——加小幅度的抖动
- sns.swamplot(x, y,data)——树状
- sns.violinplot(x, y, hue, data, split)——小提琴图
- 单变量:sns.distplot(x, kde, bins, fit)——直方图
-
回归分析:regplot,lmplot
- sns.load_dataset(“数据”)——下载数据
- sns.regplot(x, y, data, jitter)
-
分类分析
- sns.barplot(x, y, hue, data):条形图,描绘整体趋
- sns.pointplot(x, y, hue,data):点图,描绘变化差
- sns.factorplot(x, y, data, kind):多层面板分类图
-
Facetgrid——展示子集
- 使用方法
- g=sns.FacetGrid(data, col)
- g.map(plt.hist, “变量”)
- 设置参数
- g.set_axis_labels():轴的名称
- g.set(xticks, yticks):x,y的取值
- g.fig.subplots_adjust(wspace, hspace):间隙
- 多变量
- g.PairGrid()
- g.map_diag()
- g.map_offdiag()
- 使用方法
-
热度图:sns.heatmap(data, vmin, vmax, center, annt,fmd, linewidth, cmap)
- annot:在每一格中显示数字
- fmd:显示数字的格式
- linewidth:格间距离
- cmap:颜色图
task Ⅳ
reflection:基本的可视化图案及应用场景
solution:基本可视化图案如下汇总
-
折线图
- 简单线性图
- 样式较全的线性图
- 多条折线
-
条状图
- 垂直条状图
- 水平条状图
-
柱状图
-
饼图
-
散点图
-
直方图
- 简单直方图
- 高斯分布直方图/频率分布直方图
-
箱线图
应用场景:老铁们,这个应该不需要说太多吧,初高中知识哈,不清楚的话,赶紧去找找体育老师~~(手动狗头)
Titanic数据可视化
## 导库(在jupyter notebook中运行)
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
## 加载数据并简单查看
text = pd.read_csv('D:/contest/kaggle/Data Analisis/data/result.csv')
#text.head()
## 可视化数据集中男女生存人数分布情况
sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('survived_count')
#plt.show()
## 可视化数据集中男女中生存与死亡人数的比例图
text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('survived_count')
plt.ylabel('count')
## 可视化数据集中不同票价的人生存和死亡人数分布情况
## 计算不同票价中生存与死亡人数 1表示生存,0表示死亡
fare_sur = text.groupby(['Fare'])['Survived'].value_counts()
# 未排序绘折线图
fig = plt.figure(figsize=(20, 18))
fare_sur.plot(grid=True)
plt.legend()
plt.show()
## 可视化数据集中不同票价的人生存和死亡人数分布情况
## 计算不同票价中生存与死亡人数 1表示生存,0表示死亡
fare_sur = text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
# 排序后绘折线图
fig = plt.figure(figsize=(20, 18))
fare_sur.plot(grid=True)
plt.legend()
plt.show()
conclusion:由上面两图可发现,不排序虽然可以观测到survived人数最值所对应票价,但无法观测出趋势如何,因此需要排序后再绘图,所得图像更加直观,所含信息量更大。
## 可视化数据集中不同仓位等级的人生存和死亡人员的分布情况
# 1表示生存,0表示死亡
pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()
sns.countplot(x="Pclass", hue="Survived", data=text)
conclusion:乘客社会等级越高,幸存率越高
facet = sns.FacetGrid(text, hue="Survived",aspect=2)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, text['Age'].max()))
facet.add_legend()
plt.xlabel('Age')
plt.ylabel('density')
conclusion:在年龄15岁的左侧,生还率有明显差别,密度图非交叉区域面积非常大,但在其他年龄段,则差别不是很明显,认为是随机所致,因此可以考虑将此年龄偏小的区域分离出来。
## 可视化展示数据集中不同仓位等级的人年龄分布
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")
单有此图并不能展示出仓位等级和年龄之间明显存在某种关系
summary
数据可视化对于我们理解数据相关性提供了很大的帮助,我们也可以通过可视化进行特征的合并等操作,为特征工程工作提供了便利。关于数据可视化,对于数据分析/挖掘人员至关重要,在现在的大数据时代,我们也经常用hive进行数据挖掘,用echarts进行数据可视化,展示大数据的魅力。
reference
https://blog.csdn.net/Lucia_0103/article/details/88549852
https://www.jianshu.com/p/5ff47c7d0cc9
https://blog.csdn.net/Andrew_ZhouC/article/details/86810505