数据分析——Seaborn数据可视化

编辑器:jupyter notebook

Seaborn 是一个基于matplotlib的 Python 数据可视化库。它提供了一个高级界面,用于绘制有吸引力且信息丰富的统计图形。

一、简单图标

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

plt.figure(figsize=(4, 3))
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
plt.bar(x, y)
plt.show()

1.  Seaborn风格

  • darkgrid: 灰色网格, 默认
  • whitegrid: 白色网格
  • dark: 灰色背景
  • white: 白色背景
  • ticks:白色背景,带刻度线
sns.set_style('whitegrid')
plt.figure(dpi=200)
sns.barplot(x=x,y=y)

 

df = pd.read_excel('data/plot.xlsx',sheet_name='penguins')
df.head()

plt.figure(dpi=200)
sns.ecdfplot(data=df,x='鳍肢长度')
plt.show

二、折线图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='line')
df.head()

1.  relplot绘制折线图

# 该函数通过plt.figure不能修改分辨率,但是支持导出设置分辨率
sns.relplot(x='学号',y='语文',kind='line',data=df)
plt.ylim(0,110)
plt.savefig('figure/1relplot绘制折线图.png',dpi=300)
plt.show()

2.  lineplot绘制折线图

2.1  单个折线图

plt.figure(dpi=200)
sns.lineplot(x='学号',y='语文',data=df)
plt.ylim(0,110)
plt.savefig('figure/21lineplot绘制折线图.png',dpi=300)
plt.show()

2.2  多个折线图

tb = df[['姓名','语文','数学','英语']]
tb = tb.set_index('姓名')
tb

plt.figure(dpi=200)
sns.lineplot(data=tb,markers=True)   # markers=True 添加标记点
plt.ylim(0,110)  # 设置y轴的刻度范围
plt.show()

三、直方图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='hist')
df.head()

 

1.  distplot绘制直方图

  • 官方即将弃用
plt.figure(dpi=200)
sns.distplot(df['分数'])
plt.show()

 

2.  displot绘制直方图

# plt.figure()不能调节分辨率,但是导出可以
sns.displot(df['分数'])
plt.show()

3.  histplot绘制直方图

  • 推荐方法
plt.figure(dpi=200)
sns.histplot(data=df['分数'],kde=True,bins=range(40,120,10))
sns.rugplot(data=df['分数'])  # 添加地毯图
plt.show()

 

 四、条形图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

1.  barplot绘制条形图

  • 切换xy轴则为柱形图
df = pd.read_excel('./data/plot.xlsx', sheet_name='barplot')
df.head()

 

plt.figure(dpi=200)
sns.barplot(data=df,x='采购数量',y='门店',hue='品类',estimator=np.sum,ci=False)    # hue 图例;  estimator默认求平均值; ci自信区间
plt.show()

plt.figure(dpi=200)
sns.barplot(data=df,y='采购数量',x='门店',hue='品类',estimator=np.sum,ci=False)    # hue 图例;  estimator默认求平均值; ci自信区间
plt.show()

2.  countplot绘制频数图

tips = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
tips.head()

plt.figure(dpi=200)
sns.countplot(data=tips,x='用餐时刻',hue='是否吸烟')
plt.show()

plt.figure(dpi=200)
sns.countplot(data=tips,y='用餐时刻',hue='是否吸烟')
plt.show()

3.  pointplot绘制点图

plt.figure(dpi=200)
sns.pointplot(data=tips,x='星期',y='小费',order=['周四','周五','周六','周日'])    # order 设置x轴顺序
plt.show()

五、散点图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
df.head()

1.  scatterplot绘制散点图

plt.figure(dpi=200)
sns.scatterplot(
    data=df,
    x='总消费',
    y='小费',
    hue='性别',
    style='性别',   # 标记字段样式
    markers={'男性':'o','女性':'*'},   # 指定标记样式
    palette={'男性':'blue','女性':'green'}   # 指定标记颜色
)
plt.show()

2.  stripplot绘制散点图

plt.figure(dpi=200)
sns.stripplot(
    data=df,
    x='星期',
    y='总消费',
    hue='性别',
    order=['周四','周五','周六','周日'],
    dodge=True,  # 将男女分开展示
    jitter=0.2,  # 将点之间散开一点
)
plt.legend(ncol=2)  # 将图例设置为两列
plt.show()

