pylocuszoom 1.1.2__py3-none-any.whl → 1.3.1__py3-none-any.whl

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.
@@ -395,6 +395,45 @@ def get_recombination_rate_for_region(
395
395
  return region_df[["pos", "rate"]]
396
396
 
397
397
 
398
+ def ensure_recomb_maps(
399
+ species: str = "canine",
400
+ data_dir: Optional[str] = None,
401
+ ) -> Optional[Path]:
402
+ """Ensure recombination maps are available, downloading if needed.
403
+
404
+ Args:
405
+ species: Species name ('canine', 'feline', etc.).
406
+ data_dir: Directory for recombination maps. Uses default if None.
407
+
408
+ Returns:
409
+ Path to recombination maps directory, or None if species not supported
410
+ or download fails.
411
+ """
412
+ if species != "canine":
413
+ logger.debug(f"No built-in recombination maps for species: {species}")
414
+ return None
415
+
416
+ if data_dir is not None:
417
+ output_path = Path(data_dir)
418
+ else:
419
+ output_path = get_default_data_dir()
420
+
421
+ # Check if maps already exist
422
+ if output_path.exists():
423
+ existing_files = list(output_path.glob("chr*_recomb.tsv"))
424
+ if len(existing_files) >= 39: # 38 autosomes + X
425
+ logger.debug(f"Recombination maps already exist at {output_path}")
426
+ return output_path
427
+
428
+ # Download maps with error handling
429
+ logger.info("Downloading canine recombination maps...")
430
+ try:
431
+ return download_canine_recombination_maps(output_dir=str(output_path))
432
+ except Exception as e:
433
+ logger.warning(f"Could not download recombination maps: {e}")
434
+ return None
435
+
436
+
398
437
  def add_recombination_overlay(
399
438
  ax: Axes,
400
439
  recomb_df: pd.DataFrame,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pylocuszoom
3
- Version: 1.1.2
3
+ Version: 1.3.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
@@ -35,6 +35,7 @@ Requires-Dist: tqdm>=4.60.0
35
35
  Provides-Extra: all
36
36
  Requires-Dist: pyspark>=3.0.0; extra == 'all'
37
37
  Provides-Extra: dev
38
+ Requires-Dist: hypothesis>=6.0.0; extra == 'dev'
38
39
  Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
39
40
  Requires-Dist: pytest-randomly>=3.0.0; extra == 'dev'
40
41
  Requires-Dist: pytest-xdist>=3.0.0; extra == 'dev'
@@ -71,20 +72,23 @@ Inspired by [LocusZoom](http://locuszoom.org/) and [locuszoomr](https://github.c
71
72
  - **SNP labels (matplotlib)**: Automatic labeling of top SNPs by p-value (RS IDs)
72
73
  - **Hover tooltips (Plotly and Bokeh)**: Detailed SNP data on hover
73
74
 
74
- ![Example regional association plot with LD coloring, gene track, and recombination overlay](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/regional_plot_with_recomb.png)
75
+ ![Example regional association plot with LD coloring, gene track, and recombination overlay](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/regional_plot_with_recomb.png)
75
76
  *Regional association plot with LD coloring, gene/exon track, recombination rate overlay (blue line), and top SNP labels.*
76
77
 
77
78
  2. **Stacked plots**: Compare multiple GWAS/phenotypes vertically
78
- 3. **Manhattan plots**: Genome-wide association visualization with chromosome coloring
79
- 4. **QQ plots**: Quantile-quantile plots with confidence bands and genomic inflation factor
80
- 5. **eQTL plot**: Expression QTL data aligned with association plots and gene tracks
81
- 6. **Fine-mapping plots**: Visualize SuSiE credible sets with posterior inclusion probabilities
82
- 7. **PheWAS plots**: Phenome-wide association study visualization across multiple phenotypes
83
- 8. **Forest plots**: Meta-analysis effect size visualization with confidence intervals
84
- 9. **Multiple backends**: matplotlib (publication-ready), plotly (interactive), bokeh (dashboard integration)
85
- 10. **Pandas and PySpark support**: Works with both Pandas and PySpark DataFrames for large-scale genomics data
86
- 11. **Convenience data file loaders**: Load and validate common GWAS, eQTL and fine-mapping file formats
87
- 12. **Automatic gene annotations**: Fetch gene/exon data from Ensembl REST API with caching (human, mouse, rat, canine, feline, and any Ensembl species)
79
+ 3. **Miami plots**: Mirrored Manhattan plots for comparing two GWAS datasets (discovery vs replication)
80
+ 4. **Manhattan plots**: Genome-wide association visualization with chromosome coloring
81
+ 5. **QQ plots**: Quantile-quantile plots with confidence bands and genomic inflation factor
82
+ 6. **eQTL plot**: Expression QTL data aligned with association plots and gene tracks
83
+ 7. **Fine-mapping plots**: Visualize SuSiE credible sets with posterior inclusion probabilities
84
+ 8. **PheWAS plots**: Phenome-wide association study visualization across multiple phenotypes
85
+ 9. **Forest plots**: Meta-analysis effect size visualization with confidence intervals
86
+ 10. **LD heatmaps**: Triangular heatmaps showing pairwise LD patterns, standalone or integrated below regional plots
87
+ 11. **Colocalization plots**: GWAS-eQTL scatter plots with LD coloring, correlation statistics, and effect direction visualization
88
+ 12. **Multiple backends**: matplotlib (publication-ready), plotly (interactive), bokeh (dashboard integration)
89
+ 12. **Pandas and PySpark support**: Works with both Pandas and PySpark DataFrames for large-scale genomics data
90
+ 13. **Convenience data file loaders**: Load and validate common GWAS, eQTL and fine-mapping file formats
91
+ 14. **Automatic gene annotations**: Fetch gene/exon data from Ensembl REST API with caching (human, mouse, rat, canine, feline, and any Ensembl species)
88
92
 
89
93
  ## Installation
90
94
 
@@ -254,7 +258,7 @@ fig = plotter.plot_stacked(
254
258
  )
255
259
  ```
256
260
 
257
- ![Example stacked plot comparing two phenotypes](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/stacked_plot.png)
261
+ ![Example stacked plot comparing two phenotypes](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/stacked_plot.png)
258
262
  *Stacked plot comparing two phenotypes with LD coloring and shared gene track.*
259
263
 
260
264
  ## eQTL Overlay
@@ -283,7 +287,7 @@ fig = plotter.plot_stacked(
283
287
  )
284
288
  ```
285
289
 
286
- ![Example eQTL overlay plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/eqtl_overlay.png)
290
+ ![Example eQTL overlay plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/eqtl_overlay.png)
287
291
  *eQTL overlay with effect direction (up/down triangles) and magnitude binning.*
288
292
 
289
293
  ## Fine-mapping Visualization
@@ -312,28 +316,130 @@ fig = plotter.plot_stacked(
312
316
  )
313
317
  ```
314
318
 
315
- ![Example fine-mapping plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/finemapping_plot.png)
319
+ ![Example fine-mapping plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/finemapping_plot.png)
316
320
  *Fine-mapping visualization with PIP line and credible set coloring (CS1/CS2).*
317
321
 
322
+ ## LD Heatmaps
323
+
324
+ Create triangular LD heatmaps showing pairwise linkage disequilibrium patterns:
325
+
326
+ ```python
327
+ from pylocuszoom import LDHeatmapPlotter
328
+
329
+ # ld_matrix is a square DataFrame with SNP IDs as index/columns
330
+ # snp_ids is a list of SNP IDs in the matrix
331
+
332
+ ld_plotter = LDHeatmapPlotter()
333
+ fig = ld_plotter.plot(
334
+ ld_matrix,
335
+ snp_ids,
336
+ highlight_snp_id="rs12345", # Highlight lead SNP
337
+ metric="r2", # or "dprime"
338
+ )
339
+ fig.savefig("ld_heatmap.png", dpi=150)
340
+ ```
341
+
342
+ ![Example LD heatmap](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/ld_heatmap.png)
343
+ *Triangular LD heatmap with R² values and lead SNP highlighted.*
344
+
345
+ ### Integrated LD Heatmap with Regional Plot
346
+
347
+ Add an LD heatmap panel below a regional association plot:
348
+
349
+ ```python
350
+ from pylocuszoom import LocusZoomPlotter
351
+
352
+ plotter = LocusZoomPlotter(species="canine")
353
+
354
+ fig = plotter.plot(
355
+ gwas_df,
356
+ chrom=1,
357
+ start=1000000,
358
+ end=2000000,
359
+ lead_pos=1500000,
360
+ ld_heatmap_df=ld_matrix, # Pairwise LD matrix
361
+ ld_heatmap_snp_ids=snp_ids, # SNP IDs in matrix
362
+ ld_heatmap_height=0.25, # Panel height ratio
363
+ )
364
+ ```
365
+
366
+ ![Example regional plot with LD heatmap](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/regional_with_ld_heatmap.png)
367
+ *Regional association plot with integrated LD heatmap panel below.*
368
+
369
+ ## Colocalization Plots
370
+
371
+ Visualize GWAS-eQTL colocalization by comparing association signals in a scatter plot with LD coloring:
372
+
373
+ ```python
374
+ from pylocuszoom import ColocPlotter
375
+
376
+ # GWAS and eQTL data with matching positions
377
+ gwas_df = pd.DataFrame({
378
+ "pos": positions,
379
+ "p": gwas_pvalues,
380
+ "ld_r2": ld_values, # Optional: LD with lead SNP
381
+ })
382
+
383
+ eqtl_df = pd.DataFrame({
384
+ "pos": positions,
385
+ "p": eqtl_pvalues,
386
+ })
387
+
388
+ plotter = ColocPlotter()
389
+ fig = plotter.plot_coloc(
390
+ gwas_df=gwas_df,
391
+ eqtl_df=eqtl_df,
392
+ pos_col="pos",
393
+ gwas_p_col="p",
394
+ eqtl_p_col="p",
395
+ ld_col="ld_r2",
396
+ gwas_threshold=5e-8,
397
+ eqtl_threshold=1e-5,
398
+ )
399
+ fig.savefig("colocalization.png", dpi=150)
400
+ ```
401
+
402
+ ![Example colocalization plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/colocalization_plot.png)
403
+ *GWAS-eQTL colocalization scatter plot with LD coloring and correlation statistics.*
404
+
405
+ **Advanced options** include effect direction coloring and H4 posterior probability display:
406
+
407
+ ```python
408
+ fig = plotter.plot_coloc(
409
+ gwas_df=gwas_df,
410
+ eqtl_df=eqtl_df,
411
+ pos_col="pos",
412
+ gwas_p_col="p",
413
+ eqtl_p_col="p",
414
+ gwas_effect_col="beta",
415
+ eqtl_effect_col="slope",
416
+ color_by_effect=True, # Green=congruent, Red=incongruent
417
+ h4_posterior=0.85, # Display coloc H4 probability
418
+ )
419
+ ```
420
+
318
421
  ## PheWAS Plots
319
422
 
320
423
  Visualize associations of a single variant across multiple phenotypes:
321
424
 
322
425
  ```python
426
+ from pylocuszoom import StatsPlotter
427
+
323
428
  phewas_df = pd.DataFrame({
324
429
  "phenotype": ["Height", "BMI", "T2D", "CAD", "HDL"],
325
430
  "p_value": [1e-15, 0.05, 1e-8, 1e-3, 1e-10],
326
431
  "category": ["Anthropometric", "Anthropometric", "Metabolic", "Cardiovascular", "Lipids"],
327
432
  })
328
433
 
329
- fig = plotter.plot_phewas(
434
+ stats_plotter = StatsPlotter()
435
+ fig = stats_plotter.plot_phewas(
330
436
  phewas_df,
331
437
  variant_id="rs12345",
332
438
  category_col="category",
333
439
  )
334
440
  ```
335
441
 
336
- ![Example PheWAS plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/phewas_plot.png)
442
+ ![Example PheWAS plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/phewas_plot.png)
337
443
  *PheWAS plot showing associations across phenotype categories with significance threshold.*
338
444
 
339
445
  ## Forest Plots
@@ -341,6 +447,8 @@ fig = plotter.plot_phewas(
341
447
  Create forest plots for meta-analysis visualization:
342
448
 
343
449
  ```python
450
+ from pylocuszoom import StatsPlotter
451
+
344
452
  forest_df = pd.DataFrame({
345
453
  "study": ["Study A", "Study B", "Study C", "Meta-analysis"],
346
454
  "effect": [0.45, 0.52, 0.38, 0.46],
@@ -349,24 +457,68 @@ forest_df = pd.DataFrame({
349
457
  "weight": [25, 35, 20, 100],
350
458
  })
351
459
 
352
- fig = plotter.plot_forest(
460
+ stats_plotter = StatsPlotter()
461
+ fig = stats_plotter.plot_forest(
353
462
  forest_df,
354
463
  variant_id="rs12345",
355
464
  weight_col="weight",
356
465
  )
357
466
  ```
358
467
 
359
- ![Example forest plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/forest_plot.png)
468
+ ![Example forest plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/forest_plot.png)
360
469
  *Forest plot with effect sizes, confidence intervals, and weight-proportional markers.*
361
470
 
471
+ ## Miami Plots
472
+
473
+ Compare two GWAS datasets with mirrored Manhattan plots (top panel ascending, bottom panel inverted):
474
+
475
+ ```python
476
+ from pylocuszoom import MiamiPlotter
477
+
478
+ plotter = MiamiPlotter(species="human")
479
+
480
+ fig = plotter.plot_miami(
481
+ discovery_df,
482
+ replication_df,
483
+ chrom_col="chrom",
484
+ pos_col="pos",
485
+ p_col="p",
486
+ top_label="Discovery",
487
+ bottom_label="Replication",
488
+ top_threshold=5e-8,
489
+ bottom_threshold=1e-6,
490
+ highlight_regions=[("6", 30_000_000, 35_000_000)], # Highlight MHC region
491
+ )
492
+ fig.savefig("miami.png", dpi=150)
493
+ ```
494
+
495
+ **Interactive backends** (Plotly/Bokeh) provide hover tooltips showing SNP details:
496
+
497
+ ```python
498
+ # Plotly - interactive HTML with hover tooltips
499
+ plotter = MiamiPlotter(species="human", backend="plotly")
500
+ fig = plotter.plot_miami(discovery_df, replication_df, ...)
501
+ fig.write_html("miami_interactive.html")
502
+
503
+ # Bokeh - dashboard-ready interactive plots
504
+ from bokeh.io import output_file, save
505
+ plotter = MiamiPlotter(species="human", backend="bokeh")
506
+ fig = plotter.plot_miami(discovery_df, replication_df, ...)
507
+ output_file("miami_bokeh.html")
508
+ save(fig)
509
+ ```
510
+
511
+ ![Example Miami plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/miami_plot.png)
512
+ *Miami plot comparing discovery and replication GWAS with mirrored y-axes and region highlighting.*
513
+
362
514
  ## Manhattan Plots
363
515
 
364
516
  Create genome-wide Manhattan plots showing associations across all chromosomes:
365
517
 
366
518
  ```python
367
- from pylocuszoom import LocusZoomPlotter
519
+ from pylocuszoom import ManhattanPlotter
368
520
 
369
- plotter = LocusZoomPlotter(species="human")
521
+ plotter = ManhattanPlotter(species="human")
370
522
 
371
523
  fig = plotter.plot_manhattan(
372
524
  gwas_df,
@@ -379,7 +531,7 @@ fig = plotter.plot_manhattan(
379
531
  fig.savefig("manhattan.png", dpi=150)
380
532
  ```
381
533
 
382
- ![Example Manhattan plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/manhattan_plot.png)
534
+ ![Example Manhattan plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/manhattan_plot.png)
383
535
  *Manhattan plot showing genome-wide associations with chromosome coloring and significance threshold.*
384
536
 
385
537
  Categorical Manhattan plots (PheWAS-style) are also supported:
@@ -397,9 +549,9 @@ fig = plotter.plot_manhattan(
397
549
  Create quantile-quantile plots to assess p-value distribution:
398
550
 
399
551
  ```python
400
- from pylocuszoom import LocusZoomPlotter
552
+ from pylocuszoom import ManhattanPlotter
401
553
 
402
- plotter = LocusZoomPlotter()
554
+ plotter = ManhattanPlotter()
403
555
 
404
556
  fig = plotter.plot_qq(
405
557
  gwas_df,
@@ -411,7 +563,7 @@ fig = plotter.plot_qq(
411
563
  fig.savefig("qq_plot.png", dpi=150)
412
564
  ```
413
565
 
414
- ![Example QQ plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/qq_plot.png)
566
+ ![Example QQ plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/qq_plot.png)
415
567
  *QQ plot with 95% confidence band and genomic inflation factor (λ).*
416
568
 
417
569
  ## Stacked Manhattan Plots
@@ -419,9 +571,9 @@ fig.savefig("qq_plot.png", dpi=150)
419
571
  Compare multiple GWAS results in vertically stacked Manhattan plots:
420
572
 
421
573
  ```python
422
- from pylocuszoom import LocusZoomPlotter
574
+ from pylocuszoom import ManhattanPlotter
423
575
 
424
- plotter = LocusZoomPlotter()
576
+ plotter = ManhattanPlotter()
425
577
 
426
578
  fig = plotter.plot_manhattan_stacked(
427
579
  [gwas_study1, gwas_study2, gwas_study3],
@@ -436,7 +588,7 @@ fig = plotter.plot_manhattan_stacked(
436
588
  fig.savefig("manhattan_stacked.png", dpi=150)
437
589
  ```
438
590
 
439
- ![Example stacked Manhattan plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/manhattan_stacked.png)
591
+ ![Example stacked Manhattan plot](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/manhattan_stacked.png)
440
592
  *Stacked Manhattan plots comparing three GWAS studies with shared chromosome axis.*
441
593
 
442
594
  ## Manhattan and QQ Side-by-Side
@@ -444,9 +596,9 @@ fig.savefig("manhattan_stacked.png", dpi=150)
444
596
  Create combined Manhattan and QQ plots in a single figure:
445
597
 
446
598
  ```python
447
- from pylocuszoom import LocusZoomPlotter
599
+ from pylocuszoom import ManhattanPlotter
448
600
 
449
- plotter = LocusZoomPlotter()
601
+ plotter = ManhattanPlotter()
450
602
 
451
603
  fig = plotter.plot_manhattan_qq(
452
604
  gwas_df,
@@ -462,7 +614,7 @@ fig = plotter.plot_manhattan_qq(
462
614
  fig.savefig("manhattan_qq.png", dpi=150)
463
615
  ```
464
616
 
465
- ![Example Manhattan and QQ side-by-side](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/manhattan_qq_sidebyside.png)
617
+ ![Example Manhattan and QQ side-by-side](https://raw.githubusercontent.com/michael-denyer/pyLocusZoom/main/examples/matplotlib/manhattan_qq_sidebyside.png)
466
618
  *Combined Manhattan and QQ plot showing genome-wide associations and p-value distribution.*
467
619
 
468
620
  ## PySpark Support
@@ -1,36 +1,40 @@
1
- pylocuszoom/__init__.py,sha256=WWoPLRzx-ptSs6WU5ABz1-HzK5o06RV-KXqtDeQKPgQ,6108
1
+ pylocuszoom/__init__.py,sha256=VwZBIjjY-k6oQVkSgcsAwTkDitHdaHRe2gDUZ5b1YhA,6599
2
2
  pylocuszoom/_plotter_utils.py,sha256=ELdSOcKk2KvOo_AxEWHeutmmUS4zZMaDMmQfpQUWaF0,1541
3
- pylocuszoom/colors.py,sha256=B28rfhWwGZ-e6Q-F43iXxC6NZpjUo0yWk4S_-vp9ZvU,7686
4
- pylocuszoom/config.py,sha256=qjIEodI-RY71RVyQ5QmE6WXcPXU4Re_xEWiDlkEww3g,13266
3
+ pylocuszoom/coloc.py,sha256=ND56BgUp_yLDTak2RsD9OqZK-X93eDGkL9Q97C2_Fz0,2191
4
+ pylocuszoom/coloc_plotter.py,sha256=9q76_4mYLNU6PjVw_rqx2THdTleI9U6mpzGBA6PnfrY,14036
5
+ pylocuszoom/colors.py,sha256=j1qBHHNTIE9k4bAkIrl7B7bTpTQdWq34-DdJ_y7hZPk,8751
6
+ pylocuszoom/config.py,sha256=Ow8YiW5Yl801K71jOnrPivHvAbA58uH1BvCAbV9hojM,16008
5
7
  pylocuszoom/ensembl.py,sha256=w2msgBoIrY79iHI3hURSbevvdFHxHyWF9Z78hXtAaBc,14296
6
8
  pylocuszoom/eqtl.py,sha256=9hGcFARABQRCMN3rco0pVlFJdmlh4SLBBKSgOvdIH_U,5924
7
9
  pylocuszoom/exceptions.py,sha256=nd-rWMUodW62WVV4TfcYVPQcb66xV6v9FA-_4xHb5VY,926
8
- pylocuszoom/finemapping.py,sha256=VYQs4o4dVREXicueT1anzuENiFZk6YXb6HpbwyF0FD0,5828
10
+ pylocuszoom/finemapping.py,sha256=S3ulQj3fkaDM3n4I8EBymbWym_kTD5NEqfIEj93Mdjk,9630
9
11
  pylocuszoom/forest.py,sha256=K-wBinxBOqIzsNMtZJ587e_oMhUXIXEqmEzVTUbmHSY,1161
10
12
  pylocuszoom/gene_track.py,sha256=Sh0JCSdLNAAH0NQEiDVMvyXjm63PiCMq3gLvewcagvo,17277
11
- pylocuszoom/labels.py,sha256=l4PHAR_err75Z9kTmb3a2h0eunkFj6UjzhKBUgmZTDc,3623
12
- pylocuszoom/ld.py,sha256=64xIulpDVvbMSryWUPoCQ99Odcjwf1wejpwVr_30MLU,6412
13
+ pylocuszoom/labels.py,sha256=RPgEcCGPA2VQ1rXIW3WYy0AQ0EE0VBzbh_4EkhsWsNc,4343
14
+ pylocuszoom/ld.py,sha256=CphRau26XL9MoHiU3qRXlSz1Eg39TJt7MNIPZSZDr8M,13999
15
+ pylocuszoom/ld_heatmap_plotter.py,sha256=siHKL-tq7qQBTgyfH09uL0YJPmOGxG3udq8p1We5p0I,8373
13
16
  pylocuszoom/loaders.py,sha256=KpWPBO0BCb2yrGTtgdiOqOuhx2YLmjK_ywmpr3onnx8,25156
14
17
  pylocuszoom/logging.py,sha256=nZHEkbnjp8zoyWj_S-Hy9UQvUYLoMoxyiOWRozBT2dg,4987
15
18
  pylocuszoom/manhattan.py,sha256=sNhPnsfsIqe1ls74D-kKMFyF_ZmaYB9Ul8qf4UMWnF0,8022
16
19
  pylocuszoom/manhattan_plotter.py,sha256=1QQxaXEh5YG4x6ZIxpdhdfQPI2KuO_525qYKI7c32n4,27584
20
+ pylocuszoom/miami_plotter.py,sha256=J7GcgeIKyJvJTpQQHx9YNwH5NzpYSej2HPFSGu5YeLY,18099
17
21
  pylocuszoom/phewas.py,sha256=6g2LmwA5kmxYlHgPxJvuXIMerEqfqgsrth110Y3CgVU,968
18
- pylocuszoom/plotter.py,sha256=mMOQxyLU3d1XJGpDJUuy71fAFm6IAnQfMZQXHgN6Mzk,54689
22
+ pylocuszoom/plotter.py,sha256=I6fktn1mwE-ZM6bnKUqXrdN_eMQ6oHGaJBq9DwoT4xI,60488
19
23
  pylocuszoom/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
24
  pylocuszoom/qq.py,sha256=GPIFHXYCLvhP4IUgjcU3QELLREH8r1AEYXMord8gtEo,3650
21
- pylocuszoom/recombination.py,sha256=e11IlFRXKILEAP-vgMcbFK28zbAQ5jY-fESsisogq0o,14570
25
+ pylocuszoom/recombination.py,sha256=M-wDBdGbC5qGDHPFoGzBTPmTdiRD7bpRskyxBAKxTUY,15878
22
26
  pylocuszoom/schemas.py,sha256=XxeivyRm5LGDwJw4GToxzOSdyx1yXvFYk3xgeFJ6VW0,11858
23
27
  pylocuszoom/stats_plotter.py,sha256=67bgU-TXGnmVTxfTRWT3-PFemVVy6lTu4-ZlxUnwHS4,11171
24
28
  pylocuszoom/utils.py,sha256=Z2P__Eau3ilF2ftuAZBm11EZ1NqCFQzfr4br9jCiJmg,6887
25
29
  pylocuszoom/validation.py,sha256=3D9axjUvNXWW3Mk7dwRG38-di2P0zDpVVGF5WNSfZbk,7403
26
30
  pylocuszoom/backends/__init__.py,sha256=xefVj3jVxmYwVLLY5AZtFqTPMehQxZ2qGd-Pk7_V_Bk,4267
27
- pylocuszoom/backends/base.py,sha256=d_IqH2yGWIfQHeUCcavV4eL6V68hpNtOyGfTyb2ke0I,22628
28
- pylocuszoom/backends/bokeh_backend.py,sha256=cubjEzNq5vHov-CeBMLgmf3SAtEET-fUUB8d_oYFgiw,29151
31
+ pylocuszoom/backends/base.py,sha256=Wgzr6ncKnqZpjEYrc6aPmIKDWdZLm18mMO7q7XRU6SA,25640
32
+ pylocuszoom/backends/bokeh_backend.py,sha256=ft0W5ScxPoA6T6GB7k9PFfTMgOCyFom_plqVItdaUA0,34198
29
33
  pylocuszoom/backends/hover.py,sha256=Hjm_jcxJL8dDxO_Ye7jeWAUcHKlbH6oO8ZfGJ2MzIFM,6564
30
- pylocuszoom/backends/matplotlib_backend.py,sha256=9WAFLWcclj2-4WKi6bE6IPJfQ_HNoIekOE45ibBGPa0,22824
31
- pylocuszoom/backends/plotly_backend.py,sha256=VDEZMdP7nOeFYLli-YOc_2DG00ZA6VVRNUcvT5PU0HM,39084
34
+ pylocuszoom/backends/matplotlib_backend.py,sha256=SKTL_6QCc2D_UVITH543O-zPD_I8AwDLCZE0Re0KfE0,27269
35
+ pylocuszoom/backends/plotly_backend.py,sha256=cow67G8dIcrxSI3XOPFWJ9hSLqe1-MB4NFSeO8GDRG4,42228
32
36
  pylocuszoom/reference_data/__init__.py,sha256=qqHqAUt1jebGlCN3CjqW3Z-_coHVNo5K3a3bb9o83hA,109
33
- pylocuszoom-1.1.2.dist-info/METADATA,sha256=dkrVAdEcwo5yQku8yUfX7Dlpiv3u01FzdHrZ23c3WyM,22289
34
- pylocuszoom-1.1.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
35
- pylocuszoom-1.1.2.dist-info/licenses/LICENSE.md,sha256=U2y_hv8RcN5lECA3uK88irU3ODUE1TDAPictcmnP0Q4,698
36
- pylocuszoom-1.1.2.dist-info/RECORD,,
37
+ pylocuszoom-1.3.1.dist-info/METADATA,sha256=nHe6YBAHx718EndDz71xIukqf_WwJ7Q4yERBkgz9xmo,27020
38
+ pylocuszoom-1.3.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
39
+ pylocuszoom-1.3.1.dist-info/licenses/LICENSE.md,sha256=bqhD2fIhoqfLdX1lyGNoufIHWE7Q8mU-SyFadwKn4cc,34902
40
+ pylocuszoom-1.3.1.dist-info/RECORD,,