数据可视化:把玩一下seaborn(一)
最近刚开始学习数据可视化,第一个任务就是了解并完成seaborn(一个python处理数据可视化的库)的官方教程,其他数据可视化的内容会后续更新。seaborn在调用数据的时候会有一些数据库相关的操作,例如
data=data=diamonds.sort_values("color")
这里就不解释了
环境搭建:
- 下载Anaconda搭建Python环境
- 下载类库Numpy, SciPy, matplotlib, pandas 和 seaborn
引入需要的库,设置一下显示网格的样式
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
需要强调的是可视化数据最主要的功能是让数据通过一种更直观,更高效的方式将数据的分布,关系等等特点展示出来,便于使用者分析,所以在这里理解图表的能力和设计图表的能力都是非常重要的.
数据关系可视化
接下来我们使用seaborn最常用的方法relplot()
实现散点图scatterplot()
和线图lineplot()
散点图 Scatter plots
首先可以引入seaborn中自带事例子数据集“tips”,这个数据集的数据有
-
时间数据 week
-
账单: 总消费,小费 total_bill, tips
-
消费者性别 sex
-
消费者是否抽烟 smoker
…
sns.set(style="darkgrid") # 设置样式为网格
tips = sns.load_dataset("tips")
其实seaborn中有很多画散点图的方法其中一种是scatterplot()
,使用方法是把数据集中的集合分配给方法中的属性,这样不同集合就会使用散点图中不同属性的样式展示出来如下面实例中的色调属性hue
获取了数据集中的smoker
集合,这样集合中的数据差异就可以通过色调的不同展示出来,其他同理.
sns.relplot(x="total_bill", y="tip", size="size",hue="smoker", palette="ch:r=-.5,l=.75", style="time",sizes=(15, 200), data=tips);
scatterplot
是relplot
的默认方法所以不需要单独设置,具体属性可以去scatterplot()
的Api查看.
折线图强调连续性 Emphasizing continuity with line plots
下面介绍一下relplot
里的第二个方法lineplot
,前面说过默认方法是scatterplot
所以要设置属性kind=lineplot
启用折线图,这个方法默认sort=true
将x轴数据与y轴数据按顺序对应起来.
fmri = sns.load_dataset("fmri")
sns.relplot(x="timepoint",
y="signal",
hue="region",
style="event",
dashes=True, # 开启显示虚线
markers=True, # 显示标记
# ci="sd" # 显示标准偏差,默认是显示置信区间,None关闭显示
kind="line",
data=fmri);
同时显示多了图表
用到relplot
的属性是col
和col_wrap
自动分行,同理也可以用row
属性设置列.
sns.relplot(x="timepoint", y="signal", hue="event", style="event",
col="subject",
col_wrap=5, # 设置每行显示图表数量
height=3, # 每个图表的高度
kind="line",
data=fmri.query("region == 'frontal'"));
数据种类的可视化 Plotting with categorical data
对数据进行分类可视化用到的方法是catplot()
,和数据关系可视化类似,catplot()
也有多种分类(kind),包括散点图(strip
,swarm
),分布图(box
,violin
,boxen
)和柱状图(point
,bar
,count
).
sns.set(style="ticks", color_codes=True) #设置一下样式
散点图 categories scatterplots
除了种类外,散点图能精确的显示数据的分布,散点图默认显示方式是stript,例如下面的例子,
tips = sns.load_dataset("tips") #载入数据
sns.catplot(x="day", y="total_bill", data=tips);
可以发现上面有些数据重叠在一起了,解决这个问题可以使用jitter
属性,也可使用另一种散点图swarm
,它自动使用算法区分出可能重叠的数据.需要注意的是可以使用order
来控制顺序.下面的例子可以看出
sns.catplot(x="total_bill", y="day", hue="time", kind="swarm", order=["Sun", "Sat","Fri","Thur"], data=tips);
分布图 Distributions of observations within categories
数据量太大的时候,散点图显示不同种类的分布情况非常恐怖,所以可以使用分布图来观察不同种类数据的分布情况,具体代码就不贴了,只需要更改一下kind
属性就可以了,下面分别看一下box
,boxen
,violin
三种情况不同的显示风格:
其中要重点说一下violin
方法使用了KDE,因此有一些额外的属性可以设置,具体可以查看一下api例如:
sns.catplot(x="total_bill", y="day", hue="sex",bw=.4, cut=2, inner="stick",
kind="violin", split=True, data=tips);
合并图表
另外看一下如何将两个不同类型的图表合为一个,例如下面我们将violin
和swarm
类型的图表在一张图里展示:
g = sns.catplot(x="day", y="total_bill", kind="violin", inner=None, data=tips)
sns.swarmplot(x="day", y="total_bill", color="k", size=3, data=tips, ax=g.ax);
数据估计
很多情况我们是不需要特别精确的数据信息的,只需要了解各个分类的走势和差异性,这个时候柱状图bar
和点状图point
可以展示的信息更简洁明了.
例如这里我们引入一个新的数据集titanic来分析一下泰坦尼克号上不同仓位的乘客的生存率
titanic = sns.load_dataset("titanic")
首先下面看一下柱状图,这张图是可以直观的比较出各个仓位的生存率,需要指出的是柱状图的矩形边框也可以设置颜色.
sns.catplot(x="class",
y="survived", hue="sex",
palette={"male": "g", "female": "m"}, # 设置hue属性显示的颜色
edgecolor=".6",
kind="bar",
data=titanic);
点状图可以设置的属性也有很多,比如线的样式,点的样式等等
sns.catplot(x="class", y="survived", hue="sex",
palette={"male": "g", "female": "m"},
markers=["^", "o"], linestyles=["-", "--"],
kind="point", data=titanic);
图表的大小控制
设置图表的大小可以使用matplotlib里的plt.subplots(figsize=(width,height))
想要改变图表各个轴的精度可以使用set
方法参照下面的实例
g = sns.catplot(x="fare", y="survived", row="class",
kind="box", orient="h", height=1.5, aspect=4,
data=titanic.query("fare > 0"))
g.set(xscale="log"); # x轴以对数形式显示
参考资料: