pylocuszoom 0.8.0__py3-none-any.whl → 1.1.0__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pylocuszoom
3
- Version: 0.8.0
3
+ Version: 1.1.0
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
@@ -21,6 +21,7 @@ Classifier: Topic :: Scientific/Engineering :: Visualization
21
21
  Requires-Python: >=3.10
22
22
  Requires-Dist: adjusttext>=0.8
23
23
  Requires-Dist: bokeh>=3.8.2
24
+ Requires-Dist: colorcet>=3.0.0
24
25
  Requires-Dist: kaleido>=0.2.0
25
26
  Requires-Dist: loguru>=0.7.0
26
27
  Requires-Dist: matplotlib>=3.5.0
@@ -66,22 +67,24 @@ Inspired by [LocusZoom](http://locuszoom.org/) and [locuszoomr](https://github.c
66
67
  - **Multi-species support**: Built-in reference data for *Canis lupus familiaris* (CanFam3.1/CanFam4) and *Felis catus* (FelCat9), or optionally provide your own for any species
67
68
  - **LD coloring**: SNPs colored by linkage disequilibrium (R²) with lead variant
68
69
  - **Gene tracks**: Annotated gene/exon positions below the association plot
69
- - **Recombination rate**: Optional overlay across region (*Canis lupus familiaris* built-in, not shown in example image)
70
+ - **Recombination rate**: Overlay across region (*Canis lupus familiaris* built-in, or user-provided)
70
71
  - **SNP labels (matplotlib)**: Automatic labeling of top SNPs by p-value (RS IDs)
71
72
  - **Hover tooltips (Plotly and Bokeh)**: Detailed SNP data on hover
72
73
 
73
- ![Example regional association plot with LD coloring and gene track](examples/regional_plot.png)
74
- *Regional association plot with LD coloring, gene/exon track, and top SNP labels (recombination overlay disabled in example).*
74
+ ![Example regional association plot with LD coloring, gene track, and recombination overlay](examples/regional_plot_with_recomb.png)
75
+ *Regional association plot with LD coloring, gene/exon track, recombination rate overlay (blue line), and top SNP labels.*
75
76
 
76
77
  2. **Stacked plots**: Compare multiple GWAS/phenotypes vertically
77
- 3. **eQTL plot**: Expression QTL data aligned with association plots and gene tracks
78
- 4. **Fine-mapping plots**: Visualize SuSiE credible sets with posterior inclusion probabilities
79
- 5. **PheWAS plots**: Phenome-wide association study visualization across multiple phenotypes
80
- 6. **Forest plots**: Meta-analysis effect size visualization with confidence intervals
81
- 7. **Multiple backends**: matplotlib (publication-ready), plotly (interactive), bokeh (dashboard integration)
82
- 8. **Pandas and PySpark support**: Works with both Pandas and PySpark DataFrames for large-scale genomics data
83
- 9. **Convenience data file loaders**: Load and validate common GWAS, eQTL and fine-mapping file formats
84
- 10. **Automatic gene annotations**: Fetch gene/exon data from Ensembl REST API with caching (human, mouse, rat, canine, feline, and any Ensembl species)
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)
85
88
 
86
89
  ## Installation
87
90
 
@@ -107,17 +110,17 @@ conda install -c bioconda pylocuszoom
107
110
  from pylocuszoom import LocusZoomPlotter
108
111
 
109
112
  # Initialize plotter (loads reference data for canine)
110
- plotter = LocusZoomPlotter(species="canine")
113
+ plotter = LocusZoomPlotter(species="canine", auto_genes=True)
111
114
 
112
- # Create regional plot
115
+ # Plot with parameters passed directly
113
116
  fig = plotter.plot(
114
- gwas_df, # DataFrame with ps, p_wald, rs columns
117
+ gwas_df, # DataFrame with pos, p_value, rs columns
115
118
  chrom=1,
116
119
  start=1000000,
117
120
  end=2000000,
118
- lead_pos=1500000, # Highlight lead SNP
121
+ lead_pos=1500000, # Highlight lead SNP
122
+ show_recombination=True, # Overlay recombination rate
119
123
  )
