Seaborn 简明教程
seaborn是一个常见的用于绘图的python模块,相比较于matplotlib,它使得绘制较为复杂的图更加容易,并且不需要什么设置就能绘制出更为美观的图。也就是其官方语make a well-defined set of hard things easy,本质上,它就是matplotlib的高阶接口。
下面简单用一下seaborn来学习一下。大部分内容来自原教程。jupyter notebook文件可以在这里下载。
模块引用和数据集读取
这里我们需要用到几个模块来练习,它们分别是:
- pandas
- matplotlib
- seaborn
这里安装就不赘述了,Anconda和pip都可以安装。
我们用到的数据集是一个宠物小精灵数据集。
1 | # import所需库 |
1 | # 查看数据格式 |
Name | Type 1 | Type 2 | Total | HP | Attack | Defense | Sp. Atk | Sp. Def | Speed | Stage | Legendary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
# | ||||||||||||
1 | Bulbasaur | Grass | Poison | 318 | 45 | 49 | 49 | 65 | 65 | 45 | 1 | False |
2 | Ivysaur | Grass | Poison | 405 | 60 | 62 | 63 | 80 | 80 | 60 | 2 | False |
3 | Venusaur | Grass | Poison | 525 | 80 | 82 | 83 | 100 | 100 | 80 | 3 | False |
4 | Charmander | Fire | NaN | 309 | 39 | 52 | 43 | 60 | 50 | 65 | 1 | False |
5 | Charmeleon | Fire | NaN | 405 | 58 | 64 | 58 | 80 | 65 | 80 | 2 | False |
简单绘图
下面我们利用seaborn的的lmplot函数来绘制最基本的散点图。下面给出了两种方式,我们可以将数据集传进去,并给出x和y轴的字段,我们也可以单独给x和y传入数据。不过前者的方式更为推荐,因为不会出现x和y长度不一的情况。
1 | # 推荐方式 |
<seaborn.axisgrid.FacetGrid at 0x206dddd0eb8>
这里我们可以看到,这张图中自动生成了一条拟合直线,但是这在我们的数据集中没有意义。同时我们想根据宠物小精灵的阶段(‘Stage’字段)给散点染色,这时只要简单的设置两个参数如下:
1 | sns.lmplot(x='Attack', y='Defense', data=df, |
<seaborn.axisgrid.FacetGrid at 0x206df2da400>
利用matplotlib调整图形
前面说过了,seaborn是matplotlib的高阶接口,也就是我们利用seaborn生成的图表也能用matplotlib进行调整。例如,我们可以看到上图x/y轴的起点都不是0,而我们的数值(攻击力和防御力)必然都是非负的,同时我们又想给这张表加个标题。这时我们就可以利用matplotlib来做相应调整。
1 | # 绘图 |
<matplotlib.text.Text at 0x206df654f28>
加上pandas更好用
我们知道pandas是一个炒鸡好用的处理数据的模块,在用seaborn绘图时,我们加上pandas能够事半功倍。
例如我们想绘制一个箱式图,seaborn的默认图是这样的:
1 | sns.boxplot(data=df) |
<matplotlib.axes._subplots.AxesSubplot at 0x206df5909b0>
虽然能看出来些东西,但是显然Total,Stage和Legendary字段都没有意义,因此这里可以用pandas的DataFrame来进行取舍。
1 | # 创建新的DataFrame,舍去无用字段 |
<matplotlib.axes._subplots.AxesSubplot at 0x206df46c208>
淡妆浓抹 主题和颜色
为了使图表更加美观,seaborn提供了5种内置的主题,分别是darkgrid
, whitegrid
,dark
,white
和ticks
。通过set_style
函数就可以设置。
你也可以设置自定义颜色,包括自定义循环色,渐变色等,具体可以参见文档
1 | sns.set_style('ticks') |
<matplotlib.axes._subplots.AxesSubplot at 0x206df9a2c50>
1 | pkmn_type_colors = ['#78C850', # Grass |
<matplotlib.axes._subplots.AxesSubplot at 0x206dfc9b2e8>
融合 melt
上面我们已经将攻击力的带分布散点图画出来了,当然我们可以为其他特征各画一幅图,但是更好的做法是将其融合起来。我们用pandas的melt
函数,它需要三个参数:需要融合的DataFrame,保留的变量(这些特征不会被融合,而其他的都会被融合),最后融合变量的名字。我们以妙蛙种子为例:
1 | # 融合前,妙蛙种子只有一行数据,包含了所有特征 |
Before melting
Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed
#
1 Bulbasaur Grass Poison 45 49 49 65 65 45
After melting
Name Type 1 Type 2 Stat value
0 Bulbasaur Grass Poison HP 45
151 Bulbasaur Grass Poison Attack 49
302 Bulbasaur Grass Poison Defense 49
453 Bulbasaur Grass Poison Sp. Atk 65
604 Bulbasaur Grass Poison Sp. Def 65
755 Bulbasaur Grass Poison Speed 45
接下来我们就来绘制所有特征散点图融合的图表:
1 | sns.swarmplot(x='Stat', y='value', data=melted_df, |
<matplotlib.axes._subplots.AxesSubplot at 0x206dffc6a90>
这样一看,明显图比较杂乱,我们再做一些改进:
1 | # 1. 把图放大一些,长10inches,高6inches |
<matplotlib.legend.Legend at 0x206e109add8>
各类其他图表
相关性热力图
1 | # 计算相关性 |
<matplotlib.axes._subplots.AxesSubplot at 0x206e1499c88>
直方图
1 | # 攻击力分布图 |
<matplotlib.axes._subplots.AxesSubplot at 0x206dfd44c88>
柱状图
1 | # 计数柱状图 |
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]),
<a list of 15 Text xticklabel objects>)
因子图
利用因子图,我们可以很容易的将不同的类别的数据的图分割开来。
1 | # 因子图 |
<seaborn.axisgrid.FacetGrid at 0x206e00033c8>
密度图
1 | sns.kdeplot(df.Attack, df.Defense) |
<matplotlib.axes._subplots.AxesSubplot at 0x206e16e7940>
联合分布图
1 | sns.jointplot(x='Attack', y='Defense', data=df) |
<seaborn.axisgrid.JointGrid at 0x206e1a87748>
好了,就先学这么多了,更加细枝末节的东西等到要用到了再去翻文档好了。