Python数据可视化:Seaborn入门与实践

Seaborn

概述

Seaborn是一个基于 Matplotlib 的 Python 数据可视化库,专注于统计图表的绘制。它提供了更高级的接口和更美观的默认样式,非常适合用于数据分析和探索性数据分析(EDA)。

官方文档:Seaborn

中文文档:Seaborn

环境准备

安装Seaborn和Matplotlib:

Python 复制代码
pip install seaborn matplotlib

安装Pandas和NumPy:

python 复制代码
pip install pandas numpy

Seaborn基本使用

从Seaborn的核心功能和基本图表开始,了解Seaborn的基本语法以及掌握常用图表的绘制方法

环境准备

Seaborn自带一些示例数据集,非常适合练习。

python 复制代码
import seaborn as sns
import matplotlib.pyplot as plt

# 加载示例数据集
tips = sns.load_dataset("tips")
# 打印前5行数据
print(tips.head())

数据说明

tips是Seaborn 提供的一个示例数据集,记录了餐厅顾客的小费数据。

python 复制代码
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4

数据列说明

列名 类型 说明
total_bill 数值型(float) 账单总金额(美元)
tip 数值型(float) 顾客支付的小费金额(美元)
sex 分类变量(字符串) 顾客的性别,取值为 Male(男性)或 Female(女性)
smoker 分类变量(字符串) 顾客是否吸烟,取值为 Yes(吸烟)或 No(不吸烟)
day 分类变量(字符串) 顾客用餐的星期几,取值为 Thur(星期四)、Fri(星期五)、Sat(星期六)或 Sun(星期日)
time 分类变量(字符串) 用餐时间,取值为 Lunch(午餐)或 Dinner(晚餐)
size 数值型(int) 用餐人数

绘制散点图(Scatter Plot)

散点图用于显示两个连续变量之间的关系,适合观察变量之间的趋势、聚类或异常值。

python 复制代码
sns.scatterplot(x="total_bill", y="tip", data=tips)
plt.show()

绘制折线图(Line Plot)

折线图用于显示数据随时间的变化趋势。

python 复制代码
sns.lineplot(x="total_bill", y="tip", data=tips)
plt.show()

绘制柱状图(Bar Plot)

柱状图用于比较不同类别的数据。

python 复制代码
sns.barplot(x="day", y="total_bill", data=tips)
plt.show()

绘制直方图(Histogram)

直方图用于显示数据的分布。

python 复制代码
sns.histplot(tips["total_bill"], bins=20, kde=True)
plt.show()

Seaborn进阶使用

多图绘制(FacetGrid)

用于在同一画布上绘制多个子图。

python 复制代码
g = sns.FacetGrid(tips, col="time", row="smoker")
g.map(sns.scatterplot, "total_bill", "tip")
plt.show()

样式设置

Seaborn 提供了多种内置主题和颜色方案。

python 复制代码
sns.set_style("darkgrid")  # 设置样式
sns.set_palette("husl")    # 设置颜色
sns.scatterplot(x="total_bill", y="tip", data=tips)
plt.show()

回归图(Regression Plot)

回归图在散点图的基础上添加了一条回归线,用于显示变量之间的线性关系。

python 复制代码
# 设置画布大小
plt.figure(figsize=(8, 6))

# 绘制回归图
sns.regplot(x="total_bill", y="tip", data=tips, scatter_kws={"s": 50}, line_kws={"color": "red"})

# 添加标题和标签
plt.title("Regression Plot: Total Bill vs Tip", fontsize=14)
plt.xlabel("Total Bill ($)", fontsize=12)
plt.ylabel("Tip ($)", fontsize=12)

# 显示图表
plt.show()

直方图(Histogram)

直方图是显示数据分布的最常用方法之一。它将数据分成若干区间(bin),并统计每个区间内的数据数量。

python 复制代码
import seaborn as sns
import matplotlib.pyplot as plt

# 加载示例数据集
tips = sns.load_dataset("tips")