120
-
121
124
  fig.savefig("regional_plot.png", dpi=150)
122
125
  ```
123
126
 
@@ -137,9 +140,7 @@ fig = plotter.plot(
137
140
  start=1000000,
138
141
  end=2000000,
139
142
  lead_pos=1500000,
140
- ld_reference_file="genotypes.bed", # For LD calculation
141
- genes_df=genes_df, # Gene annotations
142
- exons_df=exons_df, # Exon annotations
143
+ ld_reference_file="genotypes", # PLINK fileset (without extension)
143
144
  show_recombination=True, # Overlay recombination rate
144
145
  snp_labels=True, # Label top SNPs
145
146
  label_top_n=5, # How many to label
@@ -147,6 +148,8 @@ fig = plotter.plot(
147
148
  p_col="p_wald", # Column name for p-value
148
149
  rs_col="rs", # Column name for SNP ID
149
150
  figsize=(12, 8),
151
+ genes_df=genes_df, # Gene annotations
152
+ exons_df=exons_df, # Exon annotations
150
153
  )
151
154
  ```
152
155
 
@@ -163,6 +166,8 @@ Recombination maps are automatically lifted over from CanFam3.1 to CanFam4 coord
163
166
  ## Using with Other Species
164
167
 
165
168
  ```python
169
+ from pylocuszoom import LocusZoomPlotter
170
+
166
171
  # Feline (LD and gene tracks, user provides recombination data)
167
172
  plotter = LocusZoomPlotter(species="feline")
168
173
 
@@ -172,10 +177,12 @@ plotter = LocusZoomPlotter(
172
177
  recomb_data_dir="/path/to/recomb_maps/",
173
178
  )
174
179
 
175
- # Or provide data per-plot
180
+ # Provide data per-plot
176
181
  fig = plotter.plot(
177
182
  gwas_df,
178
- chrom=1, start=1000000, end=2000000,
183
+ chrom=1,
184
+ start=1000000,
185
+ end=2000000,
179
186
  recomb_df=my_recomb_dataframe,
180
187
  genes_df=my_genes_df,
181
188
  )
@@ -186,6 +193,8 @@ fig = plotter.plot(
186
193
  pyLocusZoom can automatically fetch gene annotations from Ensembl for any species:
187
194
 
188
195
  ```python
196
+ from pylocuszoom import LocusZoomPlotter
197
+
189
198
  # Enable automatic gene fetching
190
199
  plotter = LocusZoomPlotter(species="human", auto_genes=True)
191
200
 
