python数据分析 | seaborn绘图学习

1 seaborn介绍和安装

(1)介绍:Seaborn 是一个基于 matplotlib 且数据结构与 pandas 统一的统计图制作库。他提前已经定义好了一套自己的风格。然后也封装了一系列的方便的绘图函数,之前通过matplotlib需要很多代码才能完成的绘图,使用seaborn可能就是一行代码的事情。

(2)安装

  1. 通过pip :pip install seaborn
  2. 通过anaconda: conda install seaborn

(3)内容包括

  1. 关系型绘图
  2. 分类型绘图
  3. 分布型绘图
  4. 线性关系绘图

(4)导入包
import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt

(5)导入示例数据

# 读取seaborn自带数据
tips = sns.load_dataset("tips")  # 方法1
# tips = pd.read_csv("./seaborn-data-master/tips.csv") # 方法2

2 关系型绘图

(1)介绍:seaborn.relplot()以用来表示多个变量之间的关联关系。默认情况下是绘制散点图,也可以绘制线性图,具体绘制什么图形是通过kind参数来决定的。

(2)语法: 通过示例介绍语法使用 sns.regplot( x, y, data=None, x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, seed=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, truncate=True, dropna=True, x_jitter=None, y_jitter=None, label=None, color=None, marker='o', scatter_kws=None, line_kws=None, ax=None, )

(3)使用

# (2-1)基本使用
"""
x --> 代表x轴数据,选择tips中的"total_bill"
y --> 代表y轴数据,选择tips中的"tip"
data --> 数据集
kind --> 选择绘图类型 默认为scatter,还有line等
"""
sns.relplot(x="total_bill",y="tip",data=tips,kind="scatter")

在这里插入图片描述

# (2-2)进阶使用1:分情况分析
"""
hue参数:用来控制第三个变量的颜色显示的。
"""
"""
周几外出吃饭人比较多?
通过点的颜色 来表示 日期
hue:分组后不同值显示不同颜色
"""
sns.relplot(x="total_bill",y="tip",data=tips,hue="day")
tips.groupby(by="day").count()

在这里插入图片描述

# (2-3)进阶使用2:分类分析
"""
col和row,可以将图根据某个属性的值的个数分割成多列或者多行。
# col:从列的方向添加子图表示分类
# row:从行的方向添加子图表示分类
"""

# 晚餐 女性, 晚餐 男性, 午餐 女性, 午餐 男性
sns.relplot(x="total_bill",y="tip",data=tips,col="time",row="sex")

在这里插入图片描述

# (2-4)进阶使用3:位置摆放,形状设值
"""
col_wrap:当图形展示多个时,控制指定多少列进行换行。注意:不能与row同时使用。
 size:指定的列进行分组,然后通过数据的大小来表示点的大小。
"""
sns.relplot(x="total_bill",y="tip",data=tips,col="day",col_wrap=2,size="size")
plt.show()

在这里插入图片描述

# (2-5)进阶使用4:绘制折线图
"""
col_wrap:当图形展示多个时,控制指定多少列进行换行。注意:不能与row同时使用。
 size:指定的列进行分组,然后通过数据的大小来表示点的大小。
"""
# 导入数据
fmri = sns.load_dataset("fmri")  # 方法1
# fmri = pd.read_csv("./seaborn-data-master/fmri.csv")# 方法2
fmri.info()
fmri.head()
# 阴影部分表示置信区间
# 体现 signal与timepoint的变化关系
sns.relplot(x="timepoint",y="signal",data=fmri,kind="line")

在这里插入图片描述

# 指定ci=None 取消置信区间的显示
sns.relplot(x="timepoint",y="signal",data=fmri,kind="line",ci=None)
# 不同地区不同颜色
sns.relplot(x="timepoint",y="signal",data=fmri,kind="line",hue="region")
# 分事件表示不同地区不同颜色
sns.relplot(x="timepoint",y="signal",data=fmri,kind="line",hue="region",col="event")

在这里插入图片描述

