库 / SDK
reflex-dev/xy avatar
reflex-dev/xy

XY 图表库实测评估:Rust 内核驱动的 Python 绘图,能否取代 Matplotlib 与 Plotly?

项目速览:超快速且可定制的 Python 图表。自定义每一层 使用 Python 控制图表,从标记和轴到交互和布局。

1,841 个 Star74 个 ForkPythonApache-2.0

秒懂

它是什么?
XY 是一个处于 alpha 阶段的 Python 图表库,用 Rust 内核处理渲染,宣称在 1 亿数据点上保持亚秒级交互。本文基于其 README 与公开资料,拆解其架构、性能声明、适用场景与当前限制。
适合谁用?
XY 适合两类人:一是需要在 Jupyter 或 Web 应用中展示超大数据集(百万级以上)并追求流畅交互的开发者,二是希望用 matplotlib 风格代码快速迁移、同时获得更高性能的用户。不适合生产环境依赖者,因为项目明确标注 alpha,API 可能变动,且 matplotlib 兼容层尚未覆盖全部图表类型。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 13 天前。
用什么语言写的?
主要是 Python(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

一个为超大数据集设计的 Python 图表库

XY 要解决的核心问题是 Python 图表库在大数据量下的性能崩塌。Matplotlib 在 500 万点时会消耗数秒,Plotly 在 2500 万点以上甚至无法完成图表构建。XY 的路线不同:它用 Rust 编写渲染核心,Python 只是声明层的壳。这个设计让它能处理 README 中展示的 1 亿点 OpenStreetMap 数据集,交互延迟保持在 0.08 秒左右。目标用户很明确:需要在 notebook、Web 应用或静态导出中展示大规模数据的 Python 开发者。它不是一个通用绘图库的替代品,而是针对特定痛点(大数据、高交互)的专门工具。

Rust 内核与密度聚合:性能从何而来

XY 的性能机制分两层。小图表(约 20 万行以下)时,每个数据点都作为独立 marker 发送到浏览器。超过这个阈值,Rust 内核不再逐点绘制,而是根据屏幕分辨率计算一个密度表面,把成千上万个点聚合成一个视觉单元。这就是 README 中 1 亿点仍能保持 0.081 秒渲染的原因。缩放或平移时,内核会针对新视口重新计算密度,当用户放大到足够程度,才恢复显示原始数据行。这种设计有明确取舍:你看到的不再是精确点位置,而是统计密度分布。对于散点图、分布图这类场景,这完全合理。但如果你需要每个点都精确可见,比如医学影像标记或地理坐标定位,密度模式会丢失信息,必须显式设置 density=False 才能禁用聚合,此时 1 亿点的渲染时间会飙升到 1.34 秒。

安装与第一行代码:从 matplotlib 迁移有多顺

安装很简单,pip install xy 或 uv add xy 即可。基础用法也足够直观:先创建 line 或 scatter 这样的 mark,再把它放进对应的 chart 容器。README 给出的最小示例是 xy.line_chart(xy.line([1, 2, 3, 4, 5], [120, 180, 165, 240, 310])),然后调用 to_html、to_png、to_svg 导出,或者在 notebook 中直接渲染。对 matplotlib 用户,XY 提供了一个 xy.pyplot 模块,文档声称可以只改 import 语句就保留原有绘图代码。例如 ax.plot(x, np.sin(x), 'r--', label='signal') 这类调用可以直接工作。但这个兼容层有明确限制,README 承认并非所有图表和功能都被支持,具体范围需要查阅 compat.md 文档。迁移前必须核对你的图表类型是否在支持列表内,否则会遇到 NotImplementedError。

定制能力:从颜色到交互的完整控制

XY 的定制粒度比大多数 Python 图表库更细。mark 层面可以控制颜色、大小、透明度、符号、渐变、描边、曲线类型和 colormap。guide 层面包括坐标轴、刻度、网格、标注、图例、色条和 tooltip。交互层面支持平移、缩放、悬停、选择、十字线、回调函数和联动图表。布局层面可以创建图层和分面,设置响应式尺寸和应用主题。一个值得注意的细节是它支持 Tailwind CSS 类名,比如 class_name="rounded-xl bg-white" 可以直接作用于图表容器,这让它在 Reflex Web 应用中的样式整合变得自然。这种 Python、CSS、Tailwind 三路并行的定制方式,在现有 Python 图表库中并不常见。

基准测试的解读:速度与内存的代价

README 中的基准测试设计相当严谨:每个库都通过自己的输入路径在真实浏览器中运行,等到 canvas 上植入的哨兵点确认点亮且连续 10 帧像素完全一致才停止计时。数据很惊人,XY 在 1 万点到 1 亿点之间的渲染时间几乎是一条平线,从 0.071 秒到 0.081 秒。但必须注意,这个成绩是在 density=True 的聚合模式下取得的。关闭聚合后,XY 在 1 亿点需要 1.34 秒,虽然仍远快于 Matplotlib 的 13.4 秒(50M 点),但优势从 177 倍缩小到约 10 倍。内存方面,XY 在 1 亿点时 Python 侧占用 2.58 GiB,而 Matplotlib 在 5000 万点就需要 3.85 GiB。这些数据来自项目自己的基准,没有第三方独立验证,但测试方法的透明度给了它一定可信度。

alpha 阶段的现实:功能缺口与兼容风险

项目状态是 alpha,README 用大写 IMPORTANT 标注了这一点。这意味着 API 可能随时变化,新版本(v0.0.7)发布频率很高,但语义化版本尚未稳定。matplotlib 兼容层是最大的风险点,它只覆盖常用 pyplot 流程,复杂的子图布局、3D 绘图、特殊投影等大概率不支持。另一个限制是密度聚合模式下的交互细节:当视图处于聚合状态时,tooltip 和 selection 返回的是密度单元而非原始行,只有放大到足够程度才能获取原始数据。对于需要精确数据点悬停信息的场景,这可能不符合预期。此外,Rust 内核意味着安装时需要预编译的 wheel 或本地编译工具链,这在某些严格管控的企业环境中可能成为障碍。

与 Matplotlib 和 Plotly 的定位差异

XY 不是要取代 Matplotlib,后者在出版级静态图表、复杂布局和科学计算生态中的位置依然稳固。XY 的 matplotlib 兼容层是一种迁移便利,而不是功能对等。Plotly 的优势在于丰富的交互组件(如 3D、地图、仪表盘)和 Dash 应用生态,XY 目前只专注于二维坐标图。真正的差异化在于数据规模:当你的数据超过 100 万点,Plotly 的 scattergl 在 2500 万点就无法完成构建,而 XY 在 1 亿点仍然流畅。如果你同时需要 Web 应用部署,XY 与 Reflex 框架同属一家,集成路径会更顺畅。选择的关键在于你的数据量级和交互需求,而不是单纯比较功能列表。

维护成本与许可证的考量

项目采用 Apache-2.0 许可证,这对商业使用友好,允许修改和再分发,只需保留版权声明。维护活跃度从提交频率可见一斑,v0.0.7 在 2026 年 8 月 27 日发布,同一天还有两个预发布版本,说明开发节奏很快。但快节奏也带来升级成本:每次版本更新都可能引入 API 变化,你需要跟踪 changelog 并调整代码。文档方面,README 提供了 capability matrix 和 styling guide 的链接,但项目仍处于早期,完整的 API 参考和迁移指南可能不够完善。对于生产项目,建议锁定版本并做好回归测试;对于实验性项目,则可以跟随最新版本体验新功能。

编辑结论

XY 适合两类人:一是需要在 Jupyter 或 Web 应用中展示超大数据集(百万级以上)并追求流畅交互的开发者,二是希望用 matplotlib 风格代码快速迁移、同时获得更高性能的用户。不适合生产环境依赖者,因为项目明确标注 alpha,API 可能变动,且 matplotlib 兼容层尚未覆盖全部图表类型。采用前需验证三件事:你的数据规模是否真的超过 20 万行(低于此值 XY 与 Matplotlib 性能差距不大),你的图表类型是否在兼容列表中,以及 Rust 编译链在你目标部署环境(如离线服务器)是否可用。XY 的性能优势建立在密度聚合机制上,若你的场景必须逐点精确显示且不能接受缩放后才显示细节,它可能不是正确选择。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记