pylocuszoom 1.1.0__tar.gz → 1.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/CHANGELOG.md +7 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/PKG-INFO +12 -12
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/README.md +11 -11
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/pyproject.toml +1 -1
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/__init__.py +1 -1
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/uv.lock +1 -1
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/.gitattributes +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/.github/workflows/ci.yml +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/.github/workflows/publish.yml +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/.gitignore +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/.pre-commit-config.yaml +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/CONTRIBUTING.md +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/LICENSE.md +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/bioconda/meta.yaml +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/docs/ARCHITECTURE.md +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/docs/CODEMAP.md +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/docs/USER_GUIDE.md +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/eqtl_bokeh.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/eqtl_overlay.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/eqtl_plotly.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/finemapping_bokeh.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/finemapping_plot.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/finemapping_plotly.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/forest_plot.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/generate_example_plots.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/getting_started.ipynb +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_bokeh.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_plot.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_plotly.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_qq_bokeh.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_qq_canine.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_qq_plotly.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_qq_sidebyside.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_qq_stacked.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_qq_stacked_bokeh.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_qq_stacked_plotly.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_stacked.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_stacked_bokeh.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/manhattan_stacked_plotly.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/phewas_plot.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/qq_bokeh.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/qq_plot.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/qq_plotly.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/regional_plot.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/regional_plot_with_recomb.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/regional_recomb_bokeh.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/regional_recomb_plotly.html +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/examples/stacked_plot.png +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/logo.svg +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/_plotter_utils.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/backends/__init__.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/backends/base.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/backends/bokeh_backend.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/backends/hover.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/backends/matplotlib_backend.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/backends/plotly_backend.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/colors.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/config.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/ensembl.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/eqtl.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/exceptions.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/finemapping.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/forest.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/gene_track.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/labels.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/ld.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/loaders.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/logging.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/manhattan.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/manhattan_plotter.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/phewas.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/plotter.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/py.typed +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/qq.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/recombination.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/reference_data/__init__.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/schemas.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/stats_plotter.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/utils.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/src/pylocuszoom/validation.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/conftest.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_backend_bugs.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_backends.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_colors.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_config.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_edge_cases.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_ensembl.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_ensembl_integration.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_eqtl.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_exceptions.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_finemapping.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_forest.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_gene_track.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_hover.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_labels.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_ld.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_loaders.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_logging.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_manhattan.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_manhattan_plotter.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_notebook_backends.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_phewas.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_plotter.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_plotter_manhattan_qq.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_plotter_utils.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_qq.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_recombination.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_stats_plotter.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_utils.py +0 -0
- {pylocuszoom-1.1.0 → pylocuszoom-1.1.1}/tests/test_validation.py +0 -0
|
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.1.1] - 2026-01-30
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- README images now display correctly on PyPI (use absolute GitHub URLs)
|
|
13
|
+
|
|
8
14
|
## [1.1.0] - 2026-01-30
|
|
9
15
|
|
|
10
16
|
### Added
|
|
@@ -259,6 +265,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
259
265
|
- bokeh >= 3.8.2
|
|
260
266
|
- kaleido >= 0.2.0
|
|
261
267
|
|
|
268
|
+
[1.1.1]: https://github.com/michael-denyer/pyLocusZoom/compare/v1.1.0...v1.1.1
|
|
262
269
|
[1.1.0]: https://github.com/michael-denyer/pyLocusZoom/compare/v1.0.2...v1.1.0
|
|
263
270
|
[1.0.2]: https://github.com/michael-denyer/pyLocusZoom/compare/v1.0.1...v1.0.2
|
|
264
271
|
[1.0.1]: https://github.com/michael-denyer/pyLocusZoom/compare/v1.0.0...v1.0.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pylocuszoom
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.1
|
|
4
4
|
Summary: Publication-ready regional association plots with LD coloring, gene tracks, and recombination overlays
|
|
5
5
|
Project-URL: Homepage, https://github.com/michael-denyer/pylocuszoom
|
|
6
6
|
Project-URL: Documentation, https://github.com/michael-denyer/pylocuszoom#readme
|
|
@@ -53,7 +53,7 @@ Description-Content-Type: text/markdown
|
|
|
53
53
|
[](https://plotly.com/python/)
|
|
54
54
|
[](https://bokeh.org/)
|
|
55
55
|
[](https://pandas.pydata.org/)
|
|
56
|
-
<img src="logo.svg" alt="pyLocusZoom logo" width="120" align="right">
|
|
56
|
+
<img src="https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/logo.svg" alt="pyLocusZoom logo" width="120" align="right">
|
|
57
57
|
# pyLocusZoom
|
|
58
58
|
|
|
59
59
|
Designed for publication-ready GWAS visualization with regional association plots, gene tracks, eQTL, PheWAS, fine-mapping, and forest plots.
|
|
@@ -71,7 +71,7 @@ Inspired by [LocusZoom](http://locuszoom.org/) and [locuszoomr](https://github.c
|
|
|
71
71
|
- **SNP labels (matplotlib)**: Automatic labeling of top SNPs by p-value (RS IDs)
|
|
72
72
|
- **Hover tooltips (Plotly and Bokeh)**: Detailed SNP data on hover
|
|
73
73
|
|
|
74
|
-

|
|
74
|
+

|
|
75
75
|
*Regional association plot with LD coloring, gene/exon track, recombination rate overlay (blue line), and top SNP labels.*
|
|
76
76
|
|
|
77
77
|
2. **Stacked plots**: Compare multiple GWAS/phenotypes vertically
|
|
@@ -254,7 +254,7 @@ fig = plotter.plot_stacked(
|
|
|
254
254
|
)
|
|
255
255
|
```
|
|
256
256
|
|
|
257
|
-

|
|
257
|
+

|
|
258
258
|
*Stacked plot comparing two phenotypes with LD coloring and shared gene track.*
|
|
259
259
|
|
|
260
260
|
## eQTL Overlay
|
|
@@ -283,7 +283,7 @@ fig = plotter.plot_stacked(
|
|
|
283
283
|
)
|
|
284
284
|
```
|
|
285
285
|
|
|
286
|
-

|
|
286
|
+

|
|
287
287
|
*eQTL overlay with effect direction (up/down triangles) and magnitude binning.*
|
|
288
288
|
|
|
289
289
|
## Fine-mapping Visualization
|
|
@@ -312,7 +312,7 @@ fig = plotter.plot_stacked(
|
|
|
312
312
|
)
|
|
313
313
|
```
|
|
314
314
|
|
|
315
|
-

|
|
315
|
+

|
|
316
316
|
*Fine-mapping visualization with PIP line and credible set coloring (CS1/CS2).*
|
|
317
317
|
|
|
318
318
|
## PheWAS Plots
|
|
@@ -333,7 +333,7 @@ fig = plotter.plot_phewas(
|
|
|
333
333
|
)
|
|
334
334
|
```
|
|
335
335
|
|
|
336
|
-

|
|
336
|
+

|
|
337
337
|
*PheWAS plot showing associations across phenotype categories with significance threshold.*
|
|
338
338
|
|
|
339
339
|
## Forest Plots
|
|
@@ -356,7 +356,7 @@ fig = plotter.plot_forest(
|
|
|
356
356
|
)
|
|
357
357
|
```
|
|
358
358
|
|
|
359
|
-

|
|
359
|
+

|
|
360
360
|
*Forest plot with effect sizes, confidence intervals, and weight-proportional markers.*
|
|
361
361
|
|
|
362
362
|
## Manhattan Plots
|
|
@@ -379,7 +379,7 @@ fig = plotter.plot_manhattan(
|
|
|
379
379
|
fig.savefig("manhattan.png", dpi=150)
|
|
380
380
|
```
|
|
381
381
|
|
|
382
|
-

|
|
382
|
+

|
|
383
383
|
*Manhattan plot showing genome-wide associations with chromosome coloring and significance threshold.*
|
|
384
384
|
|
|
385
385
|
Categorical Manhattan plots (PheWAS-style) are also supported:
|
|
@@ -411,7 +411,7 @@ fig = plotter.plot_qq(
|
|
|
411
411
|
fig.savefig("qq_plot.png", dpi=150)
|
|
412
412
|
```
|
|
413
413
|
|
|
414
|
-

|
|
414
|
+

|
|
415
415
|
*QQ plot with 95% confidence band and genomic inflation factor (λ).*
|
|
416
416
|
|
|
417
417
|
## Stacked Manhattan Plots
|
|
@@ -436,7 +436,7 @@ fig = plotter.plot_manhattan_stacked(
|
|
|
436
436
|
fig.savefig("manhattan_stacked.png", dpi=150)
|
|
437
437
|
```
|
|
438
438
|
|
|
439
|
-

|
|
439
|
+

|
|
440
440
|
*Stacked Manhattan plots comparing three GWAS studies with shared chromosome axis.*
|
|
441
441
|
|
|
442
442
|
## Manhattan and QQ Side-by-Side
|
|
@@ -462,7 +462,7 @@ fig = plotter.plot_manhattan_qq(
|
|
|
462
462
|
fig.savefig("manhattan_qq.png", dpi=150)
|
|
463
463
|
```
|
|
464
464
|
|
|
465
|
-

|
|
465
|
+

|
|
466
466
|
*Combined Manhattan and QQ plot showing genome-wide associations and p-value distribution.*
|
|
467
467
|
|
|
468
468
|
## PySpark Support
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://plotly.com/python/)
|
|
8
8
|
[](https://bokeh.org/)
|
|
9
9
|
[](https://pandas.pydata.org/)
|
|
10
|
-
<img src="logo.svg" alt="pyLocusZoom logo" width="120" align="right">
|
|
10
|
+
<img src="https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/logo.svg" alt="pyLocusZoom logo" width="120" align="right">
|
|
11
11
|
# pyLocusZoom
|
|
12
12
|
|
|
13
13
|
Designed for publication-ready GWAS visualization with regional association plots, gene tracks, eQTL, PheWAS, fine-mapping, and forest plots.
|
|
@@ -25,7 +25,7 @@ Inspired by [LocusZoom](http://locuszoom.org/) and [locuszoomr](https://github.c
|
|
|
25
25
|
- **SNP labels (matplotlib)**: Automatic labeling of top SNPs by p-value (RS IDs)
|
|
26
26
|
- **Hover tooltips (Plotly and Bokeh)**: Detailed SNP data on hover
|
|
27
27
|
|
|
28
|
-

|
|
28
|
+

|
|
29
29
|
*Regional association plot with LD coloring, gene/exon track, recombination rate overlay (blue line), and top SNP labels.*
|
|
30
30
|
|
|
31
31
|
2. **Stacked plots**: Compare multiple GWAS/phenotypes vertically
|
|
@@ -208,7 +208,7 @@ fig = plotter.plot_stacked(
|
|
|
208
208
|
)
|
|
209
209
|
```
|
|
210
210
|
|
|
211
|
-

|
|
211
|
+

|
|
212
212
|
*Stacked plot comparing two phenotypes with LD coloring and shared gene track.*
|
|
213
213
|
|
|
214
214
|
## eQTL Overlay
|
|
@@ -237,7 +237,7 @@ fig = plotter.plot_stacked(
|
|
|
237
237
|
)
|
|
238
238
|
```
|
|
239
239
|
|
|
240
|
-

|
|
240
|
+

|
|
241
241
|
*eQTL overlay with effect direction (up/down triangles) and magnitude binning.*
|
|
242
242
|
|
|
243
243
|
## Fine-mapping Visualization
|
|
@@ -266,7 +266,7 @@ fig = plotter.plot_stacked(
|
|
|
266
266
|
)
|
|
267
267
|
```
|
|
268
268
|
|
|
269
|
-

|
|
269
|
+

|
|
270
270
|
*Fine-mapping visualization with PIP line and credible set coloring (CS1/CS2).*
|
|
271
271
|
|
|
272
272
|
## PheWAS Plots
|
|
@@ -287,7 +287,7 @@ fig = plotter.plot_phewas(
|
|
|
287
287
|
)
|
|
288
288
|
```
|
|
289
289
|
|
|
290
|
-

|
|
290
|
+

|
|
291
291
|
*PheWAS plot showing associations across phenotype categories with significance threshold.*
|
|
292
292
|
|
|
293
293
|
## Forest Plots
|
|
@@ -310,7 +310,7 @@ fig = plotter.plot_forest(
|
|
|
310
310
|
)
|
|
311
311
|
```
|
|
312
312
|
|
|
313
|
-

|
|
313
|
+

|
|
314
314
|
*Forest plot with effect sizes, confidence intervals, and weight-proportional markers.*
|
|
315
315
|
|
|
316
316
|
## Manhattan Plots
|
|
@@ -333,7 +333,7 @@ fig = plotter.plot_manhattan(
|
|
|
333
333
|
fig.savefig("manhattan.png", dpi=150)
|
|
334
334
|
```
|
|
335
335
|
|
|
336
|
-

|
|
336
|
+

|
|
337
337
|
*Manhattan plot showing genome-wide associations with chromosome coloring and significance threshold.*
|
|
338
338
|
|
|
339
339
|
Categorical Manhattan plots (PheWAS-style) are also supported:
|
|
@@ -365,7 +365,7 @@ fig = plotter.plot_qq(
|
|
|
365
365
|
fig.savefig("qq_plot.png", dpi=150)
|
|
366
366
|
```
|
|
367
367
|
|
|
368
|
-

|
|
368
|
+

|
|
369
369
|
*QQ plot with 95% confidence band and genomic inflation factor (λ).*
|
|
370
370
|
|
|
371
371
|
## Stacked Manhattan Plots
|
|
@@ -390,7 +390,7 @@ fig = plotter.plot_manhattan_stacked(
|
|
|
390
390
|
fig.savefig("manhattan_stacked.png", dpi=150)
|
|
391
391
|
```
|
|
392
392
|
|
|
393
|
-

|
|
393
|
+

|
|
394
394
|
*Stacked Manhattan plots comparing three GWAS studies with shared chromosome axis.*
|
|
395
395
|
|
|
396
396
|
## Manhattan and QQ Side-by-Side
|
|
@@ -416,7 +416,7 @@ fig = plotter.plot_manhattan_qq(
|
|
|
416
416
|
fig.savefig("manhattan_qq.png", dpi=150)
|
|
417
417
|
```
|
|
418
418
|
|
|
419
|
-

|
|
419
|
+

|
|
420
420
|
*Combined Manhattan and QQ plot showing genome-wide associations and p-value distribution.*
|
|
421
421
|
|
|
422
422
|
## PySpark Support
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pylocuszoom"
|
|
7
|
-
version = "1.1.
|
|
7
|
+
version = "1.1.1"
|
|
8
8
|
description = "Publication-ready regional association plots with LD coloring, gene tracks, and recombination overlays"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "GPL-3.0-or-later"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|