首先,如果要我用一张图来为seaborn打call,我一定会选择下面这张
import matplotlib.pyplot as plt
import seaborn as sns
ax = sns.violinplot(x=[1,2,3,4,5,6,2,2,2,2])
plt.show()
这图有非常好听的名字,叫Violinplots(小提琴图),是箱线图和内核密度估计值的组合。不过看着高大上,但在数据量少的时候并不实用,反而会误导人。
本文讲的是seaborn,它是一个基于matplotlib的python数据可视化库。
我认为这个库主要实现了两个功能:
- 创建了各种绚丽的样式,算是无审美青年的福音,但是matplotlib以及集成了许多seaborn样式,所以为了style而单独安装seaborn库显得没啥意义;
- 简化绘图的步骤,将一些基本的拟合算法与绘图函数封装了一下,对新手比较友好,但对熟悉matlib和numpy的人来说反而会觉得有点限制。
下面可以查看所有内置的包括但不限于seaborn风格,并且随机挑选了4个进行展示(个人觉得没传统的好看)。
input:print(plt.style.available)
output:
['bmh', 'classic', 'dark_background', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright',
'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep',
'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk',
'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn']
闲话不多说,要上机操作,先安装一下模块
pip install seaborn
对于seaborn,我印象比较深的是可视化线性关系与可视化数据集分布,这两种图对新手还是比较友好的,类似SPSS,不需要自己写一大堆函数进行迭代,然后plot出来。现以一次方程为例讲解线性关系图(多项式,logistic均可),因为觉得例程数据不容易理解,所以我们使用自己构造的数据。
import pandas as pd
#灰色的窗口就是它造成的
sns.set(color_codes=True)
#设数据长度是100
N=100
#随机生成100个a,再生成b=2*a+噪声
list=[]
for i in range(N):
a = np.random.rand()
b = 2 * a + np.random.rand()
list.append([a,b])
#生成DataFrame
df=pd.DataFrame(list,columns=['x','y'])
#画含有点,一阶拟合曲线,以及置信区间的图像
sns.lmplot(x='x',y='y',data=df)
plt.show()
当数据非常复杂的时候,一个因变量可能受多个自变量的影响。我们用以下函数生成一个数据集(工资计算公式是我自己乱编的)
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
sns.set(color_codes=True)
#样本数
N=1000
list=[]
#生成N个调查对象
for i in range(N):
#公司分别为是鸭店,国企,互联网
company=['duck','soe','net'][np.random.randint(0,3)]
#学历0代表低学历,1代表高学历
qualification=np.random.randint(0,2)
#性别1代表男,0代表女
sex=np.random.randint(0,2)
#工作时间为1~10之间
time = np.random.randint(1,10)
#不同公司有不同的工资计算方式,
# 鸭店工资最高的是刚入职的男人,年龄越大工资越低
#国企主要看时间与学历
#互联网公司主要看学历
if company=='duck':
if sex==1:
salary = 30*sex-3*time+6*np.random.rand()
else:
salary =15+6*np.random.rand()
elif company=='soe':
salary = (3+2*qualification)*time+6*np.random.rand()
else:
salary = 2*time+10*qualification + 5+10*np.random.rand()
#将个体的数据放在一起
person=[time,salary,qualification,sex,company]
#每个人的数据在列表里装好
list.append(person)
#将数据转化为DataFrame,lmplot的data只接受这种格式
df=pd.DataFrame(list,columns=['time','salary','qualification','sex','company'])
如果依然只绘制简单的x-y图,图片会是下面这个样子,我们只能得出一些没啥用的结论,比如总体上收入随着工作时间的增长而增长但离散性很大等等。
#x轴为time,y轴为salary,使用数据集df
sns.lmplot(x='time',y='salary',data=df)
plt.show()
但是,我们把图画成下面的样子就完全不同了,我们可以很清晰的分析出各个因素对工资的影响,从而确定职业规划,比如,先做3年鸭子。
#hue是图例,在本程序中,图例是公司,在图片上会体现为3种不同颜色的曲线
#row为性别,性别有(0,1)两种,所以生成的图片会有两行窗口,一行只包含sex=0的数据
#col为学历,学历有(0,1)两种,所以生成的图片会有两列窗口,一列只包含qualification=0的数据
#因此生成的图片会有2x2个窗口
sns.lmplot(x='time',y='salary',hue='company',row='sex',col='qualification',data=df)