# 设置画布大小
plt.figure(figsize=(8, 5))

# 绘制直方图
# color="orange":设置曲线的颜色
# kde=True:添加核密度估计曲线,显示数据分布的平滑趋势
# color="skyblue":设置直方图的颜色
sns.histplot(tips["total_bill"], bins=20, kde=True, color="skyblue")

# 添加标题和标签
plt.title("Distribution of Total Bill", fontsize=14)
plt.xlabel("Total Bill", fontsize=12)
plt.ylabel("Frequency", fontsize=12)

# 显示图表
plt.show()

核密度估计图(Kernel Density Estimate, KDE)

KDE 是一种非参数方法,用于估计数据的概率密度函数。它比直方图更平滑,适合显示数据的整体分布。

python 复制代码
# 设置画布大小
plt.figure(figsize=(8, 5))

# 绘制 KDE 图
# shade=True:填充曲线下方的区域
# color="orange":设置曲线的颜色
sns.kdeplot(tips["total_bill"], color="orange", shade=True)

# 添加标题和标签
plt.title("Kernel Density Estimate of Total Bill", fontsize=14)
plt.xlabel("Total Bill", fontsize=12)
plt.ylabel("Density", fontsize=12)

# 显示图表
plt.show()

箱线图(Box Plot)

箱线图用于显示一个分类变量和一个连续变量之间的关系,适合比较不同类别的数据分布。

python 复制代码
# 设置画布大小
plt.figure(figsize=(8, 5))

# 绘制箱线图
# x="day":指定 x 轴为星期几
# y="total_bill":指定 y 轴为总账单金额
# palette="Set3":设置颜色方案
sns.boxplot(x="day", y="total_bill", data=tips, palette="Set2")

# 添加标题和标签
plt.title("Distribution of Total Bill by Day", fontsize=14)
plt.xlabel("Day", fontsize=12)
plt.ylabel("Total Bill", fontsize=12)

# 显示图表
plt.show()

小提琴图(Violin Plot)

小提琴图结合了箱线图和核密度估计图的优点,能够更直观地显示数据的分布和密度。

python 复制代码
# 设置画布大小
plt.figure(figsize=(8, 5))

# 绘制小提琴图
# x="day":指定 x 轴为星期几
# y="total_bill":指定 y 轴为总账单金额
# palette="Set3":设置颜色方案
sns.violinplot(x="day", y="total_bill", data=tips, palette="Set3")

# 添加标题和标签
plt.title("Violin Plot of Total Bill by Day", fontsize=14)
plt.xlabel("Day", fontsize=12)
plt.ylabel("Total Bill", fontsize=12)

# 显示图表
plt.show()

热力图(Heatmap)

热力图用于显示两个分类变量之间的关系,或者数值特征之间的相关性。

python 复制代码
# 使用 drop() 方法删除非数值列 'species',因为相关性计算只能针对数值数据
correlation = iris.drop(columns=["species"])
# 使用 corr() 方法计算剩余数值特征之间的相关性矩阵
correlation = correlation.corr()

# 设置画布大小
plt.figure(figsize=(8, 6))

# 绘制热力图
sns.heatmap(correlation, annot=True, cmap="coolwarm", fmt=".2f", linewidths=0.5)

# 添加标题
plt.title("Correlation Heatmap of Tips Dataset Features", fontsize=14)

# 显示图表
plt.show()

计数图(Count Plot)

计数图用于显示分类变量的频数分布。

python 复制代码
# 设置画布大小
plt.figure(figsize=(8, 6))

# 绘制计数图
sns.countplot(x="class", data=titanic, palette="Set3")

# 添加标题和标签
plt.title("Passenger Count by Class", fontsize=14)
plt.xlabel("Passenger Class", fontsize=12)
plt.ylabel("Count", fontsize=12)

# 显示图表
plt.show()

联合分布图(Joint Plot)

联合分布图可以同时显示两个变量的散点图和各自的分布(直方图或 KDE 图)。

