XY – 빠른, 컴포저블한, GPU 가속화된 Python 차트 라이브러리 (알파)
XY – 빠른, 컴포저블한, GPU 가속화된 Python 차트 라이브러리 (알파)
XY 개요
XY는 웹, 노트북, 정적 내보내기를 위한 알파 단계의 GPU 가속화된 Python 차트 라이브러리입니다. 선언형 또는 matplotlib 스타일의 차트 구성을 허용하며, Python, CSS, 또는 Tailwind을 사용해 완전 사용자 정의가 가능합니다. 작은 차트는 모든 점을 브라우저로 전송하고, 큰 차트는 화면 해상도에 기반하여 화면에 표시해야 하는 것만 계산하는 Rust 코어를 사용하며, 팬, 줌, 호버, 선택은 원래 행을 정확히 반환할 수 있습니다. 이 라이브러리는 OpenStreetMap 전체—10 000 000 000 점 데이터셋—to 렌더링했습니다.
설치 및 기본 사용법
pip install xy 또는 uv add xy로 XY를 설치합니다. 차트는 컨테이너와 마크로부터 구성되며, 어떤 시퀀스도 작동하고 NumPy는 선택 사항입니다. 예를 들어:
import xy
chart = xy.line_chart(xy.line([1, 2, 3, 4, 5], [120, 180, 165, 240, 310]))
chart # renders in notebooks
같은 API는 대용량 데이터에도 확장 가능하며, NumPy 배열과 density=True 플래그를 사용해 1억 점 산점도 차트를 만들 수 있습니다.
성능 특성
벤치마크 결과에 따르면 XY의 렌더링 시간은 4단계 규모에서 일정하게 유지됩니다: 10k 점에서 0.071 s, 100M 점에서 0.081 s. 이와 같은 평탄함은 200k 행 이상에서 XY가 행당 하나의 마커 대신 화면 경계 내의 밀도 표면을 그리기 때문이며, 줌을 통해 정확한 행으로 다시 drill down할 수 있습니다. 정확한 마커 경로(density=False)는 선형적으로 확장되어 100M 점에서 1.34 s에 도달합니다. Matplotlib과 Plotly의 비교 타이밍은 급격히 증가하며, Matplotlib은 약 3M 점에서 1초를 초과하고 Plotly는 약 2.5M 점에서 그러합니다.
메모리 사용량
XY의 Python 측 상주 메모리는 modest하게 증가합니다: 10k 점에서 0.05 GiB, 2.5M 점에서 0.13 GiB, 100M 점에서 2.58 GiB. 정확한 마커 기준선(density=False)는 메모리를 약 두 배 사용합니다(100M 점에서 5.26 GiB). Matplotlib과 Plotly는 동일한 크기에서 더 많은 메모리를 소비하며, 각각 50M 점에서 3.85 GiB와 측정 불가 값을 보입니다.
XY의 내부 작동 방식
XY는 ColumnStore에 정식 f64 데이터를 유지합니다. 네이티브 Rust 계산 단계는 보이는 뷰포트에 기반하여 직접, 디시메이트, 또는 밀도 표현 중 하나를 생성합니다. 브라우저로 전송되는 페이로드는 컴팩트한 JSON 사양과 타입이 지정된 바이너리 버퍼로 구성됩니다. 브라우저는 WebGL2 마크, Canvas 축, 그리고 DOM 인터페이스를 렌더링합니다. 원래의 f64 컬럼이 Python에 남아 있기 때문에 호버 및 선택 상호작용을 통해 원래 행을 반환할 수 있습니다.
Reflex와의 통합
reflex-xy 어댑터는 JavaScript, iframe, 또는 별도의 차트 서비스 없이 cualquier XY 차트를 일반 Reflex 구성 요소로 변환합니다. pip install reflex-xy 또는 uv add reflex-xy로 설치합니다. rxconfig.py에서 어댑터를 한 번 등록합니다:
import reflex as rx
import reflex_xy
config = rx.Config(app_name="dashboard", plugins=[reflex_xy.XYPlugin()])
그런 다음 차트를 삽입합니다:
import reflex as rx
import reflex_xy
import xy
signups = xy.line_chart(xy.line([1, 2, 3, 4, 5], [120, 180, 165, 240, 310]), title="Weekly signups
def index() -> rx.Component:
return rx.card(rx.heading("Growth\)), reflex_xy.chart(signups, height="320px\)), width="100%\)
호버, 팬, 줌은 계속 작동하며, Reflex 상태, 이벤트, 또는 라이브 스트림에 의해 구동되는 차트는 통합 가이드에 따라 지원됩니다.
실제 세계 예시
저장소는 공개 소스에서 데이터를 가져와 다양한 데이터셋을 시각화하는 노트북을 제공합니다:
- Gaia DR3 HR diagram (250 k 별)
- gnomAD v4.1 알레일 빈도 (164 k 변이체)
- Pan‑UKBB Manhattan 플롯 (814 k 변이체)
- Dukascopy EUR/USD 틱 (101 k 틱)
- LIGO GW150914 변형 (16,777,216 원본 샘플, 3,441 표시됨)
- NYC TLC 택시 픽업 밀도 (300 k 레코드)
- OpenStreetMap 예시 (10,000,000,000 노드) 로컬에서 각 노트북은さらに 확장되며, 소스 설명과 워크로드 컨트롤을 포함합니다.
로드맵 및 미래 작업
계획된 기능은 특정 순서 없이 다음과 같습니다:
- Categorical distributions: strip, swarm, beeswarm, boxen, rug
- Regression diagnostics: trendline, residual, QQ, PP
- Scatter matrix and joint plots: SPLOM, pair grid, marginal histograms
- Pie / donut (promoting from
xy.pyplot) - Candlestick / OHLC and finance overlays: SMA, VWAP, Bollinger, RSI, MACD
- Waterfall and funnel
- Treemap, sunburst, and icicle
- Radar / polar and gauge (requires polar axes)
- Slope, bump, and dumbbell
- 3D and volume: scatter, surfaces, meshes, isosurfaces, volumetric views 전체 순위가 매겨진 백로그는 차트 로드맵에 있습니다.
커뮤니티 반응 (Hacker News)
댓글 작성자들은 Rust/Tailwind 조합과 프로젝트에 대한 열정을 강조했습니다:
"Great, Rust와 Tailwind CSS는 내가 좋아하는 두 가지 중 하나입니다." — @farhan99 "수세기 동안 matplotlib에 빠져 있었는데, 학계에서는 이런 변화를 좋아합니다." — @NickyHeC "이거 awesome해요,これが 표준 라이브러리가 될 거라고 쉽게 볼 수 있어요. 3D 및 볼륨 시각화가 기다려집니다." — @HoneySpoons 일부에서는 일반적인 대시보드에 대한 GPU acceleration의 필요성을 의문시했습니다: "I’m not convinced GPU acceleration is a meaningful advantage for most charting use cases. Most dashboards don’t render enough data for it to matter. Once a chart is dense enough for rendering to become the bottleneck, it normally is already be too crowded to be meaningful. Zooming can justify supporting larger datasets, but sampling/viewport culling and level of detail often avoid drawing unnecessary points..." — @kasts 다른 사람들은 누락된 기능이나 비교에 대해 물었습니다: "네이티브 GUI 지원은 없나요?" — @cozzyd "흥미롭네요; 예시들이 datashader와 어떻게 비교되나요?" — @ahns "이게 evilcharts과 어떻게 비교되나요? 내 주요 사용 사례는 프론트엔드에 데이터를 매핑하는 것이며, draußen에는 많은 훌륭한 라이브러리가 있습니다." — @kl01 몇몇은 라이브러리의 out‑of‑core 렌더링 잠재력을 언급했습니다: "XY로 out‑of‑core 방식으로 데이터를 렌더링할 수 있어, OpenStreetMaps 전체(그게 10,742,674,832 노드!)를 서브세컨드 팬/줌으로 렌더링할 수 있습니다. 온라인으로 호스팅하기는 조금 어렵지만 로컬에서 시도해 볼 수 있습니다." — @adhami