大家好,我是木木。
今天给大家分享一个图形语法绘图的 Python 库,plotnine。
plotnine
plotnine 把 ggplot2 风格的 Grammar of Graphics 带到了 Python。它强调数据、映射、几何对象、坐标和分面这些概念,比“先画线再调样式”的过程更声明式。对熟悉 R/ggplot2 的数据分析师,或者希望用一致语法组织复杂统计图的人来说,plotnine 很舒服。
项目地址:https://github.com/has2k1/plotnine
官方文档:https://plotnine.readthedocs.io/en/stable
三大特点
语法清晰
用 aes、geom、facet、coord 组合图表,表达意图很明确。
适合统计图
分面、颜色映射、几何层叠很自然。
承接 pandas
DataFrame 字段直接进入映射,分析脚本里衔接顺。
最佳实践
安装方式:pip install plotnine。建议先用小数据验证图表对象和输出结构,再把样式、导出和嵌入流程固定到项目模板里。
第一段代码解决的问题是:创建最小可运行图表对象,并确认库版本和核心图形元素。
fromimportlib.metadataimportversionimportpandasaspdfromplotnineimportggplot,aes,geom_pointdf=pd.DataFrame({"x":[1,2,3],"y":[2,5,3]})p=ggplot(df,aes("x","y"))+geom_point()fig=p.draw(show=False)print("plotnine:",version("plotnine"))print("layers:",len(p.layers))print("axes:",len(fig.axes))
第二段代码解决的问题是:加入更接近真实业务的字段、布局或图层配置。
importpandasaspdfromplotnineimportggplot,aes,geom_col,coord_flipdf=pd.DataFrame({"team":["A","B","C"],"score":[7,4,9]})p=ggplot(df,aes("team","score"))+geom_col(fill="#4c78a8")+coord_flip()fig=p.draw(show=False)print("layers:",len(p.layers))print("coord:",type(p.coordinates).__name__)print("axes:",len(fig.axes))
环境与版本信息
本文示例使用 Python 3.11.0,演示代码在本地真实运行;图形类示例避免打开 GUI 窗口,适合截图和自动化验证。
高级功能
plotnine 的进阶能力在分层和分面。把不同统计视角拆成 geom 和 facet,比在一段 imperative 代码里不断改 axes 更容易维护。
进阶示例解决的问题是:把图表配置导出、组合或扩展到更适合工程使用的结构。
importpandasaspdfromplotnineimportggplot,aes,geom_point,facet_wrapdf=pd.DataFrame({"x":[1,2,1,2],"y":[3,5,2,7],"team":["A","A","B","B"]})p=ggplot(df,aes("x","y",color="team"))+geom_point(size=3)+facet_wrap("team")fig=p.draw(show=False)print("facets:",type(p.facet).__name__)print("panels:",len(fig.axes))
适用场景
适合统计探索、分组对比、教学材料、从 ggplot2 迁移来的团队,以及需要统一图形语法的分析脚本。
不适用场景
不适合极复杂的交互式 Web 图表,或需要直接操控 Matplotlib 底层每个 Artist 的精细场景。
上线检查
- 明确图表是静态导出、Notebook 交互、桌面 GUI 还是 Web 嵌入。
总结
plotnine 的优雅来自图形语法。数据关系复杂时,它比手工堆图层更容易读。