参考ggplot2,Seaborn将迎来超大版本更新!

来源:pythonic生物人

参考ggplot2,Seaborn将迎来超大版本更新!_第1张图片

最新消息,Seaborn将迎来API重写级别版本更新,本文罗列重大改变,太值得期待了!

  • Matplotlib是Python最重要的可视化库,但是,过于复杂,Seaborn对其主要功能做了封装,隐藏复杂参数,仅需要几行代码就可以实现优美的统计图,但功能有限:Seaborn

  • 此次更新主要拓展Seaborn的核心功能 —与pandas的集成、数据和图形之间的自动映射、统计转换 — 使得Seaborn成为一个更具组合性、可扩展性和全面性的可视化库。

  • 作者直言,更新灵感不少源于R语言中ggplot2背后的图层图形语法,去其糟粕,取其精华,做了很多优化,但是Seaborn不等于Python版ggplot2 (plotnine);

  • 为了这次更新,已经开发了8个月,依旧还有很多工作要做,更新版具体发布时间待定,但是会在发布前发布系列alpha/beta releases,以获取测试反馈。


下面看看主要哪些方面发生了更新

嫌长文,直接看文章末尾小结。

基本语法

导入Seaborn

#方法一
import seaborn.objects as so #不再是import seaborn as sns

#方法二
from seaborn.objects import *

绘图主函数变成了seaborn.objects.Plot

import seaborn
tips = seaborn.load_dataset("tips") #导入内置数据

so.Plot(tips, x="total_bill", y="tip") #绘制空Figure
参考ggplot2,Seaborn将迎来超大版本更新!_第2张图片

add在Figure上添加散点图层,

so.Plot(tips, x="total_bill", y="tip").add(so.Scatter()) 
#.add(so.Scatter())是不是有ggplot2 + 添加图层的影子~
参考ggplot2,Seaborn将迎来超大版本更新!_第3张图片

全局个性化,

so.Plot(tips).add(so.Scatter(), x="total_bill", y="tip")

每个图层个性化,

(
    so.Plot(tips, x="total_bill", y="tip")
    .add(so.Scatter(color=".6"))
    .add(so.Scatter(), data=tips.query("size == 2"))
)
参考ggplot2,Seaborn将迎来超大版本更新!_第4张图片
(
    so.Plot(tips, x="total_bill", y="tip", color="day", fill="time")
    .add(so.Scatter(fillalpha=.8))
)
参考ggplot2,Seaborn将迎来超大版本更新!_第5张图片

核心组件1-图层对象Mark

每个图层都需要一个Mark对象,它定义了如何绘制绘图。将对应于现有seaborn功能和提供新功能的标记,但是,很多还没有实现,

so.Plot(tips, y="day", x="total_bill")
.add(so.Dot(color="#698", alpha=.5)) #直接设置Mark(此处为Dot)特性,而不是映射它们.
参考ggplot2,Seaborn将迎来超大版本更新!_第6张图片

核心组件2-数据转换Stat

在新版本中,每个层都可以接受一个数据转换的Stat对象,

so.Plot(fmri, x="timepoint", y="signal", color="event").add(so.Line(), so.Agg(), group="subject")
参考ggplot2,Seaborn将迎来超大版本更新!_第7张图片

自定义Mark和Stat对象

class PeakAnnotation(so.Mark):
    def _plot_split(self, keys, data, ax, kws):
        ix = data["y"].idxmax()
        ax.annotate(
            "The peak", data.loc[ix, ["x", "y"]],
            xytext=(10, -100), textcoords="offset points",
            va="top", ha="center",
            arrowprops=dict(arrowstyle="->", color=".2"),

        )

(
    so.Plot(fmri, x="timepoint", y="signal")
    .add(so.Line(), so.Agg())
    .add(PeakAnnotation(), so.Agg())
)
参考ggplot2,Seaborn将迎来超大版本更新!_第8张图片

核心组件3-图形自适应the Move

新版本里,图形的一些调整都汇聚在move对象中,取代老版本中的dodge=xxjitter=xx、multiple=xx等设置,

(
    so.Plot(tips, "day", "total_bill", color="time", alpha="sex")
    .add(so.Bar(), so.Agg(), move=so.Dodge())
)
参考ggplot2,Seaborn将迎来超大版本更新!_第9张图片
(
    so.Plot(tips, "day", "total_bill", color="time", alpha="smoker")
    .add(so.Dot(), move=[so.Dodge(by=["color"]), so.Jitter(.5)])
)
参考ggplot2,Seaborn将迎来超大版本更新!_第10张图片

个性化设置

新版本将添加更多图形个性化设置功能,

(
    so.Plot(planets, x="mass", y="distance", color="year")
    .map_color("flare", norm=(2000, 2010))
    .scale_numeric("x", "log")
    .add(so.Scatter(pointsize=3))
)
#以上设置顺序不分先后
参考ggplot2,Seaborn将迎来超大版本更新!_第11张图片
(
    so.Plot(planets, y="year", x="orbital_period")
    .scale_numeric("x", "log")
    .add(so.Scatter(alpha=.5, marker="x"), color="method")
    .add(so.Line(linewidth=2, color=".2"), so.Agg(), orient="h")
)
参考ggplot2,Seaborn将迎来超大版本更新!_第12张图片

