genome-spy-python 0.5.0__tar.gz → 0.6.0__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.
Files changed (376) hide show
  1. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.gitignore +3 -0
  2. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/CHANGELOG.md +26 -0
  3. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/PKG-INFO +85 -28
  4. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/README.md +84 -27
  5. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/THIRD_PARTY_NOTICES.md +13 -0
  6. genome_spy_python-0.6.0/docs/_static/gallery/airway_ma_plot.png +0 -0
  7. genome_spy_python-0.6.0/docs/_static/gallery/airway_volcano_plot.png +0 -0
  8. genome_spy_python-0.6.0/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
  9. genome_spy_python-0.6.0/docs/_static/gallery/sequence_logo.png +0 -0
  10. genome_spy_python-0.6.0/docs/_static/readme-manhattan.webp +0 -0
  11. genome_spy_python-0.6.0/docs/_static/readme-sequence-logo.webp +0 -0
  12. genome_spy_python-0.6.0/docs/_static/snaketie.svg +1 -0
  13. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/workflows.css +6 -4
  14. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/api.md +5 -0
  15. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/datasets.md +1 -0
  16. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/airway_ma_plot.py +63 -50
  17. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/airway_volcano_plot.py +63 -50
  18. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/ascat_fitting.py +1 -1
  19. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/hcc1954_sv_cnv.py +6 -1
  20. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/multiple_sequence_alignment.py +7 -7
  21. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/pik3ca_tcga_brca_lollipop.py +2 -1
  22. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/pisa_interaction_matrix.md +15 -13
  23. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/pisa_interaction_matrix.py +70 -54
  24. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/pisa_squid.md +17 -12
  25. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/pisa_squid.py +46 -56
  26. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/rnf7_direct_rna.py +1 -1
  27. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/sashimi_plot.py +9 -1
  28. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/sequence_logo.py +2 -3
  29. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/interaction.md +60 -45
  30. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/transforms.md +27 -5
  31. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/workflows/index.md +2 -0
  32. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/notebooks/edit_sequence.ipynb +7 -3
  33. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/notebooks/pick_genes.ipynb +3 -1
  34. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/notebooks/select_genes.ipynb +3 -1
  35. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/pyproject.toml +2 -2
  36. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/__init__.py +11 -1
  37. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/api.py +10 -0
  38. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/__init__.py +1 -0
  39. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/_airway.py +35 -47
  40. genome_spy_python-0.6.0/src/genome_spy/datasets/data/airway_review.json.gz +0 -0
  41. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/__init__.py +1 -1
  42. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/capabilities.json +1 -1
  43. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/core.py +390 -54
  44. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/genome-spy-schema.json +11 -0
  45. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/mixins.py +7 -0
  46. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/static/controls.js +1 -1
  47. genome_spy_python-0.6.0/src/genome_spy/static/genome-spy.js +1005 -0
  48. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/static/inspector.js +1 -1
  49. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_chart.py +1 -1
  50. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_conditions.py +29 -0
  51. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_datasets.py +7 -13
  52. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_docs_gallery.py +71 -101
  53. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_generated_schema_package.py +26 -0
  54. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_licensing.py +1 -0
  55. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_pisa_gallery.py +20 -4
  56. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_schema_codegen.py +29 -0
  57. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/docs_workflows.py +15 -11
  58. genome_spy_python-0.6.0/tools/prepare_airway_review.py +55 -0
  59. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/schemapi/codegen.py +28 -8
  60. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/uv.lock +1 -1
  61. genome_spy_python-0.5.0/docs/_static/gallery/airway_ma_plot.png +0 -0
  62. genome_spy_python-0.5.0/docs/_static/gallery/airway_volcano_plot.png +0 -0
  63. genome_spy_python-0.5.0/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
  64. genome_spy_python-0.5.0/docs/_static/gallery/sequence_logo.png +0 -0
  65. genome_spy_python-0.5.0/docs/_static/snaketie.svg +0 -74
  66. genome_spy_python-0.5.0/src/genome_spy/static/genome-spy.js +0 -1009
  67. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.agents/skills/commit/SKILL.md +0 -0
  68. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.agents/skills/proper-code-review/SKILL.md +0 -0
  69. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.agents/skills/proper-code-review/references/correctness.md +0 -0
  70. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.agents/skills/proper-code-review/references/design.md +0 -0
  71. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.agents/skills/proper-code-review/references/performance.md +0 -0
  72. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.claude/skills/commit/SKILL.md +0 -0
  73. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.claude/skills/proper-code-review/SKILL.md +0 -0
  74. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.claude/skills/proper-code-review/references/correctness.md +0 -0
  75. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.claude/skills/proper-code-review/references/design.md +0 -0
  76. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.claude/skills/proper-code-review/references/performance.md +0 -0
  77. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.gitattributes +0 -0
  78. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.github/workflows/ci.yml +0 -0
  79. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.github/workflows/docs.yml +0 -0
  80. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.github/workflows/release.yml +0 -0
  81. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.pre-commit-config.yaml +0 -0
  82. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/.python-version +0 -0
  83. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/AGENTS.md +0 -0
  84. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/CLAUDE.md +0 -0
  85. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/CONTRIBUTING.md +0 -0
  86. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSE +0 -0
  87. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
  88. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSES/CC-BY-4.0.txt +0 -0
  89. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSES/CC-BY-NC-SA-4.0.txt +0 -0
  90. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSES/CC0-1.0.txt +0 -0
  91. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt +0 -0
  92. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSES/GENOMESPY-MIT.txt +0 -0
  93. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSES/LATO-OFL-1.1.txt +0 -0
  94. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSES/VEGA-BSD-3-Clause.txt +0 -0
  95. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/LICENSES/VEGA-LITE-BSD-3-Clause.txt +0 -0
  96. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_ext/genomespy_gallery.py +0 -0
  97. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/data/README.md +0 -0
  98. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/data/airway_metadata.csv +0 -0
  99. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/data/airway_scaledcounts.csv +0 -0
  100. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/data/hapmap_gwas.csv +0 -0
  101. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/data/oncoprint_dataset3.json +0 -0
  102. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/data/pik3ca_mutations.json +0 -0
  103. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/external-links.js +0 -0
  104. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/ascat_copy_number.png +0 -0
  105. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/ascat_fitting.png +0 -0
  106. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/bam_read_alignments.png +0 -0
  107. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/bam_read_pileup.png +0 -0
  108. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
  109. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
  110. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/clinvar_variants.png +0 -0
  111. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
  112. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/composing_genome_browser.png +0 -0
  113. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/copy_number.png +0 -0
  114. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/coverage_pileup.png +0 -0
  115. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/cytobands.png +0 -0
  116. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/diverging_bars.png +0 -0
  117. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/dynseq_adaptive_bqtl.png +0 -0
  118. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/dynseq_bqtl.png +0 -0
  119. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/genome_tracks.png +0 -0
  120. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/geometric_zoom.png +0 -0
  121. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
  122. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
  123. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/heatmap_with_text.png +0 -0
  124. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/independent_scales.png +0 -0
  125. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
  126. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/layered_lollipop.png +0 -0
  127. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/link_mark.png +0 -0
  128. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/luad_oncoprint.png +0 -0
  129. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/manhattan_plot.png +0 -0
  130. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/needle_plot.png +0 -0
  131. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/oncoprint.png +0 -0
  132. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/p53_sequence_comparison.png +0 -0
  133. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/penguin_brush.png +0 -0
  134. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
  135. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/pisa_interaction_matrix.png +0 -0
  136. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/pisa_squid.png +0 -0
  137. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/point_mark.png +0 -0
  138. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/point_styles.png +0 -0
  139. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/rainfall_plot.png +0 -0
  140. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/ranged_rule.png +0 -0
  141. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/rect_heatmap.png +0 -0
  142. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/refseq_scored_genes.png +0 -0
  143. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/rnf7_direct_rna.png +0 -0
  144. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/sashimi_plot.png +0 -0
  145. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/scrollable_viewport.png +0 -0
  146. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/six_frame_translation.png +0 -0
  147. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/stacked_bar.png +0 -0
  148. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/stacked_genome_browser.png +0 -0
  149. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
  150. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/tsne.png +0 -0
  151. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/upset_mutations.png +0 -0
  152. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/vertical_concat.png +0 -0
  153. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/gallery/volcano_plot.png +0 -0
  154. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/genomespy.css +0 -0
  155. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/showcase.js +0 -0
  156. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_static/workflows.js +0 -0
  157. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_templates/autosummary/class.rst +0 -0
  158. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_templates/autosummary/class_own_members.rst +0 -0
  159. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_templates/base.html +0 -0
  160. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/_templates/components/view-this-page.html +0 -0
  161. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/about.md +0 -0
  162. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/conf.py +0 -0
  163. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/airway_ma_plot.md +0 -0
  164. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/airway_volcano_plot.md +0 -0
  165. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/ascat_copy_number.md +0 -0
  166. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/ascat_copy_number.py +0 -0
  167. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/ascat_fitting.md +0 -0
  168. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/bam_read_alignments.md +0 -0
  169. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/bam_read_alignments.py +0 -0
  170. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/bam_read_pileup.md +0 -0
  171. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/bam_read_pileup.py +0 -0
  172. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/bigbed_ccre_track.py +0 -0
  173. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/brush_linked_genome_tracks.md +0 -0
  174. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/brush_linked_genome_tracks.py +0 -0
  175. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/clinvar_variants.md +0 -0
  176. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/clinvar_variants.py +0 -0
  177. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/combined_laml_oncoplot.md +0 -0
  178. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/combined_laml_oncoplot.py +0 -0
  179. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/composing_genome_browser.md +0 -0
  180. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/composing_genome_browser.py +0 -0
  181. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/copy_number.py +0 -0
  182. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/coverage_pileup.md +0 -0
  183. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/coverage_pileup.py +0 -0
  184. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/cytobands.md +0 -0
  185. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/cytobands.py +0 -0
  186. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/diverging_bars.md +0 -0
  187. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/diverging_bars.py +0 -0
  188. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/dynseq_adaptive_bqtl.md +0 -0
  189. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/dynseq_adaptive_bqtl.py +0 -0
  190. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/dynseq_bqtl.md +0 -0
  191. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/dynseq_bqtl.py +0 -0
  192. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/genome_tracks.py +0 -0
  193. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/geometric_zoom.md +0 -0
  194. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/geometric_zoom.py +0 -0
  195. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/gff3_gene_annotations.md +0 -0
  196. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/gff3_gene_annotations.py +0 -0
  197. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/hcc1954_sv_cnv.md +0 -0
  198. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/heatmap_with_text.md +0 -0
  199. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/heatmap_with_text.py +0 -0
  200. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/independent_scales.md +0 -0
  201. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/independent_scales.py +0 -0
  202. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/indexed_fasta_sequence.py +0 -0
  203. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/layered_lollipop.md +0 -0
  204. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/layered_lollipop.py +0 -0
  205. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/link_mark.py +0 -0
  206. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/luad_oncoprint.md +0 -0
  207. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/luad_oncoprint.py +0 -0
  208. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/manhattan_plot.md +0 -0
  209. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/manhattan_plot.py +0 -0
  210. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/multiple_sequence_alignment.md +0 -0
  211. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/needle_plot.py +0 -0
  212. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/oncoprint.md +0 -0
  213. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/oncoprint.py +0 -0
  214. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/p53_sequence_comparison.md +0 -0
  215. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/p53_sequence_comparison.py +0 -0
  216. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/penguin_brush.md +0 -0
  217. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/penguin_brush.py +0 -0
  218. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
  219. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/point_mark.py +0 -0
  220. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/point_styles.md +0 -0
  221. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/point_styles.py +0 -0
  222. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/rainfall_plot.md +0 -0
  223. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/rainfall_plot.py +0 -0
  224. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/ranged_rule.py +0 -0
  225. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/rect_heatmap.py +0 -0
  226. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/refseq_scored_genes.md +0 -0
  227. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/refseq_scored_genes.py +0 -0
  228. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/rnf7_direct_rna.md +0 -0
  229. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/sashimi_plot.md +0 -0
  230. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/scrollable_viewport.py +0 -0
  231. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/six_frame_translation.md +0 -0
  232. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/six_frame_translation.py +0 -0
  233. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/stacked_bar.md +0 -0
  234. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/stacked_bar.py +0 -0
  235. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/stacked_genome_browser.py +0 -0
  236. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/tcga_ov_gistic.md +0 -0
  237. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/tcga_ov_gistic.py +0 -0
  238. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/tsne.md +0 -0
  239. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/tsne.py +0 -0
  240. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/upset_mutations.md +0 -0
  241. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/upset_mutations.py +0 -0
  242. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/vertical_concat.py +0 -0
  243. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/volcano_plot.md +0 -0
  244. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/examples/volcano_plot.py +0 -0
  245. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/getting-started.md +0 -0
  246. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/index.md +0 -0
  247. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/integration/component.py +0 -0
  248. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/integration/index.html +0 -0
  249. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/integration/notebook.ipynb +0 -0
  250. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/integration/server.py +0 -0
  251. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/annotations.py +0 -0
  252. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/charts_and_marks.py +0 -0
  253. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/composition.py +0 -0
  254. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/configuration.py +0 -0
  255. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/data_inputs.py +0 -0
  256. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/display_controls.py +0 -0
  257. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/encoding_channels.py +0 -0
  258. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/genome_browser_layouts.py +0 -0
  259. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/genomic_coordinates.py +0 -0
  260. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/genomic_data.py +0 -0
  261. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/getting_started.py +0 -0
  262. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/importing_specifications.py +0 -0
  263. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/interaction.py +0 -0
  264. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/notebooks.py +0 -0
  265. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/scales_and_guides.py +0 -0
  266. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/serialization.py +0 -0
  267. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/tutorials/transforms.py +0 -0
  268. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/annotations.md +0 -0
  269. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/charts.md +0 -0
  270. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/composition.md +0 -0
  271. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/configuration.md +0 -0
  272. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/connect-python.md +0 -0
  273. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/data.md +0 -0
  274. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/display-controls.md +0 -0
  275. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/embed-api.md +0 -0
  276. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/encodings.md +0 -0
  277. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/genome-browser-layouts.md +0 -0
  278. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/genomic-axes.md +0 -0
  279. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/genomic-data.md +0 -0
  280. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/importing-specifications.md +0 -0
  281. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/index.md +0 -0
  282. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/notebooks.md +0 -0
  283. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/scales-axes-legends.md +0 -0
  284. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/serialization.md +0 -0
  285. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/using-charts.md +0 -0
  286. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/workflows/annotate-intervals.md +0 -0
  287. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/workflows/edit-sequence.md +0 -0
  288. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/workflows/pick-genes.md +0 -0
  289. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/docs/user-guide/workflows/select-genes.md +0 -0
  290. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/notebooks/annotate_genomic_intervals.ipynb +0 -0
  291. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/notebooks/brush_linked_genome_tracks.ipynb +0 -0
  292. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/notebooks/embed_api.ipynb +0 -0
  293. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/_chart_authoring.py +0 -0
  294. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/_conditions.py +0 -0
  295. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/_embed.py +0 -0
  296. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/_expressions.py +0 -0
  297. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/_parameters.py +0 -0
  298. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/_render.py +0 -0
  299. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/_utils.py +0 -0
  300. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/_widget.py +0 -0
  301. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/arrow.py +0 -0
  302. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/channels.py +0 -0
  303. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/chart.py +0 -0
  304. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/data.py +0 -0
  305. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/data_transformers.py +0 -0
  306. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/_annotations.py +0 -0
  307. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/_direct_rna.py +0 -0
  308. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/_gistic.py +0 -0
  309. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/_grammar.py +0 -0
  310. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/_hapmap.py +0 -0
  311. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/_mutation.py +0 -0
  312. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/_oncoprint.py +0 -0
  313. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
  314. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
  315. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
  316. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
  317. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
  318. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
  319. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/p53_sequence_comparison_aligned.fasta.gz +0 -0
  320. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
  321. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
  322. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
  323. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/rnf7_direct_rna.json.gz +0 -0
  324. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
  325. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/tcga.tsv +0 -0
  326. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
  327. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
  328. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/tcga_laml_combined_oncoplot.json.gz +0 -0
  329. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/tcga_ov_gistic_lesions.tsv.gz +0 -0
  330. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/datasets/data/tcga_ov_gistic_scores.tsv.gz +0 -0
  331. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/embed.py +0 -0
  332. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/helpers.py +0 -0
  333. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/jupyter.py +0 -0
  334. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/py.typed +0 -0
  335. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/_kwds.py +0 -0
  336. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/_typing.py +0 -0
  337. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/channels.py +0 -0
  338. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/composition.py +0 -0
  339. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/ergonomics.py +0 -0
  340. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/expressions.py +0 -0
  341. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schema/lazy.py +0 -0
  342. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/schemapi.py +0 -0
  343. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/static/embed-bridge.js +0 -0
  344. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/src/genome_spy/static/widget.js +0 -0
  345. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/__init__.py +0 -0
  346. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/browser/test_docs_workflows.py +0 -0
  347. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/browser/test_embed_api.py +0 -0
  348. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/browser/test_offline_rendering.py +0 -0
  349. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/browser/test_python_web_example.py +0 -0
  350. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/embed-bridge.test.mjs +0 -0
  351. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_arrow.py +0 -0
  352. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_combined_gallery_data.py +0 -0
  353. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_data_transformers.py +0 -0
  354. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_docs_api_reference.py +0 -0
  355. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_docs_tutorial.py +0 -0
  356. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_embed.py +0 -0
  357. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_embed_notebook.py +0 -0
  358. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_expressions.py +0 -0
  359. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_generated_transform_methods.py +0 -0
  360. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_javascript_assets.py +0 -0
  361. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_python_connection_example.py +0 -0
  362. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_render_thumbnails.py +0 -0
  363. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_rnf7_direct_rna_example.py +0 -0
  364. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_widget.py +0 -0
  365. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/test_workflow_notebooks.py +0 -0
  366. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tests/widget.test.mjs +0 -0
  367. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/check_notebook_rendering.py +0 -0
  368. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/docs_gallery.py +0 -0
  369. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/generate_api_docs.py +0 -0
  370. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/generate_schema_wrapper.py +0 -0
  371. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/prepare_combined_gallery_data.py +0 -0
  372. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/prepare_refseq_gene_annotations.py +0 -0
  373. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/render_thumbnails.py +0 -0
  374. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/schemapi/__init__.py +0 -0
  375. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/schemapi/expression_codegen.py +0 -0
  376. {genome_spy_python-0.5.0 → genome_spy_python-0.6.0}/tools/vendor_javascript.py +0 -0
