seaborn
Matplotlib是高度可定制的,但快速实施出吸引人的细节就变得有些复杂。
Seaborn作为一个带着定制主题和高级界面控制的Matplotlib扩展包,能让绘图变得更轻松(是matplotlib的扩展,是在其基础之上的)
matplotlib 绘图基本元素
seaborn 数据展示(自带分组技能)
import numpy as np
import pandas
from pandas import Series, DataFrame
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
图表控制#
样式控制#
# 查看RcParams
mpl.rc_params()
- axes_style:获取设置背景样式的属性字典
- set_style(style,rc):设置背景样式
style可选的5个seaborn默认主题
- darkgrid黑色网格(默认)
- whitegrid白色网格
- dark黑色背景
- white白色背景
- ticks有刻度线的白背景
- rc背景样式的属性字典设置接口
# 使用sns.set()来设置seaborn默认的画布风格(全局设置)
sns.set()
x = [1,3,5]
plt.plot(x, np.sin(x))
# set.的都是全局设置
sns.set_style("white")
plt.plot(x, np.sin(x))
x = np.linspace(0,2*np.pi,30)
def show_lines():
for i in range(6):
plt.plot(x, np.sin(x+i))
show_lines()
# 临时设置用sns.axes_style
with sns.axes_style("darkgrid"):
show_lines()
# 获取属性字典
sns.axes_style()
# rc参数可以设置其他属性
sns.set_style(style="whitegrid", rc={
"axes.facecolor":"blue"
})
plt.plot(x, np.sin(x))
sns.set_style("white")
plt.plot(x, np.sin(x))
边框控制#
sns.set_style("ticks")
x = np.linspace(0,2*np.pi,30)
plt.plot(x,np.sin(x))
# sns.despine()必须放到绘图之后
# 默认只保留左边框,下边框
sns.despine(
left=True, bottom=True, right=False, top=False, # 表示去除左、下边框 ,保留右、上边框
trim=True, # 限制留存的边框范围,没有图像的地方会舍弃
offset=100, # 两坐标轴分开的距离
)
线条控制#
plotting_context
sns.set_context("paper") # 细
show_lines()
sns.set_context("poster") # 粗
show_lines()
# 获取线条属性字典
sns.plotting_context()
# 临时设置
with sns.plotting_context("paper"):
show_lines()
# rc设置属性
sns.set_context("paper", rc={
"lines.linewidth": 3.0
})
show_lines()
调色板#
创建调色板#
# 创建调色板
colors = sns.color_palette(
palette="colorblind", # deep, muted, bright, pastel, dark, colorblind
) # 返回[(rgb),(rgb),...]
colors
# 展示颜色列表的函数[(rgb),(rgb)]
sns.palplot(colors)
圆形调色板#
hls#
HSL即色相、饱和度、亮度(英语:Hue, Saturation, Lightness)。
色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
明度(V),亮度(L),取0-100%。
# hls是一个圆形调色板,解决的是6个以上的颜色的处理
colors = sns.color_palette(
palette="hls",
n_colors=10 # 颜色数量
)
sns.palplot(colors)
# 可以使用hls_palette()函数来控制颜色的亮度和饱和。
sns.hls_palette()
husl#
由于人类视觉系统的工作方式,会导致在RGB度量上强度一致的颜色在视觉中并不平衡。比
如,我们黄色和绿色是相对较亮的颜色,I而蓝色则相对较暗,使得这可能会成为与hls系统-
致的一个问题。
为了解决这一问题,Seaborn为husl系统提供了一个接口,这也使得选择均匀间隔的色彩变得
更加容易,同时保持亮度和饱和度更加一致。
sns.color_palette("husl", n_colors=9)
# sns.husl_palette
sns.palplot(sns.husl_palette(
n_colors=7,
h=0.3, # 控制起始颜色
l=0.8, # 亮度
s=0.3, # 饱和
))
调色插件colorbrewer#
# data_type:
# 'sequential' 连续调色,eg:温度变化,海拔高度变化
# 'diverging' 两极调色
# 'qualitative' 分类调色,就是给出的deep, muted, bright, pastel, dark, colorblind,强调数据之间的对比关系
colors = sns.choose_colorbrewer_palette("qualitative")
sns.palplot(colors)
colors = sns.choose_colorbrewer_palette("diverging")
sns.palplot(colors)
colors = sns.choose_colorbrewer_palette("sequential")
sns.palplot(colors)
其他#
ColorBrewer字典中提供了一些连续调色板,如"Blues”,“BuGn_r”,“GnBu_d",PuBuGn_d"
颜色中带_r后缀的,表示颜色翻转渐变
颜色中带_d后缀的,表示对原颜色进行变暗处理
sns.color_palette(palette="Blues_r_d")
# sns.cubehelix_palette解决黑白打印时的问题(cubehelix:同色系渐变)
sns.palplot(sns.cubehelix_palette(n_colors=10))
# 暗色系调色板
sns.dark_palette(color="red",n_colors=10)
# 亮色系调色板
sns.light_palette(color="red",n_colors=10)
# 其也会带插件
sns.choose_dark_palette(input="hls")
# as_cmap=True使用连续值来映射颜色
colors = sns.choose_colorbrewer_palette("sequential", as_cmap=True)
colors
离散调色板#
用于可能无论大的低的值和大的高的值都非常重要的数据。
sns.choose_colorbrewer_palette("diverging")
sns.color_palette("coolwarm")
sns.choose_diverging_palette()
# set_palette配置全局调色板
show_lines()
sns.set_palette("husl")
sns.palplot(sns.color_palette("husl"))
show_lines()
总结#
简单常用色彩总结:
- 分类:hls husl Paired Set1~Set3(色调不同)
- 连续:Blues[蓝s,颜色+s] BuGn[蓝绿] cubehelix(同色系渐变)
- 离散:BrBG[棕绿] RdBu[红蓝] coolwarm[冷暖](双色对称)
# 调色板全局设置
sns.set_palette()
# 创建调色板
colors = sns.color_palette()
# 调用colorbrewer插件
sns.choose_colorbrewer_palette()
seaborn常用图像绘制#
普通2D图像#
示例#
# 普通绘制
x = np.arange(10)
height = np.random.randint(0,100,10)
plt.bar(x,height)
height.mean()
# seaborn绘制,默认聚合
# 线:置信区间
sns.barplot(y=height)
条形图#
通用参数:
x,y:要展示的数据,如果是DataFrame,可以设置列标签
data:数据的来源,通常是一个DataFrame
hue:分组因子,用于颜色映射的列
palette:用于颜色映射的调色板
order:排序的序列,例如order=['Dinner’,’Lunch']
hue_order:颜色映射的序列,例如hue_order=["setosa", "virginica"]
# 数据集
tips = sns.load_dataset("tips")
tips
sns.palplot(sns.color_palette("husl", n_colors=2))
# 条形图示例
sns.barplot(
x="sex",
y="tip",
data=tips,
hue="smoker", # 分组之后再分组
palette="husl", # 指定调色板
# order=["Female", "Male"], # 指定x分组元素的顺序
order=["Male"], # 只保留"Male"
hue_order=["Yes"], # 只保留"Yes"
)
# 相当于
tips.groupby(["sex","smoker"], observed=True)["tip"].mean() # observed=True不加飘红
colors = sns.choose_colorbrewer_palette("qualitative") # qualitative:分类调色
# 查看有几种不同的元素
tips["day"].nunique()
# 条形图示例
sns.barplot(
data=tips,
x="time",
y="total_bill",
estimator=np.mean, # 指定聚合方式
errorbar=None, # 关闭置信区间(ci=None已被遗弃)
# palette="husl", # 使用palette要指定hue,否则飘红
palette=sns.color_palette(colors), # 自定制调色板
hue="day",
hue_order=["Sat", "Sun"] # 只想看周六周日
)
tips.head()
# 根据sex,size看给小费情况
sns.barplot(tips, x="sex", y="tip", hue="size")
# 计数条形图(sns.countplot)
# 统计性别比例
sns.countplot(x="sex", data=tips, hue="smoker") # y轴是count(数量)
# 加载数据集
sns.load_dataset("titanic")
散点图#
查看两组数据对应关系
sns.stripplot ()
sns.scatterplot ()
# stripplot会把x轴的数据当成离散值(字符串型)来处理
# 所以stripplot更适合处理离散值和连续值的关系的展示
sns.stripplot(x="total_bill", y="tip", data=tips)
sns.stripplot(x="smoker", y="total_bill", data=tips)
# 分簇散点图
sns.swarmplot(x="smoker", y="total_bill", data=tips)
小提琴图#
# 用于查看数据分布情况
sns.violinplot(x="smoker", y="total_bill", data=tips)
colors = sns.choose_colorbrewer_palette("qualitative") # qualitative:分类调色
# 两者结合使用
sns.violinplot(x="smoker", y="total_bill", data=tips, hue="sex", split=True)
sns.swarmplot(x="smoker", y="total_bill", data=tips, palette=sns.color_palette(colors), hue="sex")
箱线图#
检验连续数据是否存在离群点,以及数据分布的范围(4分位数)
sns.boxplot(x="time", y="total_bill", data=tips, hue="day")
# 将x,y交换,实现横着显示
sns.boxplot(x="total_bill", y="time", data=tips, hue="day")
# whis=np.inf:不显示离群点
sns.boxplot(x="total_bill", y="time", data=tips, hue="day", whis=np.inf) # 飘红了RuntimeWarning: invalid value encountered in scalar multiply
热图#
# 数据集(花)
iris = sns.load_dataset("iris")
data = iris.drop("species", axis=1)
# 相关矩阵
data.corr()
colors = sns.choose_colorbrewer_palette(
"sequential",
as_cmap=True, # 渐变而非色块
)
# 热图
sns.heatmap(
data.corr(),
cmap=colors,
annot=True, # 每个色块上标注文字
)
method : {'pearson','kendall',′spearman'}
pearson:当数据满足正态性时可用Pearson相关系数查看变量间关系情况
spearman:当数据为定量数据,且不服从正态性则使用Spearman相关系数
kendall:Kendall相关系数通常用于评分数据一致性水平研究,比如评委打分,数据排名
等。
高级函数#
可视化变量关系#
- regplot()方便观察变量间的关系,默认是散点图
- lmplot()x和y必须以字符串的的方式传入,比regplot更加严格
# sns.regplot
sns.regplot(x="total_bill", y="tip", data=tips)
sns.regplot(x=tips.total_bill, y=tips.tip)
# sns.lmplot()
# sns.lmplot(x=tips.total_bill, y=tips.tip) # 不行
sns.lmplot(x="total_bill", y="tip", data=tips) # 正确
# 直方图
# norm_hist转成概率估计图,density(有问题尝试这个参数)
# kde开启或关闭核密度估计图,如果关闭会自动变更为数量统计的直方图
sns.distplot(
a=tips.total_bill,
kde=False, #去除曲线
norm_hist=True, # 将数值转成概率
bins=5, # 分区个数
rug=True, # 开启地毯图:显示底部刻度线
hist_kws={"color":"red"}, # 属性字典
) # 将被弃用
# 单画kde图像
sns.kdeplot(tips.total_bill)
sns.rugplot(tips.total_bill)
# 双变量分布(扩展分支画布)
sns.jointplot(
x=tips.total_bill,
y=tips.tip,
joint_kws={"color": "green"}, # 属性字典
marginal_kws={"color": "orange"}, # 外侧图像属性字典
kind="scatter", # 选择使用图像类型(使用时必须保证该图像支持该数据类型)
space=0, # 主画布和分支画布之间的距离(0~1浮点)
)
data
# 绘制多图
sns.pairplot(data)
绘制多层面板分类图#
# 创建画布
grid = sns.FacetGrid(
data=tips, row="day", col="sex",
aspect=2, # 宽高比
)
# 绘制图像
# 一旦指定func,后面跟着的数都是由func指定的参数来调用的,所以参数一定要匹配
# grid.map(plt.scatter, "total_bill", "tip")
grid.map(plt.hist, "total_bill")
作者:cloud-2-jane
出处:https://www.cnblogs.com/cloud-2-jane/articles/18644459
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架