子图定义

新版本中分面Facet被隐式地内置,

(
    so.Plot(tips, x="total_bill", y="tip")
    .facet("time", order=["Dinner", "Lunch"])
    .add(so.Scatter())
)
参考ggplot2,Seaborn将迎来超大版本更新!_第13张图片

注意区别于老版本的FacetGrid,

(
    so.Plot(tips, x="total_bill", y="tip", col="day")
    .add(so.Scatter(color=".75"), col=None)
    .add(so.Scatter(), color="day")
    .configure(figsize=(7, 3))
)
参考ggplot2,Seaborn将迎来超大版本更新!_第14张图片

新版本依旧包含PairGrid功能,

(
    so.Plot(tips, y="day")
    .pair(x=["total_bill", "tip"])
    .add(so.Dot())
)
参考ggplot2,Seaborn将迎来超大版本更新!_第15张图片

FacetGrid和PairGrid可联合使用,

(
    so.Plot(tips, x="day")
    .facet("sex")
    .pair(y=["total_bill", "tip"])
    .add(so.Dot())
)
参考ggplot2,Seaborn将迎来超大版本更新!_第16张图片

faceted和paired图均可沿着列和行“wrapped”,

class Histogram(so.Mark):  # TODO replace once we implement
    def _plot_split(self, keys, data, ax, kws):
        ax.hist(data["x"], bins="auto", **kws)
        ax.set_ylabel("count")

(
    so.Plot(tips)
    .pair(x=tips.columns, wrap=3)
    .configure(sharey=False)
    .add(Histogram())
)
参考ggplot2,Seaborn将迎来超大版本更新!_第17张图片

总之,新版本中,“axes-level” 和“figure-level” 无差异。

图形迭代、渲染

迭代:可定义一个基础图形,然后按需求在基础图形上绘制不同图形,不同图形之间相互独立,

#定义基础图形p
p = (
    so.Plot(fmri, x="timepoint", y="signal", color="event")
    .map_color(palette="crest")
)

p.add(so.Line()) #绘制折线图
参考ggplot2,Seaborn将迎来超大版本更新!_第18张图片
p.add(so.Line(), group="subject")
参考ggplot2,Seaborn将迎来超大版本更新!_第19张图片

与Matplotlib集成

“axes-level”容易实现,可直接对子图操作,

import matplotlib as mpl
_, ax = mpl.figure.Figure(constrained_layout=True).subplots(1, 2)
(
    so.Plot(tips, x="total_bill", y="tip")
    .on(ax)
    .add(so.Scatter())
)
参考ggplot2,Seaborn将迎来超大版本更新!_第20张图片

“figure-level”  比较难缠,

f = mpl.figure.Figure(constrained_layout=True)
(
    so.Plot(tips, x="total_bill", y="tip")
    .on(f)
    .add(so.Scatter())
    .facet("time")
)
参考ggplot2,Seaborn将迎来超大版本更新!_第21张图片

subfigures让多子图更简单,

sf1, sf2 = f.subfigures(1, 2)
(
    so.Plot(tips, x="total_bill", y="tip", color="day")
    .add(so.Scatter())
    .on(sf1)
    .plot()
)
(
    so.Plot(tips, x="total_bill", y="tip", color="day")
    .facet("day", wrap=2)
    .add(so.Scatter())
    .on(sf2)
    .plot()
)
参考ggplot2,Seaborn将迎来超大版本更新!_第22张图片

小结

  • 如果该新版本发布,Seaborn老版本子图难实现、个性化难、需要重度依赖Matplotlib的缺陷基本被修复

  • 新版本吸收了ggplot2的部分属性,对R用户比较容易上手;

  • 但是,Seaborn支持图形类别有限的问题没有看到修复;

  • 再者,到底啥时候新版本能够发布,This is very much a work in progress

  • 总之,非常值得期待。

  • ref: https://seaborn.pydata.org/nextgen/

-------- End --------

362a630aff7da673288caf7b19d7422f.png

精选资料

回复关键词,获取对应的资料:

关键词 资料名称
600 《Python知识手册》
md 《Markdown速查表》
time 《Python时间使用指南》
str 《Python字符串速查表》
pip 《Python:Pip速查表》
style 《Pandas表格样式配置指南》
mat 《Matplotlib入门100个案例》
px 《Plotly Express可视化指南》

精选内容

数据科学: VS Code 中 Python配置使用指南 | 财经工具 Tushare | Matplotlib 最有价值的 50 个图表

书籍阅读: 如何阅读一本书 | 巴菲特之道 | 价值 | 原则 | 投资最重要的事 | 戴维斯王朝 | 客户的游艇在哪里 | 刻意练习 | 林肯传 | 金字塔原理

投资小结: 2021Q4 | 2021Q3 | 2021Q2 | 2021Q1 | 2020Q4

精选视频

可视化: Plotly Express

财经: Plotly在投资领域的应用 | 绘制K线图表

排序算法: 汇总 | 冒泡排序 | 选择排序 | 快速排序 | 归并排序 | 堆排序 | 插入排序 | 希尔排序 | 计数排序 | 桶排序 | 基数排序

参考ggplot2,Seaborn将迎来超大版本更新!_第23张图片

你可能感兴趣的:(可视化,python,数据可视化,数据分析,人工智能)