3.  swarmplot绘制散点图

plt.figure(dpi=200)
sns.swarmplot(data=df,
             x='星期',
             y='总消费',
             order=['周四','周五','周六','周日']
             )
plt.show()

六、线性回归模型

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
df.head()

1.  lmplot绘制线性回归模型

# 不支持 plt.figure 设置 dpi
sns.lmplot(data=df,x='总消费',y='小费')
plt.show()

2.  regplot绘制线性回归模型

plt.figure(dpi=200)
sns.regplot(data=df,x='总消费',y='小费')
plt.show()

3.  lmplot绘制线性回归模型-多子图

sns.lmplot(data=df,
           x='总消费',
           y='小费',
           hue='是否吸烟',   # 设置图例
           col='用餐时刻',   # 总图的列字段
           row='性别',      # 总图的行字段
          )
plt.show()

4.  residplot绘制残差图

# 残差(统计学称误差):实际值与估计值(拟合值,回归方程y=kx+b的y值)之间的差
# 偏差:与均值的差
plt.figure(dpi=200)
sns.residplot(data=df,x='总消费',y='小费')
plt.show()

df.head()

from sklearn.linear_model import LinearRegression

# 实例化线性回归模型
lr = LinearRegression()

x,y = df[['总消费']],df[['小费']]

# 训练模型
lr.fit(x,y)

# 查看系数(k)
lr.coef_      # array([[0.10502452]])

# 查看截距(b)
lr.intercept_    # array([0.92026961])

# 设置测试值(x值)
pre_x = pd.DataFrame({'总消费':[20]})   # 二维

# 预测小费(y值)
lr.predict(pre_x)    # array([[3.02075996]])

七、箱线图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
df.head()

1.  boxplot绘制箱线图

plt.figure(dpi=200)
sns.boxplot(
    data=df,
    x='星期',
    y='总消费',
    hue='用餐时刻',
    order=['周四','周五','周六','周日'],
    hue_order=['午餐','晚餐'],
    whis=1.5,  # 基于几倍的四分位距(IQR)来检测异常值
)
    
plt.show()

2.  boxenplot绘制箱线图

  • 增强版箱线图
  • 主要为大数据集提供,更多的分位数
plt.figure(dpi=200)
sns.boxenplot(
    data=df,
    x='星期',
    y='总消费',
    order=['周四','周五','周六','周日']
)
    
plt.show()

 

八、核密度图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='iris')
df.head()

1.  何为核密度图

  • 核密度估计图主要是为了观测数据样本的分布特征
  • 核密度是概率论中用于估计未知的密度函数

2.  绘制核密度图

plt.figure(dpi=200)
sns.kdeplot(x=df['萼片长度'],shade=True,color='blue')
sns.kdeplot(x=df['萼片宽度'],shade=True,color='red')
plt.xlabel('萼片长度&萼片宽度')
plt.legend(['萼片长度','萼片宽度'])
plt.show()

 

3.  绘制边际核密度图

  • 又称等高线
plt.figure(dpi=200)
# sns.kdeplot(x=df['萼片长度'],y=df['萼片宽度'],shade=True)
sns.kdeplot(data=df,x='萼片长度',y='萼片宽度',shade=True)
plt.show()

 

九、提琴图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
df.head()

 

1.  何为提琴图

  • 提琴图:箱线图+核密度估计图
  • 不仅可以观测数据的集中趋势和离散程度
  • 还可以观测数据的分布形状

2.  violinplot绘制提琴图

plt.figure(dpi=200)
sns.violinplot(data=df,x='星期',y='总消费',hue='用餐时刻',order=['周四','周五','周六','周日'])
plt.legend(loc='lower right',fontsize=8)
plt.show()

 

  • split
  • order
  • hue_order
plt.figure(dpi=200)
sns.violinplot(data=df,x='星期',y='总消费',split=True,hue='性别',order=['周四','周五','周六','周日'],hue_order=['男性','女性'])
plt.legend(loc='upper left',fontsize=8)
plt.show()

 

3.  catplot绘制提琴图-多子图

sns.catplot(
    kind='violin',
    data=df,
    x='星期',
    y='总消费',
    col='用餐时刻',
    row='性别',
    order=['周四','周五','周六','周日']
)
plt.show()