# (2-6)进阶使用6:图形选择
"""
具体绘制什么图形是通过kind参数来决定的。实际上以下两个函数就是relplot的特例:
• 散点类型:scatterplot -> relplot(kind="scatter")
• 线性类型:lineplot -> relplot(kind="line")

# 注意:scatterplot、lineplot与relplot区别:无kind参数,无col,row参数
# sns.lineplot(x="timepoint",y="signal",data=fmri)
"""
# sns.scatterplot(x="timepoint",y="signal",data=fmri,hue="region",col="event") # 报错

3 分类绘图

(1)介绍:分类图的绘制,采用的是sns.catplot来实现的。cat是category的简写。这个方法默认绘制的是分类散点图,如果想要绘制其他类型的图,同样也是通过kind参数来指定。

(2)分类:分类散点图、分类分布图、分类统计图

3.1 分类散点图

分类散点图比较适合数据量不是很多的情况,他是用catplot来实现,但是也有以下两个特别的方法。

  • stripplot():catplot(kind=“strip”) 默认的
  • swarmplot():catplot(kind=“swarm”)
# 不同日期 的 总金额 数量 
sns.catplot(x="day",y="total_bill",data=tips,kind="strip")

在这里插入图片描述

# 不同日期 的 总金额 数量  -- 性别分颜色展示
sns.catplot(x="day",y="total_bill",data=tips,hue="sex",kind="strip")
# 等同于
sns.stripplot(x="day",y="total_bill",data=tips,hue="sex")

在这里插入图片描述

"""
数据量比较大,不适用kind="swar"
"""
sns.catplot(x="day",y="total_bill",data=tips,hue="sex",kind="swarm")
# 等同于
sns.swarmplot(x="day",y="total_bill",data=tips,hue="sex")

在这里插入图片描述

3.2 分类分布图

分类分布图,主要是根据分类来看,然后在每个分类下数据的分布情况。也是通过catplot来实现,以下三个方法分别是不同的kind参数:

  • 箱型图:boxplot() (with kind=“box”)
  • 小提琴图:violinplot() (with kind=“violin”)
# 读取运动员数据
athletes = pd.read_csv("athlete_events.csv")
athletes.info()
athletes.head()

在这里插入图片描述

countries = {
    'CHN':'中国',
    'JPN':"日本",
    'KOR':'韩国',
    'USA':"美国",
    'CAN':"加拿大",
    'BRA':"巴西",
    'GBR':"英国",
    'FRA':"法国",
    'ITA':"意大利",
    'ETH':"埃塞俄比亚",
    'KEN':"肯尼亚",
    'NIG':"尼日利亚",
}
"""
1.选择在countries国家的数据
- 判断国家在countries.keys()列表中,就选择出来
"""
my_athletes = athletes[athletes["NOC"].isin(list(countries.keys()))]
my_athletes.info()
"""
箱型图
"""
sns.boxplot(x="NOC",y="Height",data=my_athletes)
plt.show()

在这里插入图片描述

"""
小提琴图
- 默认两边对称 kde曲线 核密度估计曲线 
采用小费支付数据
"""
# 日期 与 小费
sns.violinplot(x="day",y="total_bill",data=tips)

在这里插入图片描述

# 分性别,且分两边显示
sns.violinplot(x="day",y="total_bill",data=tips,hue="sex",inner="quartile",split=True)

在这里插入图片描述

3.3 分类统计图

分类统计图,则是根据分类,统计每个分类下的数据的个数或者比例。有以下几种方式:

  • 条形图:barplot() (with kind=“bar”)
  • 柱状图:countplot() (with kind=“count”)
  • 点线图:pointplot() (with kind=“point”)
"""
条形图
seaborn中的条形图具有统计功能,可以统计出比例,平均数,也可以按照你想要的统计函数来统计。
"""
# 黑色线:置信区间,越长数据就越离散
sns.catplot(x="day",y="total_bill",data=tips,kind="bar")
# 系统自带的营救数据
titanic = pd.read_csv("./seaborn-data-master/titanic.csv")
titanic.head()

在这里插入图片描述

# 获救男女的情况
# sum指定的频数
sns.catplot(x="sex",y="survived",data=titanic,kind="bar",estimator=sum)