@@ -201,6 +210,8 @@ Data is cached locally for fast subsequent plots. Maximum region size is 5Mb (En
201
210
  pyLocusZoom supports multiple rendering backends (set at initialization):
202
211
 
203
212
  ```python
213
+ from pylocuszoom import LocusZoomPlotter
214
+
204
215
  # Static publication-quality plot (default)
205
216
  plotter = LocusZoomPlotter(species="canine", backend="matplotlib")
206
217
  fig = plotter.plot(gwas_df, chrom=1, start=1000000, end=2000000)
@@ -229,6 +240,10 @@ fig = plotter.plot(gwas_df, chrom=1, start=1000000, end=2000000)
229
240
  Compare multiple GWAS results vertically with shared x-axis:
230
241
 
231
242
  ```python
243
+ from pylocuszoom import LocusZoomPlotter
244
+
245
+ plotter = LocusZoomPlotter(species="canine")
246
+
232
247
  fig = plotter.plot_stacked(
233
248
  [gwas_height, gwas_bmi, gwas_whr],
234
249
  chrom=1,
@@ -247,15 +262,21 @@ fig = plotter.plot_stacked(
247
262
  Add expression QTL data as a separate panel:
248
263
 
249
264
  ```python
265
+ from pylocuszoom import LocusZoomPlotter
266
+
250
267
  eqtl_df = pd.DataFrame({
251
268
  "pos": [1000500, 1001200, 1002000],
252
269
  "p_value": [1e-6, 1e-4, 0.01],
253
270
  "gene": ["BRCA1", "BRCA1", "BRCA1"],
254
271
  })
255
272
 
273
+ plotter = LocusZoomPlotter(species="canine")
274
+
256
275
  fig = plotter.plot_stacked(
257
276
  [gwas_df],
258
- chrom=1, start=1000000, end=2000000,
277
+ chrom=1,
278
+ start=1000000,
279
+ end=2000000,
259
280
  eqtl_df=eqtl_df,
260
281
  eqtl_gene="BRCA1",
261
282
  genes_df=genes_df,
@@ -270,15 +291,21 @@ fig = plotter.plot_stacked(
270
291
  Visualize SuSiE or other fine-mapping results with credible set coloring:
271
292
 
272
293
  ```python
294
+ from pylocuszoom import LocusZoomPlotter
295
+
273
296
  finemapping_df = pd.DataFrame({
274
297
  "pos": [1000500, 1001200, 1002000, 1003500],
275
298
  "pip": [0.85, 0.12, 0.02, 0.45], # Posterior inclusion probability
276
299
  "cs": [1, 1, 0, 2], # Credible set assignment (0 = not in CS)
277
300
  })
278
301
 
302
+ plotter = LocusZoomPlotter(species="canine")
303
+
279
304
  fig = plotter.plot_stacked(
280
305
  [gwas_df],
281
- chrom=1, start=1000000, end=2000000,
306
+ chrom=1,
307
+ start=1000000,
308
+ end=2000000,
282
309
  finemapping_df=finemapping_df,
283
310
  finemapping_cs_col="cs",
284
311
  genes_df=genes_df,
@@ -332,6 +359,112 @@ fig = plotter.plot_forest(
332
359
  ![Example forest plot](examples/forest_plot.png)
333
360
  *Forest plot with effect sizes, confidence intervals, and weight-proportional markers.*
334
361
 
362
+ ## Manhattan Plots
363
+
364
+ Create genome-wide Manhattan plots showing associations across all chromosomes:
365
+
366
+ ```python
367
+ from pylocuszoom import LocusZoomPlotter
368
+
369
+ plotter = LocusZoomPlotter(species="human")
370
+
371
+ fig = plotter.plot_manhattan(
372
+ gwas_df,
373
+ chrom_col="chrom",
374
+ pos_col="pos",
375
+ p_col="p",
376
+ significance_threshold=5e-8, # Genome-wide significance line
377
+ figsize=(12, 5),
378
+ )
379
+ fig.savefig("manhattan.png", dpi=150)
380
+ ```
381
+
382
+ ![Example Manhattan plot](examples/manhattan_plot.png)
383
+ *Manhattan plot showing genome-wide associations with chromosome coloring and significance threshold.*
384
+
385
+ Categorical Manhattan plots (PheWAS-style) are also supported:
386
+
387
+ ```python
388
+ fig = plotter.plot_manhattan(
389
+ phewas_df,
390
+ category_col="phenotype_category",
391
+ p_col="pvalue",
392
+ )
393
+ ```
394
+
395
+ ## QQ Plots
396
+
397
+ Create quantile-quantile plots to assess p-value distribution:
398
+
399
+ ```python
400
+ from pylocuszoom import LocusZoomPlotter
401
+
402
+ plotter = LocusZoomPlotter()
403
+
404
+ fig = plotter.plot_qq(
405
+ gwas_df,
406
+ p_col="p",
407
+ show_confidence_band=True, # 95% confidence band
408
+ show_lambda=True, # Genomic inflation factor in title
409
+ figsize=(6, 6),
410
+ )
411
+ fig.savefig("qq_plot.png", dpi=150)
412
+ ```
413
+
414
+ ![Example QQ plot](examples/qq_plot.png)
415
+ *QQ plot with 95% confidence band and genomic inflation factor (λ).*
416
+
417
+ ## Stacked Manhattan Plots
418
+
419
+ Compare multiple GWAS results in vertically stacked Manhattan plots:
420
+
421
+ ```python
422
+ from pylocuszoom import LocusZoomPlotter
423
+
424
+ plotter = LocusZoomPlotter()
425
+
426
+ fig = plotter.plot_manhattan_stacked(
427
+ [gwas_study1, gwas_study2, gwas_study3],
428
+ chrom_col="chrom",
429
+ pos_col="pos",
430
+ p_col="p",
431
+ panel_labels=["Study 1", "Study 2", "Study 3"],
432
+ significance_threshold=5e-8,
433
+ figsize=(12, 8),
434
+ title="Multi-study GWAS Comparison",
435
+ )
436
+ fig.savefig("manhattan_stacked.png", dpi=150)
437
+ ```
438
+
439
+ ![Example stacked Manhattan plot](examples/manhattan_stacked.png)
440
+ *Stacked Manhattan plots comparing three GWAS studies with shared chromosome axis.*
441
+
442
+ ## Manhattan and QQ Side-by-Side
443
+
444
+ Create combined Manhattan and QQ plots in a single figure:
445
+
446
+ ```python
447
+ from pylocuszoom import LocusZoomPlotter
448
+
449
+ plotter = LocusZoomPlotter()
450
+
451
+ fig = plotter.plot_manhattan_qq(
452
+ gwas_df,
453
+ chrom_col="chrom",
454
+ pos_col="pos",
455
+ p_col="p",
456
+ significance_threshold=5e-8,
457
+ show_confidence_band=True,
458
+ show_lambda=True,
459
+ figsize=(14, 5),
460
+ title="GWAS Results",
461
+ )
462
+ fig.savefig("manhattan_qq.png", dpi=150)
463
+ ```
464
+
465
+ ![Example Manhattan and QQ side-by-side](examples/manhattan_qq_sidebyside.png)
466
+ *Combined Manhattan and QQ plot showing genome-wide associations and p-value distribution.*
467
+
335
468
  ## PySpark Support
336
469
 
337
470
  For large-scale genomics data, convert PySpark DataFrames with `to_pandas()` before plotting:
@@ -414,7 +547,7 @@ gwas_df = pd.DataFrame({
414
547
  |--------|------|----------|-------------|
415
548
  | `chr` | str or int | Yes | Chromosome identifier. Accepts "1", "chr1", or 1. The "chr" prefix is stripped for matching. |
416
549
  | `start` | int | Yes | Gene start position (bp, 1-based). Transcript start for strand-aware genes. |
417
- | `end` | int | Yes | Gene end position (bp, 1-based). Must be start. |
550
+ | `end` | int | Yes | Gene end position (bp, 1-based). Must be >= start. |
418
551
  | `gene_name` | str | Yes | Gene symbol displayed in track (e.g., "BRCA1", "TP53"). Keep short for readability. |
419
552
 
420
553
  Example:
@@ -516,6 +649,7 @@ Optional:
516
649
  ## Documentation
517
650
 
518
651
  - [User Guide](docs/USER_GUIDE.md) - Comprehensive documentation with API reference
652
+ - [Code Map](docs/CODEMAP.md) - Architecture diagram with source code links
519
653
  - [Architecture](docs/ARCHITECTURE.md) - Design decisions and component overview
520
654
  - [Example Notebook](examples/getting_started.ipynb) - Interactive tutorial
521
655
  - [CHANGELOG](CHANGELOG.md) - Version history
@@ -0,0 +1,36 @@
1
+ pylocuszoom/__init__.py,sha256=F-LIZ4jSH9JC09MqQymwYDyEJQ1DWpGDutreJ1qI7NE,6108
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
5
+ pylocuszoom/ensembl.py,sha256=w2msgBoIrY79iHI3hURSbevvdFHxHyWF9Z78hXtAaBc,14296
6
+ pylocuszoom/eqtl.py,sha256=9hGcFARABQRCMN3rco0pVlFJdmlh4SLBBKSgOvdIH_U,5924
7
+ pylocuszoom/exceptions.py,sha256=nd-rWMUodW62WVV4TfcYVPQcb66xV6v9FA-_4xHb5VY,926
8
+ pylocuszoom/finemapping.py,sha256=VYQs4o4dVREXicueT1anzuENiFZk6YXb6HpbwyF0FD0,5828
9
+ pylocuszoom/forest.py,sha256=K-wBinxBOqIzsNMtZJ587e_oMhUXIXEqmEzVTUbmHSY,1161
10
+ 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/loaders.py,sha256=KpWPBO0BCb2yrGTtgdiOqOuhx2YLmjK_ywmpr3onnx8,25156
14
+ pylocuszoom/logging.py,sha256=nZHEkbnjp8zoyWj_S-Hy9UQvUYLoMoxyiOWRozBT2dg,4987
15
+ pylocuszoom/manhattan.py,sha256=sNhPnsfsIqe1ls74D-kKMFyF_ZmaYB9Ul8qf4UMWnF0,8022
16
+ pylocuszoom/manhattan_plotter.py,sha256=1QQxaXEh5YG4x6ZIxpdhdfQPI2KuO_525qYKI7c32n4,27584
17
+ pylocuszoom/phewas.py,sha256=6g2LmwA5kmxYlHgPxJvuXIMerEqfqgsrth110Y3CgVU,968
18
+ pylocuszoom/plotter.py,sha256=mMOQxyLU3d1XJGpDJUuy71fAFm6IAnQfMZQXHgN6Mzk,54689
19
+ pylocuszoom/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ pylocuszoom/qq.py,sha256=GPIFHXYCLvhP4IUgjcU3QELLREH8r1AEYXMord8gtEo,3650
21
+ pylocuszoom/recombination.py,sha256=e11IlFRXKILEAP-vgMcbFK28zbAQ5jY-fESsisogq0o,14570
22
+ pylocuszoom/schemas.py,sha256=XxeivyRm5LGDwJw4GToxzOSdyx1yXvFYk3xgeFJ6VW0,11858
23
+ pylocuszoom/stats_plotter.py,sha256=67bgU-TXGnmVTxfTRWT3-PFemVVy6lTu4-ZlxUnwHS4,11171
24
+ pylocuszoom/utils.py,sha256=Z2P__Eau3ilF2ftuAZBm11EZ1NqCFQzfr4br9jCiJmg,6887
25
+ pylocuszoom/validation.py,sha256=3D9axjUvNXWW3Mk7dwRG38-di2P0zDpVVGF5WNSfZbk,7403
26
+ 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
29
+ 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
32
+ pylocuszoom/reference_data/__init__.py,sha256=qqHqAUt1jebGlCN3CjqW3Z-_coHVNo5K3a3bb9o83hA,109
33
+ pylocuszoom-1.1.0.dist-info/METADATA,sha256=9m2MMDhv12XxZD93IskPFDYGluazggOSErn_1ieTFjM,21283
34
+ pylocuszoom-1.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
35
+ pylocuszoom-1.1.0.dist-info/licenses/LICENSE.md,sha256=U2y_hv8RcN5lECA3uK88irU3ODUE1TDAPictcmnP0Q4,698
36
+ pylocuszoom-1.1.0.dist-info/RECORD,,
@@ -1,29 +0,0 @@
1
- pylocuszoom/__init__.py,sha256=UtrNrjV0b0frxv3Zl4jw5D8aTMbNSE55j-PPkd8rz28,5585
2
- pylocuszoom/colors.py,sha256=B28rfhWwGZ-e6Q-F43iXxC6NZpjUo0yWk4S_-vp9ZvU,7686
3
- pylocuszoom/ensembl.py,sha256=q767o86FdcKn4V9aK48ESFwNI7ATlaX5tnwjZReYMEw,14436
4
- pylocuszoom/eqtl.py,sha256=OrpWbFMR1wKMCmfQiC-2sqYx-99TT2i1cStIrPWIUOs,5948
5
- pylocuszoom/finemapping.py,sha256=ZPcnc9E6N41Su8222wCqBkB3bhhyfASvj9u9Ot4td4o,5898
6
- pylocuszoom/forest.py,sha256=302gULz9I0UiwqgcB18R756OOl1aa54OsPYHc6TnxGY,1092
7
- pylocuszoom/gene_track.py,sha256=PkBwfqByVxhXlAPco9-d4P5X7cTg2rrOnw7BJVx48ow,17818
8
- pylocuszoom/labels.py,sha256=Ams5WVZFNVT692BRiQ5wZcdbdNEAm5xtgRwmF5u0s_A,3492
9
- pylocuszoom/ld.py,sha256=64xIulpDVvbMSryWUPoCQ99Odcjwf1wejpwVr_30MLU,6412
10
- pylocuszoom/loaders.py,sha256=KpWPBO0BCb2yrGTtgdiOqOuhx2YLmjK_ywmpr3onnx8,25156
11
- pylocuszoom/logging.py,sha256=nZHEkbnjp8zoyWj_S-Hy9UQvUYLoMoxyiOWRozBT2dg,4987
12
- pylocuszoom/phewas.py,sha256=6g2LmwA5kmxYlHgPxJvuXIMerEqfqgsrth110Y3CgVU,968
13
- pylocuszoom/plotter.py,sha256=gFywhaHPuXlbKPxWaWfw7Wrw8kqPMUPzKMgDcRB6wu8,50709
14
- pylocuszoom/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- pylocuszoom/recombination.py,sha256=97GGBLDLTlQSRMp5sLOna3mCeRxeJiiWPHrw4dBRjQs,14546
16
- pylocuszoom/schemas.py,sha256=vABBBlAR1vUP6BIewZ8E-TYpacccrcxavrdIDVCrQB4,11916
17
- pylocuszoom/utils.py,sha256=_rI6ov0MbsWlZGJ7ni-V4387cirmJCX6IF2JAYhBx6A,6929
18
- pylocuszoom/validation.py,sha256=UInqlhOWhWaCT_mrO7O7SfB1DNIYkjvEMudy4YjtUBg,5698
19
- pylocuszoom/backends/__init__.py,sha256=xefVj3jVxmYwVLLY5AZtFqTPMehQxZ2qGd-Pk7_V_Bk,4267
20
- pylocuszoom/backends/base.py,sha256=PBdm9t4f_qFDMkYR5z3edW4DvpuQSCAXuaxs2qjAeH0,21034
21
- pylocuszoom/backends/bokeh_backend.py,sha256=11zRhXH2guUHiaYXyd7l2IDAv6uawdRAv6dyGPkHmJc,25512
22
- pylocuszoom/backends/hover.py,sha256=Hjm_jcxJL8dDxO_Ye7jeWAUcHKlbH6oO8ZfGJ2MzIFM,6564
23
- pylocuszoom/backends/matplotlib_backend.py,sha256=098ITnvNrBTaEztqez_7D0sZ_rKAYIxS6EDR5Yxt8is,20924
24
- pylocuszoom/backends/plotly_backend.py,sha256=A6ZuHw0wVZaIIA6FgYJ4SH-Sz59tHOtnGUl-e-2VzZM,30574
25
- pylocuszoom/reference_data/__init__.py,sha256=qqHqAUt1jebGlCN3CjqW3Z-_coHVNo5K3a3bb9o83hA,109
26
- pylocuszoom-0.8.0.dist-info/METADATA,sha256=VqHRvFL1Wq5OJO3B727Rl0H8UfbBPaxVIJUOSA22s5A,17866
27
- pylocuszoom-0.8.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
28
- pylocuszoom-0.8.0.dist-info/licenses/LICENSE.md,sha256=U2y_hv8RcN5lECA3uK88irU3ODUE1TDAPictcmnP0Q4,698
29
- pylocuszoom-0.8.0.dist-info/RECORD,,