0
点赞
收藏
分享

微信扫一扫

Python seaborn大更新,带来全新绘图方式seaborn.objects

在今年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几个很有用的新功能~


1 新版seaborn安装

通过以下即可轻松将seaborn升级到最新版本v0.12 (升级后不影响老版本功能使用),

pip install seaborn==0.12

conda list seaborn查看是否安装成功, 

会发现,seaborn v0.12已经安装成功了。


2 详解新版seaborn部分功能

2.1 导入seaborn.objects

全新的导入方法,

# 全新的导入模式
import seaborn.objects as so

#区别于之前的import seaborn as sns

2.2 链式调用

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)  #添加图层绘制折线图
)


2.3 图形外观设置-更少依赖matplotlib 

主要依赖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图层中设置点颜色、大小
)

 图形颜色、size、marker等设置,

(
    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个性化标题
)


2.4 与matplotlib和谐共处

⚠️注意,此处使用了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()
)


2.5 优雅绘制分面图

主要使用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())
)


 2.6 随处使用Plot对象 

可以将Plot对象存入变量,然后灵活添加图层,

# 构建基础图层
p = so.Plot(healthexp, "Year", "Spending_USD", color="Country")

# 给图层添加折线
p.add(so.Line())

# 给图形添加面积图、堆叠图
p.add(so.Area(), so.Stack())


3 小结 

以上只是介绍了几个小编感觉很有用的更新,更详细的

seaborn.objects确实如当初宣称的那样,弥补了seaborn老版本子图难实现、个性化难、需要重度依赖matplotlib的缺陷;

seaborn.objects使用图层图形语法,ggplot2的粉丝们有福了;

seaborn.objects本版本不是稳定版本,期待后续版本更多惊喜;

最后,感谢seaborn的开发者们无私奉献,小伙伴们可以分享让更多需要的人受益。

参考:http://seaborn.pydata.org/whatsnew/v0.12.0.html

举报

相关推荐

0 条评论