在这里插入图片描述

"""
柱状图:是专门用来统计某个单一变量出现数量的图形
kind为count时,只能有x或者y,如果同时指定x与y就会报错
因为柱状图时统计的个数
- x是柱状图
- y是横条形图
"""
sns.catplot(y="survived",data=titanic,kind="count")

在这里插入图片描述

"""
点线图:可以非常方便的看到变量之间的趋势变化
"""
# 舱位与营救男女的关系
sns.catplot(x="sex",y="survived",data=titanic,kind="point",hue="class")

在这里插入图片描述

3.4 分布绘图

分布绘图主要分为单变量分布以及二变量分布和pairplot

"""
单变量分布
单一变量主要就是通过直方图来绘制。
在seaborn中直方图的绘制采用的是distplot,其中dist是distribution的简写,不是histogram的简写
"""

"""
kde=False 不显示kde线
bins=30 指定组数
rug=True 越密集则数据越集中
hist=False 不展示直方图
"""
# titanic.info()   # 说明age列是有缺失值

# 取出非nan的数据
age_ti = titanic[~np.isnan(titanic["age"])]
# age_ti.info()

# 所有人的年龄分布情况
sns.distplot(age_ti["age"],kde=False,bins=30,rug=True)   # 在绘制直方图的时候,最好去除nan的值
"""
二变量分布
多变量分布图可以看出两个变量之间的分布关系。
一般都是采用多个图进行表示。多变量分布图采用的函数是jointplot。
通过设置kind='reg'可以设置回归绘图和核密度曲线
通过设置kind='hex'可以绘制六边形图
"""
sns.jointplot(x="total_bill",y="tip",data=tips)
# kind参数 指定为 reg 的时候,会展示出回归线以及kde曲线
sns.jointplot(x="total_bill",y="tip",data=tips,kind="reg")

在这里插入图片描述

"""
jointplot其它常用参数
1. x,y,data:绘制图的数据。
2. kind:scatter、reg、resid、kde、hex。
3. color:绘制元素的颜色。
4. height:图的大小,图会是一个正方形。
5. ratio:主图和副图的比例,只能为一个整形。
6. space:主图和副图的间距。
7. dropna:是否需要删除x或者y值中出现了NAN的值。
8. marginal_kws:副图的一些属性,比如设置bins、rug等
"""
# 设置kind='hex'可以绘制六边形图 用颜色表示集中情况  中国运动员身高和体重数据
china_ath = athletes[athletes["NOC"]=="CHN"]
sns.jointplot(x="Height",y="Weight",data=china_ath,kind="hex",gridsize=20,color="r",height=20,marginal_kws={"kde":True})

在这里插入图片描述

"""
pairplot:
默认情况下,对角线的图(x和y轴的列相同)是直方图,其他地方的图是散点图,
如果想要修改这两种图,可以通过diag_kind和kind来实现。其中这两个参数可取的值为:
1. diag_kind:auto, hist, kde。
2. kind:scatter, reg。
"""

# iris 
iris = pd.read_csv("./seaborn-data-master/iris.csv")
iris.head()

在这里插入图片描述

sns.pairplot(iris,vars=["sepal_length","sepal_width","petal_length","petal_width"],kind="scatter",diag_kind="hist")

在这里插入图片描述

4 线性回归绘图

线性回归图可以帮助我们看到数据的关系趋势。在seaborn中可以通过regplot和lmplot两个函数来实现。regplot的x和y可以为Numpy数组、Series等变量。而lmplot的x和y则必须为字符串,并且data的值不能为空:

  1. regplot(x,y,data=None)
  2. lmplot(x,y,data)
# sns.regplot(x="total_bill",y="tip",data=tips)  # 字符串指定列,指定数据来源
sns.regplot(x=tips["total_bill"],y=tips["tip"])  # 数据标签获取到的列

在这里插入图片描述

sns.lmplot(x="total_bill",y="tip",data=tips)   # 字符串,可以
# sns.lmplot(x=tips["total_bill"],y=tips["tip"])   # 不支持数据标签获取列的这种形式 报错 

