Description
[](https://mybinder.org/v2/gh/uber/deck.gl/binder) [](https://pydeck.gl) [](https://anaconda.org/conda-forge/pydeck) [](https://pepy.tech/project/pydeck/week) # pydeck: Large-scale interactive data visualization in Python [](https://pydeck.gl/) The pydeck library is a set of Python bindings for making spatial visualizations with [deck.gl](https://deck.gl), optimized for a Jupyter environment. To get started, __[see the documentation](https://pydeck.gl/)__. __[To install pydeck, see the instructions here](https://pydeck.gl/en/latest/installation.html)__. For __interactive demos__, click the binder logo below: [](https://mybinder.org/v2/gh/uber/deck.gl/binder) ## Sample code The following code renders a visualization similar to the one above in a Jupyter notebook: ```python import pydeck as pdk # 2014 locations of car accidents in the UK UK_ACCIDENTS_DATA = ('https://raw.githubusercontent.com/uber-common/' 'deck.gl-data/master/examples/3d-heatmap/heatmap-data.csv') # Define a layer to display on a map layer = pdk.Layer( 'HexagonLayer', UK_ACCIDENTS_DATA, get_position=['lng', 'lat'], auto_highlight=True, elevation_scale=50, pickable=True, elevation_range=[0, 3000], extruded=True, coverage=1) # Set the viewport location view_state = pdk.ViewState( longitude=-1.415, latitude=52.2323, zoom=6, min_zoom=5, max_zoom=15, pitch=40.5, bearing=-27.36) # Render r = pdk.Deck(layers=[layer], initial_view_state=view_state) r.to_html('demo.html') ``` If you're developing outside a Jupyter environment, you can run: ```python r.to_html('demo.html', notebook_display=False) ``` __[See the gallery for more examples.](https://pydeck.gl/#gallery)__ ### Issues and contributing If you encounter an issue, file it in the [deck.gl issues page](https://github.com/visgl/deck.gl/issues/new?assignees=&labels=question&template=question.md&title=) and include your browser's console output, if any. If you'd like to contribute to pydeck, please follow the [deck.gl contribution guidelines](https://github.com/visgl/deck.gl/blob/master/CONTRIBUTING.md) and the [pydeck development installation instructions](https://pydeck.gl/en/latest/contributing.html).
Release History
| Version | Changes | Urgency | Date |
|---|---|---|---|
| 0.9.2 | Imported from PyPI (0.9.2) | Low | 4/21/2026 |
| v9.3.1 | - feat(widgets): ScrollbarWidget falls back to controller.maxBounds (#10236) - fix(widgets): ThemeWidget does not apply theme variables on initial add (#10238) - fix(widgets): CoordinateGeocoder edge case handling (#10235) - feat(widgets) unify viewId handling (#10234) - fix(widgets): SplitterWidget types (#10233) | High | 4/17/2026 |
| v9.3.0 | deck.gl v9.3 features big improvements to widgets, controllers and WebGPU. Find out more on [What's New](https://deck.gl/docs/whats-new) and [Upgrade Guide](https://deck.gl/docs/upgrade-guide). | Medium | 4/13/2026 |
| v9.3.0-beta.2 | - fix(widgets): ZoomWidget works with OrthographicView (#10202) - fix(aggregation-layers) Fix nvidia compilation error (#10191) - fix(widgets): Move @floating-ui/dom to dependencies (#10189) | Medium | 4/11/2026 |
| v9.3.0-beta.1 | - feat(extensions): Add dashed stroke support for ScatterplotLayer and TextBackgroundLayer (#9976) - chore(test-utils): Separate tape tests from vitest and clean up CI (#10061) - fix(geo-layers): Ensure zoomOffset is correctly part of the round/ceil Z calculation (#9807) - feat(widgets): Add controlled mode and state callbacks (#9973) - chore(mapbox): Remove MapboxLayer and _renderLayersInGroups (#10163) - fix(mapbox): automatically inject 'mapbox' view in overlaid mode for multi-view consistenc | Medium | 4/7/2026 |
| v9.3.0-alpha.6 | - feat(TileLayer): Add visibleMinZoom & visibleMaxZoom props (#10091) - fix(mapbox): onBefore|AfterRender fires without layers (#10166) - fix(mapbox): Prevent crash when deck uninitialized (#10167) - feat(main): export all widgets from deck.gl main module (#10160) - chore: Bump to luma@9.3.1 & loaders@4.4.1 (#10158) - fix(layers): Texture handling in WebGPU (#10157) - chore: Bump luma.gl@alpha.11 (#10141) - chore(json): Typing improvements (#9641) - feat(core): simplify layer plumbing for WebGPU | Medium | 4/2/2026 |
| v9.3.0-alpha.5 | Release v9.3.0-alpha.5 | Medium | 3/31/2026 |
| v9.3.0-alpha.3 | - feat(core): TerrainController (#10134) | Medium | 3/27/2026 |
| v9.3.0-alpha.2 | - chore: upgrade Node.js from 20 to 22 (#10051) - chore(core): Use non-deprecated props for lighting module (#10121) - feat(layers): add clipping to TextLayer (#10118) - feat(core): FirstPersonController supports maxBounds (#10115) - feat(core): OrthographicView supports maxBounds (#10108) - feat(core): OrbitController supports maxBounds (#10116) - feat(core): GlobeView supports maxBounds (#10111) - feat(core): more intuitive OrbitController (#10117) - feat(core): controller normalizes viewport | Medium | 3/26/2026 |
| v9.3.0-alpha.1 | - fix(Tile3DLayer): Pass through tileset loadOptions to Tileset3D (#10079) - feat(Tile3DLayer): mark rendered tiles as drawn (#10058) - chore: bump to luma.gl@9.3 (#10034) - chore: bump to loaders.gl@4.4 (#9972) - feat(widgets): migrate TimelineWidget to RangeInput (#10071) - feat(widgets): Add ScrollbarWidget (#10068) - fix(TerrainExtension): Handle pick events in TerrainExtension & draped layers (#10037) - fix(widgets): Respect min/maxZoom (#10033) - Upgrade Node.js from 18 to 20 across build, | Low | 3/10/2026 |
| v9.2.11 | - chore: Pin to luma 9.2 & loaders 4.3 (#10062) | Low | 3/5/2026 |
| v9.2.10 | - fix(core): OrbitController keyboard navigation with padding (#10039) - fix(ColumnLayer): radiusUnits pixels (#10035) - fix(jupyter-widget): bundle error (#10032) - fix(google-maps): Robust DOM positioning when interleaved: false (#9992) | Low | 2/27/2026 |
| v9.2.9 | - chore: bump probe.gl (#10025) - fix(widgets): GeocoderWidget dark theme colors (#9899) (#9974) - feat(extensions): PathStyleExtension save 1 instance vertex when highPrecisionDash is not used (#10008) - feat(layers): Stricter layer prop types (#10024) | Low | 2/21/2026 |
| v9.2.8 | - feat(core): Add layout expressions for view positions (#9842) | Low | 2/17/2026 |
| v9.2.7 | - fix(HeatmapLayer): Correct blending in interleaved mode (#9993) - fix(pydeck): Support pandas 3.x compatibility without breaking pandas 2.x (#9988) - fix(core): Enable shader/pipeline caching for attached WebGL devices (#9971) - fix(widgets): StatsWidget (#9984) - feat(core): Add Deck#getView() method (#9948) - feat(core): Add pickable: '3d' option to all Layers (#9937) - chore(deps): bump dependencies from multiple Dependabot PRs (#9956) - Bump to loaders.gl@4.3 (#9965) - chore(mapbox): Remov | Low | 2/12/2026 |
| v9.2.6 | - fix(IconManager) Fix icon frame x/y for auto packed icons (#9928) - fix(mapbox): MapboxOverlay: render deck layers in batches (#9939) - chore: bump luma to 9.2.6 (#9940) - feat(core): Improved GlobeController (#9913) - pydeck: Clarify how to pass full controller options (#9897) - fix(core): Reset interaction state for smooth=false (#9908) - fix(IconLayer): don't generateMipmaps before data loaded (#9909) - fix(carto): More defensive code in RasterLayer (#9911) - feat(core): Add `container` to | Low | 1/16/2026 |
| v9.2.5 | - chore: bump luma 9.2.4 (#9907) - fix(core): Enable shader and pipeline caching by default (#9863) - fix(carto): PointLabelLayer used with formatTiles=mvt (#9906) | Low | 12/9/2025 |
| v9.2.4 | - pydeck: support Maplibre including Globe projection (#9896) - fix(carto): autoLabels support with formatTiles=mvt (#9900) - pydeck: Update to deck@9.2 (#9895) - fix(core): getTooltip disappears when autoHighlight: true and interleaved: true in MapboxOverlay (deck.gl) (#9889) | Low | 12/8/2025 |
| v9.2.3 | - Fix DPR changes in interleaved mode by leveraging onResize callback (#9887) - fix(core): Correctly resize drawing buffer on resize (#9886) - Refactor GeohashLayerProps to extend GeoCellLayerProps (#9875) - fix(carto): VectorTileLayer guard against null layers (#9885) - Fix: Make sizeBasis optional in IconLayer type definition (#9883) - Fix interleaved overlay default parameters (#9871) - fix: Remove widget src import (#9833) | Low | 12/3/2025 |
| v9.2.2 | - chore: tighten peerDependency range to patch (#9821) - Fix type hint of useDevicePixels to allow number input (#9826) | Low | 10/16/2025 |
| v9.2.1 | - Avoid 9.2 breaking change in Widget base class (#9814) - Simplify Widget class constructor (#9815) | Low | 10/8/2025 |
| v9.2.0 | The v9.2 release comes with preview of WebGPU support, and a trove of new widgets. See https://deck.gl/docs/whats-new for a full list. | Low | 10/7/2025 |
| v9.2.0-beta.4 | - Invoke transform function for constant attributes (#9741) - Pass `vertexValid` to SolidPolygonLayer when using binary GeoJSON (#9805) - Add IconLayer sizeBasis prop (#9736) - fix: Maplibre interleaved resize handling (#9803) - Fix potential undefined deck in FPS calculation (#9800) | Low | 10/6/2025 |
| v9.1.15 | - Fix orthographic scroll zoom transitions (#9769) (#9799) | Low | 10/2/2025 |
| v9.2.0-beta.3 | - fix(extensions): correctly activate picking module in terrain picking pass (#9768) - fix(widgets): widget bug bash (#9797) - chore(widgets) audit props and docs (#9796) - fix(maplibre): Update default view once projection is known (#9794) | Low | 9/26/2025 |
| v9.2.0-beta.2 | - chore: bump luma to 9.2.0 (#9792) - fix: HeatmapLayer working with binary data (#9787) - fix: picking on non-geospatial tile layer with modelMatrix (#9703) - CARTO: Support h3 in ClusterTileLayer (#9755) | Low | 9/25/2025 |
| v9.2.0-beta.1 | Release v9.2.0-beta.1 | Low | 9/19/2025 |
| v9.2.0-alpha.3 | - fix(core): orthographic scroll zoom transitions (#9769) - fix(widgets): Minor widget fixes (#9758) - CARTO: Support h3 in HeatmapTileLayer (#9753) - feat(widgets): Support custom widgets in pydeck via custom_libraries (#9745) - feat(core): Add async DeckPicker methods (#9732) - feat(webgpu): Enable transparency for WebGPU and ported example layers (#9730) - fix(webgpu): Emulate constant attributes as buffers and trigger update on constant change (#9726) - fix(layers): correctly identify elevat | Low | 9/16/2025 |
| v9.1.14 | - chore: Lock luma.gl to v9.1 (#9705) | Low | 7/28/2025 |
| v9.1.13 | - fix(google): Do not force canvas resize (#9695) - fix(CARTO): H3 tile bounding box includes edge children (#9693) - fix: onClick callback does not handle dblclick (#9629) - fix(carto): Assign default aggregationExp in fetchMap() (#9668) - fix: filter layers in mapbox overlay, interleaved mode (#9603) | Low | 7/8/2025 |
| v9.2.0-alpha.2 | - CARTO: refactor to remove fetchmap code (#9619) | Low | 6/4/2025 |
| v9.2.0-alpha.1 | - feat(widgets): GeocoderWidget and experimental Geocoders (#9610) - Feature: Add A5Layer (#9626) - feat(widgets) Add StatsWidget (#9623) - feat(widgets): New GimbalWidget (#9614) - feat(widgets): New ContextMenuWidget (#9616) - feat(widgets): FpsWidget (#9607) - feat(widget): Add geocoder support to GeolocateWidget (#9608) - [feat] ViewSelectorWidget (#9591) - chore(widgets): Join Widget and WidgetImpl, clean up widgets (#9576) - feat(core): Add View.clone() method (#9588) - feat(widgets): mini | Low | 5/27/2025 |
| v9.1.12 | - fix: do not touch stencil in _renderPass() (#9630) - chore: Reduce lint errors (#9550) - chore(layers): Change warning to debug message (#9621) | Low | 5/14/2025 |
| v9.1.11 | - CARTO: Make autoLabels prop optional (#9593) | Low | 4/18/2025 |
| v9.1.10 | - CARTO: Automatically add labels to line & polygon layers (#9449) - chore: More lint fixes (#9582) - Feat: Add backgroundBorderRadius to TextLayer (#9447) - CARTO: Do not mutate passed in loadOptions objects (#9580) | Low | 4/17/2025 |
| v9.1.9 | - CARTO: Fallback to hidden tiles for maxDensity (#9578) - fix(carto): RasterTileLayer to support external options (#9561) | Low | 4/14/2025 |
| v9.1.8 | - fix(mapbox): interleaving by reverting #9483 (#9542) | Low | 3/24/2025 |
| v9.1.7 | - Append `.js` to WebGPU shaders for script builds (#9537) - fix(carto): Fix tree-shaking of CartoRasterTileLoader (#9535) | Low | 3/21/2025 |
| v9.1.6 | - CARTO: Default to PointLabelLayer in VectorTileLayer (#9524) - chore: Bump to luma.gl@9.1.5 (WebGPU fixes) (#9525) - feat: line layer and project module port to WGSL, test app for WebGPU line (#9509) - fix(chore): Disable constant attributes under WebGPU (#9506) - chore: WebGPU plumbing (#9502) | Low | 3/19/2025 |
| v9.1.5 | - DataFilterExtension: Make filterCategories prop optional (#9495) - CARTO: RasterLayer improve shader precision at high zooms (#9518) - fix(scatterplot-layer): use numeric uniform for "filled" to avoid GPU driver bug (#9514) - chore: WebGPU plumbing (#9480) - chore: WebGPU plumbing #1 (#9476) - feat(widgets): new ResetViewWidget (#9478) - feat(widgets): New ScreenshotWidget (#9477) | Low | 3/12/2025 |
| v9.1.4 | - feat(mapbox): support Mapbox v3 Standard style slot (#9468) - fix(mapbox): relax MapboxOverlay type (#9467) - fix(widgets): ZoomWidget: Prevent crash when used with OrthographicView (#9459) | Low | 2/27/2025 |
| v9.1.3 | - CARTO: HeatmapTileLayer fix palette updating (#9453) - pydeck: Set default map style if not provided (#9419) | Low | 2/20/2025 |
| v9.1.2 | - pydeck: Add show_error flag to display error in cell output (#9430) - CARTO: Add worker for cartoPropertiesTile loader (#9429) | Low | 2/17/2025 |
| v9.1.1 | - fix: Add missing dependencies (#9422) - fix(core): React StrictMode crash (#9421) - fix(extensions): CollisionFilterEffect: Explicitly pass isPicking to preRender (#9417) | Low | 2/11/2025 |
| v9.0.41 | - CollisionFilterEffect: Explicitly pass isPicking to preRender (#9417) | Low | 2/11/2025 |
| v9.1.0 | v9.1 brings integration with MapLibre globe projection, React widgets, restored and improved aggregation layers, and under-the-hood rewrites to get ready for WebGPU support. Visit [What's New](https://github.com/visgl/deck.gl/blob/9.1-release/docs/whats-new.md#deckgl-v91) to learn about the new features. Reference the [Upgrade Guide](https://github.com/visgl/deck.gl/blob/9.1-release/docs/upgrade-guide.md#upgrading-to-v91) to upgrade your application from v9.0. | Low | 1/21/2025 |
| v9.0.40 | - chore: pin ubuntu CI version to fix release workflow (#9351) | Low | 1/15/2025 |
| v9.0.39 | - CARTO: Support gzip compression in RasterLayer (#9352) - fix(widgets): widget style prop keys should accept camelCase css properties and dashed css variables (#8991) | Low | 1/15/2025 |
| v9.1.0-beta.3 | - CARTO: Support gzip compression in RasterLayer (#9352) - DataFilterExtension category filtering uint32 attribute (#9350) | Low | 1/15/2025 |
| v9.0.38 | - CARTO: Fix seams between tiles in RasterTileLayer (#9292) | Low | 12/11/2024 |
| v9.0.37 | - fix(mapbox) Remove type dependency on mapbox-gl (#9279) | Low | 12/6/2024 |
