返回

文章详情

展示 HN: XY – 快速、可组合、GPU 加速的图表,使用 Rust 编写

Hacker News2026年7月28日 15:54

XY 是一个极其快速、交互式和可定制的 Python 图表库,适用于网页、笔记本和静态导出。图表可以按照声明方式或通过 matplotlib 约定进行组合。您可以使用 Python、CSS 或 Tailwind 完全自定义它们。对于小图表,每个点都被发送到浏览器。对于大图表,Rust 核心仅根据其分辨率计算屏幕需要显示的内容。平移、缩放、悬停和选择可以通过针对新范围运行相同的过程来显示完整详细信息,而选择返回原始行。使用 XY,我们渲染了 OpenStreetMap 的全部内容——一个 10,000,000,000 点的数据集。查看示例 → 重要信息 XY 目前处于 alpha 版本,并且正在频繁增强。⭐️ 给代码库加星,跟踪进展。XY 适合我吗?XY 适合任何想要一个灵活图表库的 Python 用户,适用于从日常绘图到自定义应用程序视觉效果和大型数据集。构建图表一次,然后可以在笔记本和网页应用程序中使用,或导出为 HTML、PNG、SVG 或 PDF。安装 pip install xy # 或使用 uv uv add xy 入门 图表是一个容器,加上其中的标记。任何序列都可以;NumPy 是可选的。 import xy chart = xy.line_chart(xy.line([1, 2, 3, 4, 5], [120, 180, 165, 240, 310])) # chart.to_html("chart.html") # chart.to_png("chart.png") # chart.to_svg("chart.svg") chart # 笔记本呈现它 同样的 API 可以扩展到一亿个点的密度表面: import numpy as np import xy rng = np.random.default_rng(7) n = 100_000_000 r = 6.0 * rng.beta(1.2, 3.0, n) theta = 2.9 * np.log1p(r) + rng.integers(0, 4, n) * (np.pi / 2) + rng.normal(0, 0.045 + 0.016 * r, n) chart = xy.scatter_chart(xy.scatter(r * np.cos(theta), r * np.sin(theta), color=np.exp(-r / 2.2), colormap="magma_r", density=True, opacity=0.85, # 一旦视图深入到真实行中,标记会生长并变得坚固。size=2.5, zoom_size_factor=2.6, zoom_opacity=0.95,), xy.theme(background="#ffffff", plot_background="#ffffff", grid_color="#e6e6e1", axis_color="#c3c2b7", text_color="#0b0b0b",), title="一亿个点",) chart 来自 matplotlib 对于常见的 pyplot 工作流,只需更改导入并保持绘图代码: import numpy as np import xy.pyplot as plt x = np.linspace(0, 10, 200) fig, ax = plt.subplots() ax.plot(x, np.sin(x), "r--", label="信号") ax.legend() plt.show() 请参阅兼容性指南;并非所有图表和功能都得到支持。自定义每一层 使用 Python 控制图表,从标记和轴到交互和布局。 标记:控制颜色、大小、不透明度、符号、渐变、轮廓、曲线和颜色映射。 指南:自定义轴、刻度、网格、注释、图例、颜色条和工具提示。 交互:添加平移、缩放、悬停、选择、十字准线、回调和链接图表。 布局:创建层和面板,设置响应维度并应用主题。 chart = xy.line_chart(xy.line(x, y, color="#7c3aed", width=3), class_name="rounded-xl bg-white", class_names={"tooltip": "rounded-lg bg-zinc-900 text-white"},) 请查看样式指南以获取示例。有关可以自定义的详细分解,请参见能力矩阵。 基准测试 实时交互图表,10k 到 100M 点。每个库获取每一行,并通过其自己的输入路径在真实浏览器中驱动。时钟仅在画布正确(已验证的哨兵点)且稳定(10 个字节相同的帧)时停止,因此渐进渲染器在最后一块到达之前是被计费的。XY 在 10k 处保持 0.071 秒,在 100M 处保持 0.081 秒,跨四个数量级保持平坦,因为超过 200k 行时,它绘制一个屏幕边界的密度表面,而不是每行一个标记,并且缩放可以回到确切的行。每个精确标记路径反而与 N 成比例:Matplotlib 在 ~3M 时超过一秒,并在 50M 时达到 13.4 秒;Plotly 在 ~2.5M 时超过,并在 25M 时达到 9.8 秒。浅色线是 XY 的 density=False:相同的引擎绘制每行一个标记,未进行聚合信用。它在 1.34 秒内在 5.26 GiB 上渲染 100M 个精确标记。每个点出现在屏幕上的时间,以秒为单位。 ✕ 是库未渲染的大小:Plotly 在 50M 时从未完成构建图形,Matplotlib 在 100M 时绘制但从未解决后续的缩放。 点数 10k 100k 500k 1M 2.5M 5M 10M 25M 50M 100M XY 加速 1× 2× 3× 4× 9× 16× 34× 89× 177× — XY 0.071 0.072 0.075 0.084 0.083 0.089 0.083 0.077 0.076 0.081 XY (density=False) 0.085 0.074 0.087 0.098 0.111 0.144 0.206 0.424 0.645 1.343 Matplotlib (WebAgg) 0.086 0.115 0.224 0.357 0.758 1.424 2.804 6.838 13.385 ✕ Plotly (scattergl) 0.341 0.373 0.477 0.614 1.033 1.785 3.367 9.794 ✕ ✕ Python 端内存峰值,以 GiB 为单位。浏览器内存单独跟踪并在此处排除,因为无头 Chrome 在绘制任何内容之前占用 ~1 GiB。 点数 10k 100k 500k

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