在这里插入图片描述

5 综合

"""
读取数据 重置索引
将单价列取出 整数 或 浮点数 并转为可计算类型
将评分列进行降序
直观体现评分数据主要分布在哪个区间
直观体现单价与评分的分布
取出评分前100条数据 直观体现不同出版社的出书次数
"""
db_read = pd.read_excel("豆瓣读书.xlsx",index_col=0)
db_read.info()
db_read

在这里插入图片描述

# 重置索引
db_read.reset_index(drop=True,inplace=True)
"""
解决单位问题:
- 思路1:将单位替换为空字符串
"""
# db_read["单价"] = db_read["单价"].str.replace("元","")
# db_read["单价"] = db_read["单价"].str.replace("元","")
# db_read
# db_read["单价"].astype("float")

"""
- 思路2:匹配出浮点数

需求:去字符串中匹配部分符合条件的子字符串
实现:
(1)
- 使用正则(re)
- pandas中Series每行字符串对接的正则方法:Series.str.extract(pattern)
- 提取 浮点数或者整数 pattern:数值.数值   
    - \d 匹配数值
    - +  贪婪匹配(匹配多个符合条件的)
    - \. 匹配出小数点
    - () 分组
    - |  或
(2)得到两列,以第二列的值填充第一列缺失值 .fillna(axis=1,method="bfill")
"""
db_read["单价"] = db_read["单价"].str.extract("(\d+\.\d+)|(\d+)").fillna(axis=1,method="bfill")[0]
db_read
db_read["单价"] = db_read["单价"].astype("float")
db_read.info()

在这里插入图片描述

# 将评分列进行降序
desc_data = db_read.sort_values(by="评分",ascending=False)
desc_data
# 设置显示中文
sns.set(rc={"font.sans-serif":"SimHei"})
# 直观体现评分数据主要分布在哪个区间
sns.distplot(db_read["评分"])

在这里插入图片描述

# 直观体现单价与评分的分布
sns.jointplot(x="单价",y="评分",data=db_read)

在这里插入图片描述

# 取出评分前100条数据 直观体现不同出版社的出书次数
top_100 = desc_data.iloc[:100,:]
sns.catplot(x="出版社",data=top_100,kind="count",height=10)
plt.xticks(rotation=90)
plt.show()

在这里插入图片描述

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
除了机器学习Python数据分析项目还可以使用以下技术和工具: 1. 数据清洗和预处理:在数据分析项目中,数据往往需要进行清洗和预处理,以去除噪声、处理缺失值、处理异常值等。Python提供了多种库和工具,如Pandas、NumPy和Scikit-learn,可以方便地进行数据清洗和预处理。 2. 可视化:可视化是数据分析中非常重要的一环。Python中的Matplotlib、Seaborn和Plotly等库提供了丰富的绘图功能,可以帮助用户将数据以直观的方式展示出来,从而更好地理解数据和发现模式。 3. 统计分析:Python中的SciPy和Statsmodels库提供了丰富的统计分析工具,如假设检验、方差分析、回归分析等。这些工具可以帮助用户进行数据的统计描述和推断分析。 4. 数据库操作:对于大规模数据的分析项目,可能需要将数据存储在数据库中,并进行查询和操作。Python中的SQLAlchemy和pymysql等库可以方便地与各种关系型数据库进行交互。 5. 文本挖掘和自然语言处理:对于包含文本数据的项目,可以使用Python中的NLTK和SpaCy等库进行文本挖掘和自然语言处理,如文本分类、情感分析、实体识别等。 6. 时间序列分析:对于时间序列数据的分析,Python中的Pandas和Statsmodels库提供了丰富的时间序列分析功能,如时间序列预测、季节性分析等。 7. Web开发和部署:如果需要将数据分析项目部署为Web应用,可以使用Python中的Django、Flask和FastAPI等框架进行Web开发,将数据可视化和分析结果展示在网页上。 这些只是数据分析项目中常用的一些技术和工具,根据具体的需求和场景,还可以使用其他的库和工具来完成数据分析任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值