python 复制代码
# 绘制联合分布图
# x="total_bill":指定 x 轴为总账单金额
# y="tip":指定 y 轴为小费金额
# kind="scatter":指定图表类型为散点图(其他选项包括 "kde" 和 "hex")
# height=6:设置图表的高度
sns.jointplot(x="total_bill", y="tip", data=tips, kind="scatter", height=6)

# 显示图表
plt.show()

多变量分布图(Pair Plot)

Pair Plot 可以显示数据集中多个变量之间的分布和关系,适合用于探索性数据分析。

python 复制代码
# 绘制多变量分布图
# hue="sex":按性别分组,用不同颜色表示
# palette="Set1":设置颜色方案
sns.pairplot(tips, hue="sex", palette="Set1")

# 显示图表
plt.show()

分析泰坦尼克号数据集(titanic)

环境准备

python 复制代码
# 导入必要的库
import seaborn as sns
import matplotlib.pyplot as plt

# 加载泰坦尼克号数据集
titanic = sns.load_dataset("titanic")
print(titanic.head())  # 查看数据集的前几行,了解数据结构

数据说明

titanic是Seaborn 提供的另一个经典示例数据集,记录了泰坦尼克号上乘客的信息,包括他们的生存状态、年龄、性别、舱位等级等。

python 复制代码
   survived  pclass     sex   age  sibsp  parch     fare embarked  class  \
0         0       3    male  22.0      1      0   7.2500        S  Third   
1         1       1  female  38.0      1      0  71.2833        C  First   
2         1       3  female  26.0      0      0   7.9250        S  Third   
3         1       1  female  35.0      1      0  53.1000        S  First   
4         0       3    male  35.0      0      0   8.0500        S  Third   

     who  adult_male deck  embark_town alive  alone  
0    man        True  NaN  Southampton    no  False  
1  woman       False    C    Cherbourg   yes  False  
2  woman       False  NaN  Southampton   yes   True  
3  woman       False    C  Southampton   yes  False  
4    man        True  NaN  Southampton    no   True  

数据列说明

列名 类型 说明
survived 数值型(int) 是否生存,取值为 0(未生存)或 1(生存)。
pclass 数值型(int) 舱位等级,取值为 1(头等舱)、2(二等舱)或 3(三等舱)。
sex 分类变量(字符串) 乘客性别,取值为 male(男性)或 female(女性)。
age 数值型(float) 乘客年龄(岁)。
sibsp 数值型(int) 乘客在船上的兄弟姐妹或配偶的数量。
parch 数值型(int) 乘客在船上的父母或子女的数量。
fare 数值型(float) 乘客票价(英镑)。
embarked 分类变量(字符串) 乘客登船港口,取值为 C(Cherbourg)、Q(Queenstown)、S(Southampton)。
class 分类变量(字符串) 舱位等级(与 pclass 相同,但为字符串形式),取值为 FirstSecondThird
who 分类变量(字符串) 乘客类别,取值为 man(男性成人)、woman(女性成人)、child(儿童)。
adult_male 布尔型(bool) 是否为成年男性,取值为 TrueFalse
deck 分类变量(字符串) 乘客所在甲板(A-G),部分数据缺失。
embark_town 分类变量(字符串) 乘客登船港口(与 embarked 相同,但为完整名称)。
alive 分类变量(字符串) 是否生存(与 survived 相同,但为字符串形式),取值为 noyes
alone 布尔型(bool) 乘客是否独自一人,取值为 TrueFalse

乘客生存率的柱状图

绘制一个柱状图,显示乘客的生存率(Survived)分布

python 复制代码
# 设置画布大小
plt.figure(figsize=(6, 4))

# 绘制柱状图
sns.countplot(x="survived", data=titanic, palette="Set2")

# 添加标题和标签
plt.title("Passenger Survival Count (0 = No, 1 = Yes)", fontsize=14)
plt.xlabel("Survived", fontsize=12)
plt.ylabel("Count", fontsize=12)

# 显示图表
plt.show()

代码说明:

python 复制代码
sns.countplot:用于绘制分类变量的计数柱状图。

x="survived":指定 x 轴为生存状态(0 表示未生存,1 表示生存)。

palette="Set2":设置颜色方案。

plt.title、plt.xlabel、plt.ylabel:添加标题和轴标签

不同舱位的票价分布

绘制一个箱线图,显示不同舱位(Pclass)的票价(Fare)分布

python 复制代码
# 设置画布大小
plt.figure(figsize=(8, 5))

# 绘制箱线图
sns.boxplot(x="pclass", y="fare", data=titanic, palette="Set3")

# 添加标题和标签
plt.title("Fare Distribution by Passenger Class", fontsize=14)
plt.xlabel("Passenger Class (Pclass)", fontsize=12)
plt.ylabel("Fare", fontsize=12)

# 显示图表
plt.show()

代码说明:

python 复制代码
sns.boxplot:用于绘制箱线图,显示数据的分布和离群值。

x="pclass":指定 x 轴为乘客舱位(1 = 头等舱,2 = 二等舱,3 = 三等舱)。

y="fare":指定 y 轴为票价。

palette="Set3":设置颜色方案。

年龄与生存率的关系

绘制一个直方图,显示不同年龄段的乘客生存率。

python 复制代码
# 设置画布大小
plt.figure(figsize=(10, 6))

# 绘制直方图,按生存状态分组
sns.histplot(data=titanic, x="age", hue="survived", bins=30, kde=True, palette="Set1")

# 添加标题和标签
plt.title("Age Distribution by Survival Status", fontsize=14)
plt.xlabel("Age", fontsize=12)
plt.ylabel("Count", fontsize=12)

# 显示图例
plt.legend(title="Survived", labels=["No", "Yes"])

# 显示图表
plt.show()

代码说明:

python 复制代码
sns.histplot:用于绘制直方图,显示数据的分布。

x="age":指定 x 轴为年龄。

hue="survived":按生存状态分组,用不同颜色表示。

bins=30:设置直方图的柱子数量。

kde=True:添加核密度估计曲线,显示数据分布的平滑趋势。

palette="Set1":设置颜色方案。

plt.legend:添加图例,说明颜色对应的生存状态。

分析鸢尾花数据集(iris)

环境准备

python 复制代码
# 导入必要的库
import seaborn as sns
import matplotlib.pyplot as plt

# 加载鸢尾花数据集
iris = sns.load_dataset("iris")
print(iris.head())  # 查看数据集的前几行,了解数据结构

数据说明

iris数据集(鸢尾花数据集)是机器学习和数据科学领域中最经典的数据集之一。

python 复制代码
   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa

数据列说明

列名 类型 说明
sepal_length 数值型(float) 花萼长度(厘米)。
sepal_width 数值型(float) 花萼宽度(厘米)。
petal_length 数值型(float) 花瓣长度(厘米)。
petal_width 数值型(float) 花瓣宽度(厘米)。
species 分类变量(字符串) 鸢尾花种类,取值为 setosaversicolorvirginica

不同种类的花瓣长度分布

绘制一个直方图,显示不同种类(species)的鸢尾花的花瓣长度(petal_length)分布

python 复制代码
# 设置画布大小
plt.figure(figsize=(10, 6))

# 绘制直方图,按种类分组
sns.histplot(data=iris, x="petal_length", hue="species", bins=30, kde=True, palette="Set1")

# 添加标题和标签
plt.title("Distribution of Petal Length by Species", fontsize=14)
plt.xlabel("Petal Length (cm)", fontsize=12)
plt.ylabel("Frequency", fontsize=12)

# 显示图例
plt.legend(title="Species")

# 显示图表
plt.show()

代码说明:

python 复制代码
sns.histplot:绘制直方图。

x="petal_length":指定 x 轴为花瓣长度。

hue="species":按种类分组,用不同颜色表示。

bins=30:将数据分成 30 个区间。

kde=True:添加核密度估计曲线,显示数据分布的平滑趋势。

