在今年1月份时,seaborn曾对外宣称参考ggplot2,seaborn将迎来超大版本更新!,但是,具体时间待定!
在9月6日,seaborn的作者
目录
1 新版seaborn安装
2 详解新版seaborn部分功能
2.1 导入seaborn.objects
2.2 链式调用
2.3 图形外观设置-更少依赖matplotlib
2.4 与matplotlib和谐共处
2.5 优雅绘制分面图
2.6 随处使用Plot对象
3 小结
Michael Waskom博士激动的宣布了seaborn V0.12版本的发布 (为了该版本,他们已经过多年设计和长达16个月的coding实现,向开源大佬们致敬respect),
seaborn 0.12版本最大更新在于引入了新的绘图方式seaborn.objects:
seaborn.objects使用全新的end-to-end的链式调用法绘图;
seaborn.objects底层采用了图层图形语法 (the grammar of graphics,详细介绍ggplot2与图层图形语法),灵感来自seaborn 10年的开发积累、ggplot2
及 vega-lite等知名可视化工具;
seaborn.objects的加入会让seaborn变的更加可组合、可扩展、对matplotlib依赖更小;
但是,v0.12也是个“测试版本”,功能可能不完善,后续的稳定版本可能会带来更大的改变,拭目以待。
同时,seaborn之前sns那种绘图方式依旧可用,可参考这些文章:
Matplotlib太臃肿,试试Seaborn
Python可视化|Matplotlib&Seaborn36(完结篇)
Python可视化matplotlib&seborn16-相关性heatmap
本文重点介绍seaborn.objects几个很有用的新功能~
通过以下即可轻松将seaborn升级到最新版本v0.12 (升级后不影响老版本功能使用),
pip install seaborn==0.12
conda list seaborn查看是否安装成功,
会发现,seaborn v0.12已经安装成功了。
全新的导入方法,
# 全新的导入模式
import seaborn.objects as so
#区别于之前的import seaborn as sns
seaborn.objects使用链式调用函数绘图,将多个图层通过“.”叠加,和R ggplot2中的“+”一个意思;函数Plot用于添加最基础的图层,其它图层通过“.”依次叠加;
Plot图层中可设置全局格式、其它图层设置对应图层格式,如下图,
可以通过几个例子理解下,
penguins = sns.load_dataset("penguins") #导入数据
(
so.Plot( # Plot图层设置全局格式
penguins, x="bill_length_mm", y="bill_depth_mm",
edgecolor="sex", edgewidth="body_mass_g",
)
.add(so.Dot(color=".8"))#Dot图层设置当前散点颜色等
)
import seaborn as sns
#导入seaborn内置数据集
tips = sns.load_dataset("tips")
#绘图
( #使用时,将所有代码包在()中,类似plotnine
so.Plot(tips, x="total_bill", y="tip",
color="time") #基础图层添加所有图层的绘图数据,x轴为"total_bill", y轴为"tip"
.add(so.Dots()) #添加图层绘制散点图,散点按照Plot图层中的"time"改变颜色
.add(so.Line(color="red"), so.PolyFit(), color=None) #添加图层绘制折线图
)
主要依赖scale函数,设置颜色、坐标轴、图例、marker等图形外观属性,不再过度依赖matplotlib。
图形颜色、size设置,
diamonds = sns.load_dataset("diamonds")
(
so.Plot(diamonds, x="carat", y="price", color="clarity", pointsize="carat")
.add(so.Dots())
.scale(color=("#88c", "#555"), pointsize=(2, 10)) #scale图层中设置点颜色、大小
)
(
so.Plot(diamonds, x="carat", y="price", color="carat", marker="cut")
.add(so.Dots()) #添加图层绘制散点图
.scale( #添加图层个性化图形外观
color=so.Continuous("crest", norm=(0, 3), trans="sqrt"), #设置点的颜色
marker=so.Nominal(["o", "+", "x"], order=["Ideal", "Premium", "Good"]),#设置点的marker
)
)
主要使用Continuous().tick、Continuous().label方法
(
so.Plot(diamonds, x="carat", y="price", color="carat")
.add(so.Dots())
.scale(
x=so.Continuous().tick(every=0.5), #x轴刻度间隔设置为0.5
y=so.Continuous().label(like="${x:.0f}"),#y轴刻度格式设置
color=so.Continuous().tick(at=[1, 2, 3, 4]),
)
)
主要使用 Plot.label(), Plot.limit()和Plot.share()方法,
(
so.Plot(penguins, x="body_mass_g", y="species", color="island")
.facet(col="sex")
.add(so.Dot(), so.Jitter(.5))
.share(x=True) #x轴是否使用同一刻度
.limit(y=(2.5, -.5)) #y轴范围设置
.label(
x="Body mass (g)", y="",
color=str.capitalize,
title="{} penguins".format,
) #label个性化标题
)
⚠️注意,此处使用了subfigure,subfigure在matplotlib
v3.4版本才出现, 下面的案例需要matplotlib
v3.4之后版本才支持,否则报错,
f = mpl.figure.Figure(figsize=(8, 4))
sf1, sf2 = f.subfigures(1, 2) #subfigures
(
so.Plot(penguins, x="body_mass_g", y="flipper_length_mm")
.add(so.Dots()) #左边子图添加散点图
.on(sf1)
.plot()
)
(
so.Plot(penguins, x="body_mass_g")
.facet(row="sex")
.add(so.Bars(), so.Hist()) #右边子图添加bar和hist图
.on(sf2)
.plot()
)
主要使用Plot.facet、Plot.pair方法,功能类似之前seaborn的方法sns.PairGrid、sns.pairplot,但是,个性化更简单,
healthexp = sns.load_dataset("healthexp")
(
so.Plot(healthexp, x="Year", y="Life_Expectancy")
.facet("Country", wrap=3) #facet分面
.add(so.Line(alpha=.3), group="Country", col=None) #各子图属性设置更方便
.add(so.Line(linewidth=3))
)
Plot facet结合pair使用
(
so.Plot(penguins, y="body_mass_g", color="species")
.pair(x=["bill_length_mm", "bill_depth_mm"])
.facet(row="sex")#pair结合facet使用
.add(so.Dots())
)
可以将Plot对象存入变量,然后灵活添加图层,
# 构建基础图层
p = so.Plot(healthexp, "Year", "Spending_USD", color="Country")
# 给图层添加折线
p.add(so.Line())
# 给图形添加面积图、堆叠图
p.add(so.Area(), so.Stack())
以上只是介绍了几个小编感觉很有用的更新,更详细的
seaborn.objects确实如当初宣称的那样,弥补了seaborn老版本子图难实现、个性化难、需要重度依赖matplotlib的缺陷;
seaborn.objects使用图层图形语法,ggplot2的粉丝们有福了;
seaborn.objects本版本不是稳定版本,期待后续版本更多惊喜;
最后,感谢seaborn的开发者们无私奉献,小伙伴们可以分享让更多需要的人受益。
参考:http://seaborn.pydata.org/whatsnew/v0.12.0.html