@@ -248,3 +248,6 @@ tools/__pycache__/
248
248
  scripts/*alphagenome*.py
249
249
  scripts/fetch_*_reference.py
250
250
  scripts/_fetch_reference.py
251
+
252
+ # Local recording demos and working files
253
+ /demos/
@@ -5,6 +5,29 @@ 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
+ ## [0.6.0] - 2026-10-01
9
+
10
+ ### Added
11
+
12
+ - Add the prepared `airway_review` dataset for gene-review examples.
13
+
14
+ ### Changed
15
+
16
+ - Upgrade GenomeSpy Core, controls, and Inspector to 1.0.0 and regenerate
17
+ the Python schema API, including configurable `displace2d` animation half-life.
18
+ - Extend the sequence-editing notebook to support multi-base edits across the
19
+ displayed locus.
20
+ - Improve interaction and PISA documentation, gallery expressions, and README
21
+ animations.
22
+
23
+ ### Fixed
24
+
25
+ - Expose selection predicate classes through `gs` and support typed endpoint
26
+ projection setters, avoiding raw dictionaries in composed conditions.
27
+ - Restrict sequence-logo and alignment-logo zoom to the position axis and share
28
+ one bottom alignment axis.
29
+ - Render the ASCAT fitting example title as literal text.
30
+
8
31
  ## [0.5.0] - 2026-09-25
9
32
 
10
33
  ### Added
@@ -18,6 +41,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
18
41
 
19
42
  ### Changed
20
43
 
44
+ - Use browser-side `displace2d` label placement in the airway volcano and MA
45
+ gallery plots, with denser gene annotations and adaptive leader lines.
46
+
21
47
  - Reorganize the gallery into 13 categories, separating regulatory model
22
48
  interpretation, read alignments and RNA splicing, sequences and alignments,
23
49
  and interaction examples from the broader browser, annotation, and basic groups.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: genome-spy-python
3
- Version: 0.5.0
3
+ Version: 0.6.0
4
4
  Summary: genome-spy-python is a declarative genomics visualization library for Python, built on top of the genome-spy JSON specification.
5
5
  Project-URL: Homepage, https://github.com/genome-spy/genome-spy-python
6
6
  Project-URL: Documentation, https://genomespy.app/genome-spy-python/
@@ -102,59 +102,113 @@ See the [getting-started guide](docs/getting-started.md) for the first example.
102
102
 
103
103
  ## Examples
104
104
 
105
+ A zoomable Manhattan plot using the bundled HapMap data (requires `pandas`):
106
+
105
107
  ```python
106
108
  import genome_spy as gs
109
+ from genome_spy.datasets import load_dataset
107
110
 
108
111
  chart = (
109
- gs.Chart(
110
- [
111
- {"x": 1, "y": 4, "group": "A"},
112
- {"x": 2, "y": 3, "group": "B"},
113
- {"x": 3, "y": 5, "group": "A"},
114
- ]
115
- )
116
- .mark_point(size=80)
112
+ # Load data.
113
+ gs.Chart(load_dataset("hapmap_gwas"))
114
+ # Format chromosome names.
115
+ .transform_formula(expr="datum.CHR == 23 ? 'chrX' : 'chr' + datum.CHR", as_="chrom")
116
+ # Calculate −log10 p.
117
+ .transform_formula(expr="-log(datum.P) / log(10)", as_="neglogp")
118
+ # Draw variants.
119
+ .mark_point(size=12)
120
+ # Set positions and colors.
117
121
  .encode(
118
- x="x:Q",
119
- y="y:Q",
120
- color="group:N",
122
+ x=gs.Locus("chrom", "BP").scale(assembly="hg18"),
123
+ y=gs.Y("neglogp:Q").title("−log10 p"),
124
+ color=gs.Color("CHR:N").scale(range=["#5b8fd6", "#8f98a3"]).legend(None),
121
125
  )
122
126
  )
123
-
124
127
  chart
125
128
  ```
126
129
 
127
- GenomeSpy also has locus-scaled axes for genomic coordinates. This small
128
- example renders intervals along a region of chromosome 1:
130
+ ![Manhattan plot zooming from the whole genome into an association peak](https://raw.githubusercontent.com/genome-spy/genome-spy-python/a6c724f48d94f86d8d0a8c3200549d7560a88a3c/docs/_static/readme-manhattan.webp)
131
+
132
+ [Explore the full example and data provenance](https://genomespy.app/genome-spy-python/gallery/manhattan_plot.html).
133
+
134
+ A sequence logo and aligned sequences with shared horizontal zoom:
129
135
 
130
136
  ```python
131
137
  import genome_spy as gs
132
138
 
133
- intervals = [
134
- {"chrom": "chr1", "start": 100, "end": 220, "name": "gene A"},
135
- {"chrom": "chr1", "start": 280, "end": 420, "name": "gene B"},
136
- ]
137
-
139
+ logo = (
140
+ gs.Chart()
141
+ # Count bases at each position.
142
+ .transform_aggregate(groupby=["pos", "sequence"])
143
+ # Handle gaps.
144
+ .transform_formula(expr="datum.sequence == '-' ? null : datum.sequence", as_="base")
145
+ # Stack bases by information content.
146
+ .transform_stack(
147
+ field="count",
148
+ groupby=["pos"],
149
+ offset="information",
150
+ baseField="base",
151
+ as_=["y0", "y1"],
152
+ )
153
+ # Draw logo letters.
154
+ .mark_text(logoLetters=True, fitToBand=True, fontWeight="bold")
155
+ # Set stack bounds.
156
+ .encode(
157
+ y=gs.Y("y0:Q").scale(domain=[0, 2], zoom=False).title("Bits"),
158
+ y2="y1:Q",
159
+ text="base:N",
160
+ )
161
+ .properties(height=100)
162
+ )
163
+ # Create sequence rows.
164
+ rows = gs.Chart().encode(y=gs.Y("identifier:N").scale(zoom=False).axis(None))
165
+ # Add base labels.
166
+ letters = rows.mark_text(size=11, fitToBand=True, opacity=0.7).encode(
167
+ text="sequence:N", color=gs.value("black")
168
+ )
169
+ # Layer tiles and labels.
170
+ sequences = (rows.mark_rect() + letters).properties(
171
+ height=gs.step(16), viewportHeight=160
172
+ )
138
173
  chart = (
139
- gs.Chart(intervals)
140
- .mark_rect()
174
+ # Combine panels.
175
+ (logo & sequences)
176
+ # Load data.
177
+ .properties(
178
+ data=gs.Data(
179
+ url="https://data.genomespy.app/sample-data/16SRNA_Deino_87seq.aln",
180
+ format=gs.data_format(type="fasta"),
181
+ )
182
+ )
183
+ # Split sequences into bases.
184
+ .transform_flatten_sequence()
185
+ # Set positions and colors.
141
186
  .encode(
142
- x=gs.Locus("chrom", "start"),
143
- x2="end:Q",
144
- y="name:N",
145
- color="name:N",
187
+ x=gs.X("pos:I").scale(domain=[190, 310], zoom=True).title(None),
188
+ color=gs.Color("sequence:N")
189
+ .scale(
190
+ domain=list("ACTGN-"),
191
+ range=["#4FBF45", "#4D96E8", "#E85F78", "#E8B322", "#BDBDBD", "#f5f5f5"],
192
+ )
193
+ .legend(None),
146
194
  )
195
+ # Share zoom and colors.
196
+ .resolve_scale(x="shared", color="shared")
197
+ .resolve_axis(x="shared")
147
198
  )
148
-
149
199
  chart
150
200
  ```
151
201
 
202
+ ![Sequence logo and aligned sequences zooming across multiple regions](https://raw.githubusercontent.com/genome-spy/genome-spy-python/main/docs/_static/readme-sequence-logo.webp?v=4cd9f86a0d31)
203
+
152
204
  Charts can be serialized to a portable GenomeSpy specification or standalone
153
205
  HTML:
154
206
 
155
207
  ```python
208
+ # Export JSON.
156
209
  chart.to_json()
157
- chart.save("intervals.html")
210
+ # Save HTML.
211
+ chart.save("chart.html")
158
212
  ```
159
213
 
160
214
  ### Update data without recreating the chart
@@ -165,12 +219,15 @@ existing GenomeSpy instance, so view state such as zoom is preserved.
165
219
 
166
220
  ```python
167
221
  chart = (
222
+ # Create an empty chart.
168
223
  gs.Chart(data={"name": "table"}, datasets={"table": []})
169
224
  .mark_point()
170
225
  .encode(x="x:Q", y="y:Q")
171
226
  )
227
+ # Show widget.
172
228
  view = chart.widget()
173
229
 
230
+ # Update data.
174
231
  view.set_dataset("table", updated_dataframe)
175
232
  ```
176
233
 
@@ -63,59 +63,113 @@ See the [getting-started guide](docs/getting-started.md) for the first example.
63
63
 
64
64
  ## Examples
65
65
 
66
+ A zoomable Manhattan plot using the bundled HapMap data (requires `pandas`):
67
+
66
68
  ```python
67
69
  import genome_spy as gs
70
+ from genome_spy.datasets import load_dataset
68
71
 
69
72
  chart = (
70
- gs.Chart(
71
- [
72
- {"x": 1, "y": 4, "group": "A"},
73
- {"x": 2, "y": 3, "group": "B"},
74
- {"x": 3, "y": 5, "group": "A"},
75
- ]
76
- )
77
- .mark_point(size=80)
73
+ # Load data.
74
+ gs.Chart(load_dataset("hapmap_gwas"))
75
+ # Format chromosome names.
76
+ .transform_formula(expr="datum.CHR == 23 ? 'chrX' : 'chr' + datum.CHR", as_="chrom")
77
+ # Calculate −log10 p.
78
+ .transform_formula(expr="-log(datum.P) / log(10)", as_="neglogp")
79
+ # Draw variants.
80
+ .mark_point(size=12)
81
+ # Set positions and colors.
78
82
  .encode(
79
- x="x:Q",
80
- y="y:Q",
81
- color="group:N",
83
+ x=gs.Locus("chrom", "BP").scale(assembly="hg18"),
84
+ y=gs.Y("neglogp:Q").title("−log10 p"),
85
+ color=gs.Color("CHR:N").scale(range=["#5b8fd6", "#8f98a3"]).legend(None),
82
86
  )
83
87
  )
84
-
85
88
  chart
86
89
  ```
87
90
 
88
- GenomeSpy also has locus-scaled axes for genomic coordinates. This small
89
- example renders intervals along a region of chromosome 1:
91
+ ![Manhattan plot zooming from the whole genome into an association peak](https://raw.githubusercontent.com/genome-spy/genome-spy-python/a6c724f48d94f86d8d0a8c3200549d7560a88a3c/docs/_static/readme-manhattan.webp)
92
+
93
+ [Explore the full example and data provenance](https://genomespy.app/genome-spy-python/gallery/manhattan_plot.html).
94
+
95
+ A sequence logo and aligned sequences with shared horizontal zoom:
90
96
 
91
97
  ```python
92
98
  import genome_spy as gs
93
99
 
94
- intervals = [
95
- {"chrom": "chr1", "start": 100, "end": 220, "name": "gene A"},
96
- {"chrom": "chr1", "start": 280, "end": 420, "name": "gene B"},
97
- ]
98
-
100
+ logo = (
101
+ gs.Chart()
102
+ # Count bases at each position.
103
+ .transform_aggregate(groupby=["pos", "sequence"])
104
+ # Handle gaps.
105
+ .transform_formula(expr="datum.sequence == '-' ? null : datum.sequence", as_="base")
106
+ # Stack bases by information content.
107
+ .transform_stack(
108
+ field="count",
109
+ groupby=["pos"],
110
+ offset="information",
111
+ baseField="base",
112
+ as_=["y0", "y1"],
113
+ )
114
+ # Draw logo letters.
115
+ .mark_text(logoLetters=True, fitToBand=True, fontWeight="bold")
116
+ # Set stack bounds.
117
+ .encode(
118
+ y=gs.Y("y0:Q").scale(domain=[0, 2], zoom=False).title("Bits"),
119
+ y2="y1:Q",
120
+ text="base:N",
121
+ )
122
+ .properties(height=100)
123
+ )
124
+ # Create sequence rows.
125
+ rows = gs.Chart().encode(y=gs.Y("identifier:N").scale(zoom=False).axis(None))
126
+ # Add base labels.
127
+ letters = rows.mark_text(size=11, fitToBand=True, opacity=0.7).encode(
128
+ text="sequence:N", color=gs.value("black")
129
+ )
130
+ # Layer tiles and labels.
131
+ sequences = (rows.mark_rect() + letters).properties(
132
+ height=gs.step(16), viewportHeight=160
133
+ )
99
134
  chart = (
100
- gs.Chart(intervals)
101
- .mark_rect()
135
+ # Combine panels.
136
+ (logo & sequences)
137
+ # Load data.
138
+ .properties(
139
+ data=gs.Data(
140
+ url="https://data.genomespy.app/sample-data/16SRNA_Deino_87seq.aln",
141
+ format=gs.data_format(type="fasta"),
142
+ )
143
+ )
144
+ # Split sequences into bases.
145
+ .transform_flatten_sequence()
146
+ # Set positions and colors.
102
147
  .encode(
103
- x=gs.Locus("chrom", "start"),
104
- x2="end:Q",
105
- y="name:N",
106
- color="name:N",
148
+ x=gs.X("pos:I").scale(domain=[190, 310], zoom=True).title(None),
149
+ color=gs.Color("sequence:N")
150
+ .scale(
151
+ domain=list("ACTGN-"),
152
+ range=["#4FBF45", "#4D96E8", "#E85F78", "#E8B322", "#BDBDBD", "#f5f5f5"],
153
+ )
154
+ .legend(None),
107
155
  )
156
+ # Share zoom and colors.
157
+ .resolve_scale(x="shared", color="shared")
158
+ .resolve_axis(x="shared")
108
159
  )
109
-
110
160
  chart
111
161
  ```
112
162
 
163
+ ![Sequence logo and aligned sequences zooming across multiple regions](https://raw.githubusercontent.com/genome-spy/genome-spy-python/main/docs/_static/readme-sequence-logo.webp?v=4cd9f86a0d31)
164
+
113
165
  Charts can be serialized to a portable GenomeSpy specification or standalone
114
166
  HTML:
115
167
 
116
168
  ```python
169
+ # Export JSON.
117
170
  chart.to_json()
118
- chart.save("intervals.html")
171
+ # Save HTML.
172
+ chart.save("chart.html")
119
173
  ```
120
174
 
121
175
  ### Update data without recreating the chart
@@ -126,12 +180,15 @@ existing GenomeSpy instance, so view state such as zoom is preserved.
126
180
 
127
181
  ```python
128
182
  chart = (
183
+ # Create an empty chart.
129
184
  gs.Chart(data={"name": "table"}, datasets={"table": []})
130
185
  .mark_point()
131
186
  .encode(x="x:Q", y="y:Q")
132
187
  )
188
+ # Show widget.
133
189
  view = chart.widget()
134
190
 
191
+ # Update data.
135
192
  view.set_dataset("table", updated_dataframe)
136
193
  ```
137
194
 
@@ -14,6 +14,10 @@ browser files are generated from the pinned `@genome-spy/core` and
14
14
  `@genome-spy/inspector` npm releases and include their bundled open-source
15
15
  runtime dependencies.
16
16
 
17
+ The workflow menu and dialog styles in `docs/_static/workflows.css` adapt
18
+ GenomeSpy App's `_generic.scss`, `baseDialog.js`, and `componentStyles.js`
19
+ under the same MIT license.
20
+
17
21
  The Core browser bundle embeds the Lato font bitmap and metrics, copyright
18
22
  2010–2014 tyPoland Lukasz Dziedzic, with Reserved Font Name "Lato", under the
19
23
  SIL Open Font License 1.1. Its full upstream notice is retained in
@@ -169,3 +173,12 @@ The adapted areas are:
169
173
  `tools/generate_schema_wrapper.py`;
170
174
  - the multifeature penguins and cars strip-plot cases in `tests/test_chart.py`,
171
175
  adapted from Altair's example suite and mark documentation.
176
+
177
+ ## Prepared airway review table
178
+
179
+ `airway_review.json.gz` uses the same Bioconnector workshop tables and paired
180
+ log-count t-tests as the gallery volcano example. Source attribution and
181
+ CC BY-NC-SA 4.0 terms are listed under Airway data above. Added fields contain
182
+ gallery statistics, display values, sample counts, and host aliases;
183
+ `tools/prepare_airway_review.py` reproduces the transformation. Source checksums
184
+ are retained in the bundle. No PyDESeq2 analysis is used.
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 650 497" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"><g><path d="M89.04,354.223c0,0 8.235,46.873 26.95,73.014c18.715,26.141 76.485,66.864 76.485,66.864c0,0 71.387,-53.269 132.868,-174.003c0,0 18.387,2.122 37.318,-9.43c18.93,-11.552 17.227,-6.777 23.076,-23.338c0,0 57.472,10.176 133.729,-0.832c43.096,-6.222 87.538,-20.416 127.457,-50.325c0,0 -23.608,-34.551 -52.116,-105.406c-10.848,-26.959 -40.294,-37.125 -94.4,-94.654l-167.7,177.164l-243.668,140.945Z" style="fill-opacity:0.11;"/></g><g><path d="M251.063,229.621c0,0 -81.99,-37.202 -245.98,55.639c0,0 20.763,74.975 49.947,106.825c29.185,31.848 47.202,74.525 94.583,96.096c0,0 96.143,-61.477 141.731,-189.885l62.887,-40.211c0,0 95.533,57.541 256.482,-32.247c0,0 -12.007,-68.269 -61.168,-124.472c-52.15,-59.618 -77.935,-96.782 -77.935,-96.782c0,0 -83.958,47.979 -153.04,192.581l-67.507,32.457Z" style="fill:#7fbbdd;"/><clipPath id="_clip1"><path d="M251.063,229.621c0,0 -81.99,-37.202 -245.98,55.639c0,0 20.763,74.975 49.947,106.825c29.185,31.848 47.202,74.525 94.583,96.096c0,0 96.143,-61.477 141.731,-189.885l62.887,-40.211c0,0 95.533,57.541 256.482,-32.247c0,0 -12.007,-68.269 -61.168,-124.472c-52.15,-59.618 -77.935,-96.782 -77.935,-96.782c0,0 -83.958,47.979 -153.04,192.581l-67.507,32.457Z"/></clipPath><g clip-path="url(#_clip1)"><path d="M56,444.5c0,0 26.361,-47.811 96.486,-67c102.441,-28.032 107.921,-41.489 143.514,-82c57.943,-65.949 119.036,-13.987 191,-83c52.116,-49.978 96.483,-67.007 104.713,-76c22.96,-25.088 49.253,112.734 47.287,115.474l-292.12,73.526l-181.88,192l-109,-73Z" style="fill:#63a3c7;"/></g><g><clipPath id="_clip2"><path d="M251.063,229.621c0,0 -81.99,-37.202 -245.98,55.639c0,0 20.763,74.975 49.947,106.825c29.185,31.848 47.202,74.525 94.583,96.096c0,0 96.143,-61.477 141.731,-189.885l62.887,-40.211c0,0 95.533,57.541 256.482,-32.247c0,0 -12.007,-68.269 -61.168,-124.472c-52.15,-59.618 -77.935,-96.782 -77.935,-96.782c0,0 -83.958,47.979 -153.04,192.581l-67.507,32.457Z"/></clipPath><g clip-path="url(#_clip2)"><g><path d="M271.179,279.61c3.32,15.643 -17.832,37.052 -41.341,54.277c-15.19,11.13 -56.864,19.863 -74.141,41.355c-20.149,25.065 2.186,34.54 20.104,19.615c38.597,-32.148 66.785,-56.314 72.118,-48.359c9.854,14.698 -39.76,72.778 -74.531,99.203c-17.153,13.036 -53.262,14.43 -74.227,-11.546c-7.628,-9.452 -11.882,-26.281 -9.327,-35.694c4.72,-17.397 10.997,-37.853 40.708,-61.853c38.934,-31.45 91.489,-35.185 83.193,-49.459c-9.928,-17.082 -52.072,2.157 -77.166,22.647c-31.759,25.932 -20.02,26.777 -49.078,46.409c-17.818,12.039 -36.933,5.914 -46.661,-0.38c-7.791,-5.041 -11.517,-37.951 -0.453,-58.394c15.111,-27.92 70.762,-54.533 117.743,-60.174c105.963,-12.723 108.277,19.826 113.057,42.353Zm-208.179,18.89c-5.519,0 -10,4.481 -10,10c0,5.519 4.481,10 10,10c5.519,0 10,-4.481 10,-10c-0,-5.519 -4.481,-10 -10,-10Z" style="fill:#fff;fill-opacity:0.45;"/><path d="M377.914,238.729c11.76,8.108 34.86,7.082 55.315,-8.672c24.313,-18.726 31.269,-38.485 71.603,-45.658c27.972,-4.975 30.585,18.52 12.343,28.207c-39.294,20.867 -91.316,29.349 -82.698,44.288c7.924,13.736 92.007,-9.177 125.32,-28.845c16.434,-9.702 29.604,-39.059 15.22,-65.29c-5.234,-9.544 -17.659,-18.83 -26.252,-19.947c-15.881,-2.066 -54.579,-10.062 -84.212,6.257c-38.832,21.384 -59.278,55.661 -68.256,43.911c-10.744,-14.061 20.076,-40.334 45.285,-54.041c31.904,-17.348 26.796,-13.228 52.619,-30.504c15.835,-10.594 17.163,-28.488 15.225,-38.684c-1.552,-8.166 -27.379,-22.53 -47.878,-20.399c-27.996,2.911 -68.416,39.766 -88.7,76.651c-45.749,83.189 -11.873,101.054 5.064,112.728Zm86.086,-176.229c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c-0,-5.519 4.481,-10 10,-10Z" style="fill:#fff;fill-opacity:0.45;"/></g><g><path d="M268.179,276.61c3.32,15.643 -17.832,37.052 -41.341,54.277c-15.19,11.13 -56.864,19.863 -74.141,41.355c-20.149,25.065 2.186,34.54 20.104,19.615c38.597,-32.148 66.785,-56.314 72.118,-48.359c9.854,14.698 -39.76,72.778 -74.531,99.203c-17.153,13.036 -53.262,14.43 -74.227,-11.546c-7.628,-9.452 -11.882,-26.281 -9.327,-35.694c4.72,-17.397 10.997,-37.853 40.708,-61.853c38.934,-31.45 91.489,-35.185 83.193,-49.459c-9.928,-17.082 -52.072,2.157 -77.166,22.647c-31.759,25.932 -20.02,26.777 -49.078,46.409c-17.818,12.039 -36.933,5.914 -46.661,-0.38c-7.791,-5.041 -11.517,-37.951 -0.453,-58.394c15.111,-27.92 70.762,-54.533 117.743,-60.174c105.963,-12.723 108.277,19.826 113.057,42.353Zm-208.179,18.89c-5.519,0 -10,4.481 -10,10c0,5.519 4.481,10 10,10c5.519,0 10,-4.481 10,-10c-0,-5.519 -4.481,-10 -10,-10Z" style="fill:#fff;"/><path d="M374.914,235.729c11.76,8.108 34.86,7.082 55.315,-8.672c24.313,-18.726 31.269,-38.485 71.603,-45.658c27.972,-4.975 30.585,18.52 12.343,28.207c-39.294,20.867 -91.316,29.349 -82.698,44.288c7.924,13.736 92.007,-9.177 125.32,-28.845c16.434,-9.702 29.604,-39.059 15.22,-65.29c-5.234,-9.544 -17.659,-18.83 -26.252,-19.947c-15.881,-2.066 -54.579,-10.062 -84.212,6.257c-38.832,21.384 -59.278,55.661 -68.256,43.911c-10.744,-14.061 20.076,-40.334 45.285,-54.041c31.904,-17.348 26.796,-13.228 52.619,-30.504c15.835,-10.594 17.163,-28.488 15.225,-38.684c-1.552,-8.166 -27.379,-22.53 -47.878,-20.399c-27.996,2.911 -68.416,39.766 -88.7,76.651c-45.749,83.189 -11.873,101.054 5.064,112.728Zm86.086,-176.229c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c-0,-5.519 4.481,-10 10,-10Z" style="fill:#fff;"/></g></g></g><path d="M251.063,229.621c0,0 -81.99,-37.202 -245.98,55.639c0,0 20.763,74.975 49.947,106.825c29.185,31.848 47.202,74.525 94.583,96.096c0,0 96.143,-61.477 141.731,-189.885l62.887,-40.211c0,0 95.533,57.541 256.482,-32.247c0,0 -12.007,-68.269 -61.168,-124.472c-52.15,-59.618 -77.935,-96.782 -77.935,-96.782c0,0 -83.958,47.979 -153.04,192.581l-67.507,32.457Z" style="fill:none;stroke:#000;stroke-width:4.17px;"/></g><g><path d="M249.178,229.174c0,0 42.973,-40.866 62.33,-40.064c21.784,0.902 44.598,54.518 45.544,71.163c0.947,16.644 -43.785,48.806 -64.408,46.693c0,0 1.205,-24.266 -14.29,-51.994c-15.496,-27.729 -29.177,-25.798 -29.177,-25.798Z" style="fill:#7fbbdd;"/><g><clipPath id="_clip3"><path d="M249.178,229.174c0,0 42.973,-40.866 62.33,-40.064c21.784,0.902 44.598,54.518 45.544,71.163c0.947,16.644 -43.785,48.806 -64.408,46.693c0,0 1.205,-24.266 -14.29,-51.994c-15.496,-27.729 -29.177,-25.798 -29.177,-25.798Z"/></clipPath><g clip-path="url(#_clip3)"><path d="M278.736,244.277c18.831,17.544 13.365,44.867 31.522,41.231c21.468,-4.298 29.675,-18.015 29.137,-34.975c-0.538,-16.96 -2.503,-19.359 -9.928,-37.452c-7.425,-18.092 -19.874,-21.741 -44.548,-14.902c-20.522,5.686 -17.531,4.339 -23.302,11.797c-5.771,7.459 -12.47,26.945 -12.47,26.945c0,0 7.443,-13.274 29.589,7.356Z" style="fill:#fff;"/></g></g><path d="M249.178,229.174c0,0 42.973,-40.866 62.33,-40.064c21.784,0.902 44.598,54.518 45.544,71.163c0.947,16.644 -43.785,48.806 -64.408,46.693c0,0 1.205,-24.266 -14.29,-51.994c-15.496,-27.729 -29.177,-25.798 -29.177,-25.798Z" style="fill:none;stroke:#000;stroke-width:3.96px;"/></g></svg>
@@ -11,18 +11,20 @@
11
11
  .gs-workflow input, .gs-workflow button {
12
12
  font: inherit;
13
13
  padding: 0.45rem 0.65rem;
14
- border: 1px solid var(--color-foreground-border);
14
+ border: 1px solid var(--color-foreground-border, #d6dce5);
15
15
  border-radius: 4px;
16
- color: var(--color-foreground-primary);
17
- background: var(--color-background-secondary);
16
+ color: var(--color-foreground-primary, #172637);
17
+ background: var(--color-background-secondary, #ffffff);
18
18
  }
19
19
  .gs-workflow button:not(:disabled) { cursor: pointer; }
20
20
  .gs-workflow button:disabled { opacity: 0.5; }
21
+ .gs-workflow [data-draft] { flex-basis: 100%; margin: 0; }
22
+ .gs-workflow-table button { margin: 0.15rem; }
21
23
  .gs-workflow-table { overflow: auto; max-height: 18rem; }
22
24
  .gs-workflow-table table { width: 100%; font-size: 0.85rem; border-collapse: collapse; }
23
25
  .gs-workflow-table th, .gs-workflow-table td {
24
26
  padding: 0.4rem 0.5rem;
25
- border-bottom: 1px solid var(--color-foreground-border);
27
+ border-bottom: 1px solid var(--color-foreground-border, #d6dce5);
26
28
  text-align: left;
27
29
  overflow-wrap: anywhere;
28
30
  }
@@ -144,12 +144,17 @@ Schema-backed configuration objects accepted by charts, channels, and helpers.
144
144
  GenomeAxis
145
145
  HandledTooltip
146
146
  Legend
147
+ NamedSelectionPredicateRef
147
148
  Paddings
148
149
  Parameter
150
+ ParameterPredicate
149
151
  Parse
150
152
  RulerMarkConfig
151
153
  Scale
152
154
  SelectionDomainRef
155
+ SelectionPredicateDefinition
156
+ SelectionPredicateOperand
157
+ SelectionUnionTest
153
158
  SizeDef
154
159
  Step
155
160
  Title
@@ -27,6 +27,7 @@ for JSON files. Pass `as_format="text"` to get the raw file contents instead.
27
27
 
28
28
  | Dataset | Contents |
29
29
  | --- | --- |
30
+ | `airway_review` | Gallery airway statistics and sample counts for downstream gene review |
30
31
  | `airway_metadata` | Sample table for the airway RNA-seq experiment |
31
32
  | `airway_scaledcounts` | Rounded, length-scaled gene counts for the same eight samples |
32
33
  | `hapmap_gwas` | HapMap coordinates with simulated p-values and effect sizes |
@@ -27,7 +27,7 @@ MAX_GENES = 12_000
27
27
  ZOOM_LEVEL = gs.Expression("zoomLevel")
28
28
  POINT_SIZE = gs.expr(gs.expr.min(14 * gs.expr.pow(ZOOM_LEVEL, 0.75), 64))
29
29
 
30
- # Load gene results with fold changes, p-values, and label positions ready to use.
30
+ # Load gene results with fold changes, p-values, and selected gene labels.
31
31
  data, domains = airway_differential_expression(
32
32
  min_base_mean=MIN_BASE_MEAN,
33
33
  max_genes=MAX_GENES,
@@ -114,74 +114,87 @@ ma_fc_rules = (
114
114
  )
115
115
  )
116
116
 
117
- # Connect the selected gene labels to their points.
117
+ # Share the displaced layout between labels and their shortened leader lines.
118
118
  ma_callout_lines = (
119
119
  gs.Chart()
120
- .transform_collect()
121
- .transform_filter(gs.datum.ma_label)
122
120
  .mark_rule(color="#3f4750", size=1, tooltip=None)
123
121
  .encode(
124
- x=gs.X("log10_base_mean:Q")
125
- .scale(domain=domains["ma_x"], zoom=True)
126
- .title("log10 mean count"),
127
- xOffset=gs.XOffset("ma_x_offset:Q").scale(None),
128
- y=gs.Y("log2fc:Q")
129
- .scale(reverse=False, domain=domains["ma_y"], zoom=True)
130
- .title("log2 fold change"),
131
- yOffset=gs.YOffset("ma_y_offset:Q").scale(None),
132
122
  x2=gs.X2("log10_base_mean"),
133
123
  y2=gs.Y2("log2fc"),
124
+ xOffset=gs.XOffset("leader_dx:Q").scale(None),
125
+ yOffset=gs.YOffset("leader_dy:Q").scale(None),
134
126
  )
135
127
  .properties(name="ma-callout-lines")
136
128
  )
137
129
 
138
-
139
- def ma_callout_label(*, side: str, name: str) -> gs.Chart:
140
- """Build one label layer just beyond its shortened leader line."""
141
- return (
142
- gs.Chart()
143
- .transform_collect()
144
- .transform_filter(gs.datum.ma_label & (gs.datum.ma_label_side == side))
145
- .mark_text(
146
- align="right" if side == "left" else "left",
147
- baseline="middle",
148
- dx=-4 if side == "left" else 4,
149
- dy=0,
150
- fontWeight="bold",
151
- color="#20262d",
152
- tooltip=None,
153
- )
154
- .encode(
155
- x=gs.X("log10_base_mean:Q")
156
- .scale(domain=domains["ma_x"], zoom=True)
157
- .title("log10 mean count"),
158
- xOffset=gs.XOffset("ma_x_offset:Q").scale(None),
159
- y=gs.Y("log2fc:Q")
160
- .scale(reverse=False, domain=domains["ma_y"], zoom=True)
161
- .title("log2 fold change"),
162
- yOffset=gs.YOffset("ma_y_offset:Q").scale(None),
163
- text=gs.Text("ma_label:N"),
164
- )
165
- .properties(name=name)
130
+ ma_callout_labels = (
131
+ gs.Chart()
132
+ .mark_text(
133
+ align="center",
134
+ baseline="middle",
135
+ size=14,
136
+ fontWeight="bold",
137
+ color="#20262d",
138
+ tooltip=None,
166
139
  )
140
+ .encode(
141
+ text=gs.Text("ma_label:N"),
142
+ xOffset=gs.XOffset("label_dx:Q").scale(None),
143
+ yOffset=gs.YOffset("label_dy:Q").scale(None),
144
+ )
145
+ .properties(name="ma-labels")
146
+ )
167
147
 
168
-
169
- # Place labels on either side, leaving a small gap after each line.
170
- ma_callout_labels = [
171
- ma_callout_label(
172
- side=side,
173
- name=f"ma-label-{side}",
148
+ ma_annotations = (
149
+ (ma_callout_lines + ma_callout_labels)
150
+ .transform_filter(gs.datum.ma_label)
151
+ .transform_measure_text(
152
+ field="ma_label", fontSize=14, fontWeight="bold", as_="label_width"
174
153
  )
175
- for side in ("left", "right")
176
- ]
154
+ .transform_formula(expr=gs.datum.label_width + 4, as_="label_width")
155
+ .transform_collect()
156
+ .transform_filter(
157
+ gs.expr.inrange(gs.datum.log10_base_mean, gs.expr.domain("x"))
158
+ & gs.expr.inrange(gs.datum.log2fc, gs.expr.domain("y"))
159
+ )
160
+ # Tight collision boxes reduce unnecessary separation during zooming.
161
+ .transform_displace2d(
162
+ key="ensgene",
163
+ x="log10_base_mean",
164
+ y="log2fc",
165
+ width="label_width",
166
+ height=16,
167
+ anchorWidth=8,
168
+ anchorHeight=8,
169
+ as_=["label_dx", "label_dy"],
170
+ )
171
+ # Stop each leader at the padded label box instead of crossing the text.
172
+ .transform_formula(
173
+ expr=gs.expr.max(
174
+ 0,
175
+ 1
176
+ - gs.expr.min(
177
+ gs.datum.label_width / 2 / gs.expr.max(abs(gs.datum.label_dx), 1e-6),
178
+ 8 / gs.expr.max(abs(gs.datum.label_dy), 1e-6),
179
+ ),
180
+ ),
181
+ as_="leader_scale",
182
+ )
183
+ .transform_formula(expr=gs.datum.label_dx * gs.datum.leader_scale, as_="leader_dx")
184
+ .transform_formula(expr=gs.datum.label_dy * gs.datum.leader_scale, as_="leader_dy")
185
+ .encode(
186
+ x=gs.X("log10_base_mean:Q").title("log10 mean count"),
187
+ y=gs.Y("log2fc:Q").title("log2 fold change"),
188
+ )
189
+ .properties(name="ma-annotations")
190
+ )
177
191
 
178
192
  # Put the points, guides, and labels together, then attach the sliders.
179
193
  chart = (
180
194
  gs.layer(
181
195
  ma_fc_rules,
182
196
  ma_points,
183
- ma_callout_lines,
184
- *ma_callout_labels,
197
+ ma_annotations,
185
198
  )
186
199
  .properties(
187
200
  data=data,