palette="Set1":设置颜色方案。

plt.legend:添加图例,说明颜色对应的种类。

花萼长度与花瓣长度的关系

绘制一个散点图,显示花萼长度(sepal_length)与花瓣长度(petal_length)的关系,并按种类分组。

python 复制代码
# 设置画布大小
plt.figure(figsize=(10, 6))

# 绘制散点图,按种类分组
sns.scatterplot(x="sepal_length", y="petal_length", hue="species", data=iris, palette="Set2", s=100)

# 添加标题和标签
plt.title("Sepal Length vs Petal Length by Species", fontsize=14)
plt.xlabel("Sepal Length (cm)", fontsize=12)
plt.ylabel("Petal Length (cm)", fontsize=12)

# 显示图例
plt.legend(title="Species")

# 显示图表
plt.show()

代码说明:

python 复制代码
sns.scatterplot:绘制散点图。

x="sepal_length":指定 x 轴为花萼长度。

y="petal_length":指定 y 轴为花瓣长度。

hue="species":按种类分组,用不同颜色表示。

palette="Set2":设置颜色方案。

s=100:设置散点的大小。

plt.legend:添加图例,说明颜色对应的种类。

数据集中特征的相关性

绘制一个热力图,显示数据集中各个特征(如花萼长度、花瓣长度等)之间的相关性。

python 复制代码
# 使用 drop() 方法删除非数值列 'species',因为相关性计算只能针对数值数据
correlation = iris.drop(columns=["species"])
# 使用 corr() 方法计算剩余数值特征之间的相关性矩阵
correlation = correlation.corr()

# 设置画布大小
plt.figure(figsize=(8, 6))

# 绘制热力图
# 1. correlation:传入相关性矩阵作为热力图的数据
# 2. annot=True:在热力图的每个单元格中显示具体的数值
# 3. cmap="coolwarm":设置颜色映射为从冷色(蓝色)到暖色(红色)的渐变色
# 4. fmt=".2f":设置数值的显示格式为两位小数
# 5. linewidths=0.5:设置热力图中单元格之间的线条宽度为 0.5
sns.heatmap(correlation, annot=True, cmap="coolwarm", fmt=".2f", linewidths=0.5)

# 添加标题
plt.title("Correlation Heatmap of Iris Dataset Features", fontsize=14)

# 显示图表
plt.show()

代码说明:

python 复制代码
iris.drop(columns=["species"]):排除非数值列 species,只保留数值特征。

corr():计算数值特征的相关性矩阵。

sns.heatmap:绘制热力图。

annot=True:在热力图中显示数值。

cmap="coolwarm":设置颜色映射。

fmt=".2f":设置数值的显示格式为两位小数。

linewidths=0.5:设置热力图中单元格之间的线条宽度。
相关推荐
大翻哥哥1 小时前
Python 2025:量化金融与智能交易的新纪元
开发语言·python·金融
zhousenshan2 小时前
Python爬虫常用框架
开发语言·爬虫·python
IMER SIMPLE3 小时前
人工智能-python-深度学习-经典神经网络AlexNet
人工智能·python·深度学习
CodeCraft Studio3 小时前
国产化Word处理组件Spire.DOC教程:使用 Python 将 Markdown 转换为 HTML 的详细教程
python·html·word·markdown·国产化·spire.doc·文档格式转换
专注API从业者4 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
java1234_小锋4 小时前
[免费]基于Python的协同过滤电影推荐系统(Django+Vue+sqlite+爬虫)【论文+源码+SQL脚本】
python·django·电影推荐系统·协同过滤
看海天一色听风起雨落4 小时前
Python学习之装饰器
开发语言·python·学习
XiaoMu_0015 小时前
基于Python+Streamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现
python·信息可视化·旅游
THMAIL5 小时前
深度学习从入门到精通 - 生成对抗网络(GAN)实战:创造逼真图像的魔法艺术
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·cnn
我没想到原来他们都是一堆坏人6 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python