python数据分析——seaborn绘图2

参考资料:活用pandas库

python 复制代码
# 导入库
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
tips=pd.read_csv(r"...\seaborn常用数据案例\tips.csv")
print(tips.head())

1、成对关系表示

当数据大部分是数据时,可以使用pairplot函数把所有成对关系描绘出来,该函数会为每对变量绘制散点图,并且为单变量数据绘制直方图。

python 复制代码
fig=sns.pairplot(tips)

pairplot的一个缺点就是存在冗余信息,即图的上半部分和下半部分相同。可以使用pairgrid手动指定图的上半部分和下半部分。如下:

python 复制代码
pair_grid=sns.PairGrid(tips)
# 可以使用plt.scatter代替sns.regplot
pair_grid=pair_grid.map_upper(sns.regplot)
pair_grid=pair_grid.map_lower(sns.kdeplot)
pair_grid=pair_grid.map_diag(sns.histplot,kde=True)

2、多变量数据的可视化

(1)颜色

使用violinplot函数是,可以通过hue参数按性别(sex)给图着色。可以为"小提琴"的左右两半着不同颜色,用于区分性别,以此减少冗余信息。

python 复制代码
fig,ax=plt.subplots()
ax=sns.violinplot(x='time',y='total_bill',hue='sex',data=tips,split=True)

其他绘图函数也存在hue参数,如lmplot函数,pairplot函数。

python 复制代码
sns.lmplot(x='total_bill',y='tip',data=tips,hue='sex',fit_reg=False)
python 复制代码
sns.pairplot(tips,hue='sex')

(2)大小和形状

我们还可以通过点的大小表示更多的信息,但应该谨慎使用该方法,因为人眼不太擅长区分点的大小。

python 复制代码
sns.lmplot(x='total_bill',y='tip',data=tips,fit_reg=False,
           scatter_kws={'s':tips['size']*10})

另外,在处理多个变量时,有时综合运用不同元素显示信息会非常有用。下例中,运用了颜色和形状区分变量sex的值。

python 复制代码
sns.lmplot(x='total_bill',y='tip',data=tips,
          fit_reg=False,
          hue='sex',
          markers=['o','x'])

(3)分面

如果想显示更多变量,或者确定了要实现的可视化图,但向基于一个分类变量画出多幅图,可以使用分面(facet)来满足这些需求。要使用分面,数据必须是"整洁数据":数据中的每一行都表示一个观测值,每一列是一个变量(也是"长数据")。

如下图所示在lmplot创建这个可视化,需要将另外两个参数col和col_wrap传递到seaborn中的散点图中。col参数用于指定分面变量,col_wrap参数用于指定图的每行包含的具体列数。如果不适用col_wrap参数,所有图将会在同一行中。

python 复制代码
# 导入数据
anscombe=pd.read_csv(r"...\seaborn常用数据案例\anscombe.csv")
# 查看数据
anscombe.sample(10)
# 可视化分面
sns.lmplot(x='x',y='y',data=anscombe,fit_reg=False,
          col='dataset',col_wrap=2)

我们知道lmplot是图级(figure-level)函数,而在seaborn中,许多图使用轴域级(axes-level)函数创建的。这意味着并不是每个绘图函数都有分面参数col和col_wrap。为此必须先创建FacetGrid,它知道要在哪个变量上进行分面,然后为每个分面提供单独的绘图代码。如下:

python 复制代码
# 创建FacetGrid
facet=sns.FacetGrid(tips,col='time')
# 针对每个用餐时段,绘制总消费额的直方图
facet.map(sns.histplot,'total_bill',kde=True)

各个分面不限于单变量图,如下:

python 复制代码
facet=sns.FacetGrid(tips,col='day',col_wrap=2,hue='sex')
facet=facet.map(plt.scatter,'total_bill','tip')
facet.add_legend()

对于分面,还可以让一个变量在x轴上分面,另一个变量在y轴上分面,可以通过传递row参数来实现,如下:

python 复制代码
facet=sns.FacetGrid(tips,col='time',row='smoker',hue='sex')
facet.map(plt.scatter,'total_bill','tip')
相关推荐
yufei-coder3 分钟前
C#基础语法
开发语言·c#·.net
长天一色3 分钟前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
_.Switch15 分钟前
Python机器学习模型的部署与维护:版本管理、监控与更新策略
开发语言·人工智能·python·算法·机器学习
醉颜凉17 分钟前
银河麒麟桌面操作系统修改默认Shell为Bash
运维·服务器·开发语言·bash·kylin·国产化·银河麒麟操作系统
NiNg_1_23423 分钟前
Vue3 Pinia持久化存储
开发语言·javascript·ecmascript
带带老表学爬虫31 分钟前
java数据类型转换和注释
java·开发语言
Hoper.J34 分钟前
PyTorch 模型保存与加载的三种常用方式
人工智能·pytorch·python
qianbo_insist34 分钟前
simple c++ 无锁队列
开发语言·c++
BigYe程普1 小时前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发
彭于晏6891 小时前
Android广播
android·java·开发语言