十、多子图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

1.  FacetGrid绘制多子图

  • 分组多子图
  • 类方法
tips = pd.read_excel('./data/plot.xlsx', sheet_name='tips')
tips.head()

 

# 创建对象
g = sns.FacetGrid(data=tips,col='性别',hue='是否吸烟')
# 定义图类型
g.map(sns.scatterplot,'总消费','小费')
# 添加图例
g.add_legend()
plt.show()

# 创建对象
g = sns.FacetGrid(data=tips,col='星期')
# 定义图类型
g.map(sns.barplot,'性别','总消费',order=['男性','女性'])
plt.show()

 2.  pairplot绘制多子图

  • 配对多子图
iris = pd.read_excel('./data/plot.xlsx', sheet_name='iris')
iris.head()

sns.pairplot(data=iris,hue='物种')
plt.show()

 

3.  PairGrid绘制多子图 

  • 配对多子图
  • 类方法
# 实例化对象
g = sns.PairGrid(data=iris,hue='物种')
# 设置图类型
g.map_upper(sns.scatterplot)  # 上三角图类型
g.map_diag(sns.kdeplot)      # 对角线图类型
g.map_lower(sns.kdeplot)   # 下三角
# 添加图例
g.add_legend()
plt.show()

 

 4.  jointplot绘制多子图

  • 联合多子图
penguins = pd.read_excel('./data/plot.xlsx', sheet_name='penguins')
penguins.head()

 

sns.jointplot(data=penguins,x='鸟喙长度',y='鸟喙深度',hue='物种')
plt.show()

sns.jointplot(kind='kde',data=penguins,x='鸟喙长度',y='鸟喙深度',hue='物种')
plt.show()

5.  JointGrid绘制多子图

  • 联合多子图
  • 类方法
# 实例化对象
g = sns.JointGrid(data=penguins,x='鸟喙长度',y='鸟喙深度')
# 设置图类型
# g.plot(joint_func, marginal_func, **kwargs) ——————> joint_func: 内部图类型 ; marginal_func: 外部图类型
g.plot(sns.regplot,sns.boxplot)
plt.show()

 

# 实例化对象
g = sns.JointGrid(data=penguins,x='鸟喙长度',y='鸟喙深度',hue='物种')
# 设置图类型
# g.plot(joint_func, marginal_func, **kwargs) ——————> joint_func: 内部图类型 ; marginal_func: 外部图类型
g.plot(sns.scatterplot,sns.histplot)

plt.show()

十一、组合图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='combine')
df.head()

 

x,y1,y2 = df['月份'],df['销量'],df['转化率']
plt.figure(dpi=200)
plt.bar(x=x,height=y1)
plt.ylabel('销量')
plt.title('1-6月的销量及转化率趋势')
for a,b in zip(x,y1):
    plt.text(x=a,y=b,s=b,ha='center')
# 共享x轴,添加一个y轴
plt.twinx()   # 加入次代码后,后边的代码都是基于此轴操作
plt.plot(x,y2,color='g',marker='o')
plt.ylim(0,1)
plt.ylabel('转化率')
for a,b in zip(x,y2):
    plt.text(x=a,y=b+0.04,s='{:.1%}'.format(b),ha='center',fontsize=8)
plt.show()

十二、堆积柱形图 

x,y1,y2 = tb.index,tb['办公'],tb['生活']
plt.figure(dpi=200)
plt.bar(x,y1,label='办公')
# bottom 实现堆积操作
plt.bar(x,y2,label='生活',bottom=y1)
plt.title('各区销售额的堆积柱形图')
plt.xlabel('地区')
plt.ylabel('销售额')
plt.legend()

# 添加办公的数据标签
for a,b, in zip(x,y1):
    plt.text(x=a,y=b,s='{:.0f}万'.format(b/10000),ha='center',va='top')
    
# 添加生活的数据标签
for a,b,c in zip(x,y1,y2):
    plt.text(x=a,y=b+c,s='{:.0f}万'.format(c/10000),ha='center')
    
plt.show()

十三、矩阵图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='iris')
df.head()

   heatmap绘制热力图

# 相关系数
data = df.corr()
data

plt.figure(dpi=200)
sns.heatmap(data=data,cmap='Blues',annot=True,fmt='.2f')
plt.show()

  • 2
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值