iplotx 0.7.0__tar.gz → 0.8.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 (229) hide show
  1. {iplotx-0.7.0 → iplotx-0.8.0}/PKG-INFO +1 -1
  2. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/network.py +8 -0
  3. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/style/__init__.py +13 -83
  4. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/tree.py +14 -0
  5. iplotx-0.8.0/iplotx/utils/style.py +128 -0
  6. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/version.py +1 -1
  7. iplotx-0.7.0/iplotx/utils/style.py +0 -17
  8. {iplotx-0.7.0 → iplotx-0.8.0}/.github/workflows/publish.yml +0 -0
  9. {iplotx-0.7.0 → iplotx-0.8.0}/.github/workflows/test.yml +0 -0
  10. {iplotx-0.7.0 → iplotx-0.8.0}/.gitignore +0 -0
  11. {iplotx-0.7.0 → iplotx-0.8.0}/.pre-commit-config.yaml +0 -0
  12. {iplotx-0.7.0 → iplotx-0.8.0}/.readthedocs.yaml +0 -0
  13. {iplotx-0.7.0 → iplotx-0.8.0}/LICENSE +0 -0
  14. {iplotx-0.7.0 → iplotx-0.8.0}/MANIFEST.in +0 -0
  15. {iplotx-0.7.0 → iplotx-0.8.0}/README.md +0 -0
  16. {iplotx-0.7.0 → iplotx-0.8.0}/assets/pylint.svg +0 -0
  17. {iplotx-0.7.0 → iplotx-0.8.0}/docs/Makefile +0 -0
  18. {iplotx-0.7.0 → iplotx-0.8.0}/docs/make.bat +0 -0
  19. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/_static/banner.png +0 -0
  20. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/_static/graph_basic.png +0 -0
  21. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/_templates/layout.html +0 -0
  22. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/api/artists.md +0 -0
  23. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/api/complete_style_specification.md +0 -0
  24. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/api/plotting.md +0 -0
  25. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/api/providers.md +0 -0
  26. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/api/style.md +0 -0
  27. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/api.md +0 -0
  28. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/conf.py +0 -0
  29. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/images/sphx_glr_plot_basic_001.png +0 -0
  30. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/images/thumb/sphx_glr_plot_basic_thumb.png +0 -0
  31. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/index.md +0 -0
  32. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/providers.md +0 -0
  33. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/sg_execution_times.rst +0 -0
  34. {iplotx-0.7.0 → iplotx-0.8.0}/docs/source/style.md +0 -0
  35. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/GALLERY_HEADER.rst +0 -0
  36. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/basic/GALLERY_HEADER.rst +0 -0
  37. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/basic/plot_basic.py +0 -0
  38. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/basic/plot_big_curves.py +0 -0
  39. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/basic/plot_dag.py +0 -0
  40. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/basic/plot_directed.py +0 -0
  41. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/basic/plot_grouping.py +0 -0
  42. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/basic/plot_house.py +0 -0
  43. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/basic/plot_loops.py +0 -0
  44. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/basic/plot_simple_path.py +0 -0
  45. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/GALLERY_HEADER.rst +0 -0
  46. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/data/80201010000000001.mst +0 -0
  47. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/data/GN-tree.json +0 -0
  48. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/data/breast_cancer_string_interactions_short.tsv +0 -0
  49. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/data/breast_cancer_string_network_coordinates.tsv +0 -0
  50. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/data/cell_cycle_arrest_string_interactions_short.tsv +0 -0
  51. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/data/cell_cycle_arrest_string_network_coordinates.tsv +0 -0
  52. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/data/fevo-08-588430_DataSheet1_S1.csv +0 -0
  53. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/plot_animal_phylogeny.py +0 -0
  54. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/plot_antibody_clone.py +0 -0
  55. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/plot_breast_cancer_ppi.py +0 -0
  56. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/plot_cell_cycle_arrest.py +0 -0
  57. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/plot_food_network.py +0 -0
  58. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/plot_foraging_table.py +0 -0
  59. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/plot_pollinators.py +0 -0
  60. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/plot_ppi.py +0 -0
  61. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/biology/plot_tca_cycle.py +0 -0
  62. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/GALLERY_HEADER.rst +0 -0
  63. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/data/chess_masters_WCC.pgn.bz2 +0 -0
  64. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/data/knuth_miles.txt.gz +0 -0
  65. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_arrowlawn.py +0 -0
  66. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_chess_masters.py +0 -0
  67. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_cliques.py +0 -0
  68. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_cluster_layout.py +0 -0
  69. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_company_structure.py +0 -0
  70. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_complex.py +0 -0
  71. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_financial_network.py +0 -0
  72. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_knuth_miles.py +0 -0
  73. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_labels_and_colors.py +0 -0
  74. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_max_bipartite_matching.py +0 -0
  75. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_minimum_spanning_trees.py +0 -0
  76. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_multipartite_layout.py +0 -0
  77. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_parallel_igraph_networkx.py +0 -0
  78. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_redblack.py +0 -0
  79. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_shortest_path.py +0 -0
  80. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_simple_networkx.py +0 -0
  81. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_social_network_circles.py +0 -0
  82. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_traveling_salesman.py +0 -0
  83. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/network_science/plot_with_colorbar.py +0 -0
  84. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/other/GALLERY_HEADER.rst +0 -0
  85. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/other/plot_animation.py +0 -0
  86. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/other/plot_edit_artists.py +0 -0
  87. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/other/plot_feedbacks.py +0 -0
  88. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/other/plot_graph.py +0 -0
  89. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/other/plot_mouse_hover.py +0 -0
  90. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/other/plot_train.py +0 -0
  91. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/GALLERY_HEADER.rst +0 -0
  92. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_arrows.py +0 -0
  93. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_edgepadding.py +0 -0
  94. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_elements.py +0 -0
  95. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_four_grids.py +0 -0
  96. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_halfarrows.py +0 -0
  97. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_multistyle.py +0 -0
  98. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_ports.py +0 -0
  99. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_style.py +0 -0
  100. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_tension.py +0 -0
  101. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_vertexmarkers.py +0 -0
  102. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_voronoi.py +0 -0
  103. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/style/plot_waypoints.py +0 -0
  104. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/GALLERY_HEADER.rst +0 -0
  105. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/data/tree-with-support.json +0 -0
  106. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_angular_waypoints.py +0 -0
  107. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_biopython_tree.py +0 -0
  108. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_cladeedges.py +0 -0
  109. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_cogent3_layouts.py +0 -0
  110. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_cogent3_tree.py +0 -0
  111. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_elements_tree.py +0 -0
  112. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_ete4.py +0 -0
  113. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_leafedges.py +0 -0
  114. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_leafedges_and_cascades.py +0 -0
  115. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_skbio_tree.py +0 -0
  116. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_split_edges.py +0 -0
  117. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_style_tree.py +0 -0
  118. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_support.py +0 -0
  119. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_tree_node_background.py +0 -0
  120. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_tree_style_clades.py +0 -0
  121. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/tree/plot_trees_of_trees.py +0 -0
  122. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/zero_dependency/GALLERY_HEADER.rst +0 -0
  123. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/zero_dependency/plot_simplenetworkdataprovider.py +0 -0
  124. {iplotx-0.7.0 → iplotx-0.8.0}/gallery/zero_dependency/plot_simpletreedataprovider.py +0 -0
  125. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/__init__.py +0 -0
  126. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/artists.py +0 -0
  127. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/cascades.py +0 -0
  128. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/edge/__init__.py +0 -0
  129. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/edge/arrow.py +0 -0
  130. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/edge/geometry.py +0 -0
  131. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/edge/leaf.py +0 -0
  132. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/edge/ports.py +0 -0
  133. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/groups.py +0 -0
  134. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/__init__.py +0 -0
  135. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/heuristics.py +0 -0
  136. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/providers/network/igraph.py +0 -0
  137. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/providers/network/networkx.py +0 -0
  138. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/providers/network/simple.py +0 -0
  139. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/providers/tree/biopython.py +0 -0
  140. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/providers/tree/cogent3.py +0 -0
  141. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/providers/tree/ete4.py +0 -0
  142. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/providers/tree/simple.py +0 -0
  143. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/providers/tree/skbio.py +0 -0
  144. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/ingest/typing.py +0 -0
  145. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/label.py +0 -0
  146. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/layout.py +0 -0
  147. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/plotting.py +0 -0
  148. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/style/leaf_info.py +0 -0
  149. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/style/library.py +0 -0
  150. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/typing.py +0 -0
  151. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/utils/geometry.py +0 -0
  152. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/utils/internal.py +0 -0
  153. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/utils/matplotlib.py +0 -0
  154. {iplotx-0.7.0 → iplotx-0.8.0}/iplotx/vertex.py +0 -0
  155. {iplotx-0.7.0 → iplotx-0.8.0}/pyproject.toml +0 -0
  156. {iplotx-0.7.0 → iplotx-0.8.0}/scripts/copy_github_release_into_version.sh +0 -0
  157. {iplotx-0.7.0 → iplotx-0.8.0}/scripts/make_banner.py +0 -0
  158. {iplotx-0.7.0 → iplotx-0.8.0}/scripts/update_pylint_badge.sh +0 -0
  159. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_biopython/cascades.png +0 -0
  160. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_biopython/directed_child.png +0 -0
  161. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_biopython/leaf_labels.png +0 -0
  162. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_biopython/leaf_labels_hmargin.png +0 -0
  163. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_biopython/leafedges.png +0 -0
  164. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_biopython/show_support.png +0 -0
  165. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_biopython/tree_basic.png +0 -0
  166. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_biopython/tree_radial.png +0 -0
  167. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_cogent3/leaf_labels.png +0 -0
  168. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_cogent3/leaf_labels_hmargin.png +0 -0
  169. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_cogent3/tree_basic.png +0 -0
  170. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_cogent3/tree_radial.png +0 -0
  171. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_ete4/leaf_labels.png +0 -0
  172. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_ete4/leaf_labels_hmargin.png +0 -0
  173. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_ete4/split_edges.png +0 -0
  174. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_ete4/tree_basic.png +0 -0
  175. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_ete4/tree_radial.png +0 -0
  176. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/clustering_directed.png +0 -0
  177. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/clustering_directed_large.png +0 -0
  178. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_basic.png +0 -0
  179. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_directed.png +0 -0
  180. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_directed_curved_loops.png +0 -0
  181. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_edit_children.png +0 -0
  182. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_labels.png +0 -0
  183. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_layout_attribute.png +0 -0
  184. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_null.png +0 -0
  185. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_squares_directed.png +0 -0
  186. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_vertexsize.png +0 -0
  187. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/graph_with_curved_edges.png +0 -0
  188. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/igraph_layout_object.png +0 -0
  189. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_igraph/multigraph_with_curved_edges_undirected.png +0 -0
  190. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/cluster-layout.png +0 -0
  191. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/complex.png +0 -0
  192. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/complex_rotatelabels.png +0 -0
  193. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/directed_graph.png +0 -0
  194. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/directed_graph_with_colorbar.png +0 -0
  195. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/empty_graph.png +0 -0
  196. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/flat_style.png +0 -0
  197. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/house_with_colors.png +0 -0
  198. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/labels_and_colors.png +0 -0
  199. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/shortest_path.png +0 -0
  200. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_networkx/simple_graph.png +0 -0
  201. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_simple_network_provider/graph_basic.png +0 -0
  202. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_simple_network_provider/graph_directed.png +0 -0
  203. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_simple_network_provider/graph_labels.png +0 -0
  204. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_skbio/leaf_labels.png +0 -0
  205. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_skbio/leaf_labels_hmargin.png +0 -0
  206. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_skbio/tree_basic.png +0 -0
  207. {iplotx-0.7.0 → iplotx-0.8.0}/tests/baseline_images/test_skbio/tree_radial.png +0 -0
  208. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_arrows.py +0 -0
  209. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_biopython.py +0 -0
  210. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_cascades.py +0 -0
  211. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_cogent3.py +0 -0
  212. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_edge.py +0 -0
  213. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_edge_geometry.py +0 -0
  214. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_ete4.py +0 -0
  215. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_geometry.py +0 -0
  216. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_heuristics.py +0 -0
  217. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_igraph.py +0 -0
  218. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_ingest_protocols.py +0 -0
  219. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_matplotlib_utils.py +0 -0
  220. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_network_hotload.py +0 -0
  221. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_networkx.py +0 -0
  222. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_ports.py +0 -0
  223. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_simple_network_provider.py +0 -0
  224. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_simple_tree_provider.py +0 -0
  225. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_skbio.py +0 -0
  226. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_style.py +0 -0
  227. {iplotx-0.7.0 → iplotx-0.8.0}/tests/test_vertex.py +0 -0
  228. {iplotx-0.7.0 → iplotx-0.8.0}/tests/utils.py +0 -0
  229. {iplotx-0.7.0 → iplotx-0.8.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iplotx
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: Plot networkx from igraph and networkx.
5
5
  Project-URL: Homepage, https://github.com/fabilab/iplotx
6
6
  Project-URL: Documentation, https://readthedocs.org/iplotx
@@ -162,6 +162,8 @@ class NetworkArtist(mpl.artist.Artist):
162
162
  """Get VertexCollection artist."""
163
163
  return self._vertices
164
164
 
165
+ get_nodes = get_vertices
166
+
165
167
  def get_edges(self):
166
168
  """Get EdgeCollection artist."""
167
169
  return self._edges
@@ -170,6 +172,8 @@ class NetworkArtist(mpl.artist.Artist):
170
172
  """Get list of vertex label artists."""
171
173
  return self._vertices.get_labels()
172
174
 
175
+ get_node_labels = get_vertex_labels
176
+
173
177
  def get_edge_labels(self):
174
178
  """Get list of edge label artists."""
175
179
  return self._edges.get_labels()
@@ -211,6 +215,10 @@ class NetworkArtist(mpl.artist.Artist):
211
215
  return vertex_layout_df
212
216
 
213
217
  def _get_label_series(self, kind):
218
+ # Equivalence vertex/node
219
+ if kind == "node":
220
+ kind = "vertex"
221
+
214
222
  if "label" in self._ipx_internal_data[f"{kind}_df"].columns:
215
223
  return self._ipx_internal_data[f"{kind}_df"]["label"]
216
224
  else:
@@ -1,16 +1,24 @@
1
+ """
2
+ Main style module for iplotx.
3
+ """
4
+
1
5
  from typing import (
2
6
  Any,
3
7
  Iterable,
4
8
  Optional,
5
9
  Sequence,
6
10
  )
7
- from collections import defaultdict
8
11
  from collections.abc import Hashable
9
12
  from contextlib import contextmanager
10
13
  import numpy as np
11
14
  import pandas as pd
12
15
 
13
- from ..utils.style import copy_with_deep_values
16
+ from ..utils.style import (
17
+ copy_with_deep_values,
18
+ sanitize_leaves,
19
+ update_style,
20
+ sanitize_ambiguous,
21
+ )
14
22
  from .library import style_library
15
23
  from .leaf_info import (
16
24
  style_leaves,
@@ -83,94 +91,16 @@ def merge_styles(
83
91
  Returns:
84
92
  The composite style as a dict.
85
93
  """
86
- try:
87
- import networkx as nx
88
- except ImportError:
89
- nx = None
90
-
91
- def _sanitize_leaves(style: dict):
92
- for key, value in style.items():
93
- if key in style_leaves:
94
- # Networkx has a few lazy data structures
95
- # TODO: move this code to provider
96
- if nx is not None:
97
- if isinstance(value, nx.classes.reportviews.NodeView):
98
- style[key] = dict(value)
99
- elif isinstance(value, nx.classes.reportviews.EdgeViewABC):
100
- style[key] = [v for *e, v in value]
101
-
102
- elif isinstance(value, dict):
103
- _sanitize_leaves(value)
104
-
105
- def _update(style: dict, current: dict):
106
- for key, value in style.items():
107
- if key not in current:
108
- current[key] = value
109
- continue
110
-
111
- # Style non-leaves are either recurred into or deleted
112
- if key not in style_leaves:
113
- if isinstance(value, dict):
114
- _update(value, current[key])
115
- elif value is None:
116
- del current[key]
117
- else:
118
- raise ValueError(
119
- f"Setting non-leaf style value to a non-dict: {key}, {value}",
120
- )
121
- else:
122
- # Style leaves could be incomplete, ensure a sensible default
123
- if value is None:
124
- del current[key]
125
- continue
126
-
127
- if not isinstance(value, dict):
128
- current[key] = value
129
- continue
130
-
131
- if hasattr(value, "default_factory"):
132
- current[key] = value
133
- continue
134
-
135
- if hasattr(current[key], "default_factory"):
136
- default_value = current[key].default_factory()
137
- else:
138
- default_value = current[key]
139
- current[key] = defaultdict(
140
- lambda: default_value,
141
- value,
142
- )
143
-
144
- def _sanitize_ambiguous(style: dict):
145
- """Fix a few ambiguous cases in the style dict."""
146
-
147
- # Accept "node" style as "vertex" style for user flexibility
148
- if "node" in style:
149
- style_node = style.pop("node")
150
- if "vertex" not in style:
151
- style["vertex"] = style_node
152
- else:
153
- # "node" style applies on TOP of "vertex" style
154
- _update(style_node, style["vertex"])
155
-
156
- # NOTE: Deprecate edge_padding for edge_shrink
157
- for edgekey in ["edge", "leafedge"]:
158
- if "padding" in style.get(edgekey, {}):
159
- # shrink takes over
160
- if "shrink" in style[edgekey]:
161
- del style[edgekey]["padding"]
162
- else:
163
- style[edgekey]["shrink"] = style[edgekey].pop("padding")
164
94
 
165
95
  merged = {}
166
96
  for style in styles:
167
97
  if isinstance(style, str):
168
98
  style = get_style(style)
169
99
  else:
170
- _sanitize_leaves(style)
100
+ sanitize_leaves(style)
171
101
  unflatten_style(style)
172
- _sanitize_ambiguous(style)
173
- _update(style, merged)
102
+ sanitize_ambiguous(style)
103
+ update_style(style, merged)
174
104
 
175
105
  return merged
176
106
 
@@ -193,6 +193,10 @@ class TreeArtist(mpl.artist.Artist):
193
193
  """Get vertex or edge layout."""
194
194
  layout_columns = [f"_ipx_layout_{i}" for i in range(self._ipx_internal_data["ndim"])]
195
195
 
196
+ # Equivalence vertex <-> node
197
+ if kind == "node":
198
+ kind = "vertex"
199
+
196
200
  if kind == "vertex":
197
201
  layout = self._ipx_internal_data["vertex_df"][layout_columns]
198
202
  return layout
@@ -245,6 +249,10 @@ class TreeArtist(mpl.artist.Artist):
245
249
  return bbox
246
250
 
247
251
  def _get_label_series(self, kind: str) -> Optional[pd.Series]:
252
+ # Equivalence vertex <-> node
253
+ if kind == "node":
254
+ kind = "vertex"
255
+
248
256
  if "label" in self._ipx_internal_data[f"{kind}_df"].columns:
249
257
  return self._ipx_internal_data[f"{kind}_df"]["label"]
250
258
  else:
@@ -254,6 +262,8 @@ class TreeArtist(mpl.artist.Artist):
254
262
  """Get VertexCollection artist."""
255
263
  return self._vertices
256
264
 
265
+ get_nodes = get_vertices
266
+
257
267
  def get_edges(self) -> EdgeCollection:
258
268
  """Get EdgeCollection artist."""
259
269
  return self._edges
@@ -262,6 +272,8 @@ class TreeArtist(mpl.artist.Artist):
262
272
  """Get leaf VertexCollection artist."""
263
273
  return self._leaf_vertices
264
274
 
275
+ get_leaf_nodes = get_leaf_vertices
276
+
265
277
  def get_leaf_edges(self) -> Optional[LeafEdgeCollection]:
266
278
  """Get LeafEdgeCollection artist if present."""
267
279
  if hasattr(self, "_leaf_edges"):
@@ -272,6 +284,8 @@ class TreeArtist(mpl.artist.Artist):
272
284
  """Get list of vertex label artists."""
273
285
  return self._vertices.get_labels()
274
286
 
287
+ get_node_labels = get_vertex_labels
288
+
275
289
  def get_edge_labels(self) -> LabelCollection:
276
290
  """Get list of edge label artists."""
277
291
  return self._edges.get_labels()
@@ -0,0 +1,128 @@
1
+ import copy
2
+ from collections import defaultdict
3
+
4
+ from ..style.leaf_info import (
5
+ style_leaves,
6
+ )
7
+
8
+ try:
9
+ import networkx as nx
10
+ except ImportError:
11
+ nx = None
12
+
13
+
14
+ def copy_with_deep_values(style):
15
+ """Make a deep copy of the style dict but do not create copies of the keys."""
16
+ # Defaultdict should be respected
17
+ if hasattr(style, "default_factory"):
18
+ newdict = defaultdict(lambda: style.default_factory())
19
+ else:
20
+ newdict = {}
21
+ for key, value in style.items():
22
+ if isinstance(value, dict):
23
+ newdict[key] = copy_with_deep_values(value)
24
+ else:
25
+ newdict[key] = copy.copy(value)
26
+ return newdict
27
+
28
+
29
+ def sanitize_leaves(style: dict):
30
+ """Sanitize the leaves of a style dictionary.
31
+
32
+ Parameters:
33
+ style (dict): A style dictionary.
34
+ Returns:
35
+ None: The style dictionary is modified in place.
36
+ """
37
+ for key, value in style.items():
38
+ if key in style_leaves:
39
+ # Networkx has a few lazy data structures
40
+ # TODO: move this code to provider
41
+ if nx is not None:
42
+ if isinstance(value, nx.classes.reportviews.NodeView):
43
+ style[key] = dict(value)
44
+ elif isinstance(value, nx.classes.reportviews.EdgeViewABC):
45
+ style[key] = [v for *e, v in value]
46
+
47
+ elif isinstance(value, dict):
48
+ sanitize_leaves(value)
49
+
50
+
51
+ def update_style(new_style: dict, current_style: dict):
52
+ """Update the current style with a new style.
53
+
54
+ Parameters:
55
+ new_style (dict): A new style dictionary.
56
+ current_style (dict): The current style dictionary.
57
+ Returns:
58
+ None: The current style dictionary is modified in place.
59
+ """
60
+ for key, value in new_style.items():
61
+ if key not in current_style:
62
+ current_style[key] = value
63
+ continue
64
+
65
+ # Style non-leaves are either recurred into or deleted
66
+ if key not in style_leaves:
67
+ if isinstance(value, dict):
68
+ update_style(value, current_style[key])
69
+ elif value is None:
70
+ del current_style[key]
71
+ else:
72
+ raise ValueError(
73
+ f"Setting non-leaf style value to a non-dict: {key}, {value}",
74
+ )
75
+ else:
76
+ # Style leaves could be incomplete, ensure a sensible default
77
+ if value is None:
78
+ del current_style[key]
79
+ continue
80
+
81
+ if not isinstance(value, dict):
82
+ current_style[key] = value
83
+ continue
84
+
85
+ if hasattr(value, "default_factory"):
86
+ current_style[key] = value
87
+ continue
88
+
89
+ if hasattr(current_style[key], "default_factory"):
90
+ default_value = current_style[key].default_factory()
91
+ else:
92
+ default_value = current_style[key]
93
+ current_style[key] = defaultdict(
94
+ lambda: default_value,
95
+ value,
96
+ )
97
+
98
+
99
+ def sanitize_ambiguous(style: dict):
100
+ """Fix a few ambiguous cases in the style dict.
101
+
102
+ Parameters:
103
+ style (dict): A style dictionary. This must be unflattened beforehand.
104
+ Returns:
105
+ None: The style dictionary is modified in place.
106
+
107
+ NOTE: This function exists by design, not accident. It is useful for purposeful
108
+ (e.g. node vs vertex) or historical (e.g. edge_padding vs edge_shrink) reasons.
109
+ Either way, it softens the user experience without complicating the API.
110
+ """
111
+
112
+ # Accept "node" style as "vertex" style for user flexibility
113
+ if "node" in style:
114
+ style_node = style.pop("node")
115
+ if "vertex" not in style:
116
+ style["vertex"] = style_node
117
+ else:
118
+ # "node" style applies on TOP of "vertex" style
119
+ update_style(style_node, style["vertex"])
120
+
121
+ # NOTE: Deprecate edge_padding for edge_shrink
122
+ for edgekey in ["edge", "leafedge"]:
123
+ if "padding" in style.get(edgekey, {}):
124
+ # shrink takes over
125
+ if "shrink" in style[edgekey]:
126
+ del style[edgekey]["padding"]
127
+ else:
128
+ style[edgekey]["shrink"] = style[edgekey].pop("padding")
@@ -2,4 +2,4 @@
2
2
  iplotx version information module.
3
3
  """
4
4
 
5
- __version__ = "0.7.0"
5
+ __version__ = "0.8.0"
@@ -1,17 +0,0 @@
1
- import copy
2
- from collections import defaultdict
3
-
4
-
5
- def copy_with_deep_values(style):
6
- """Make a deep copy of the style dict but do not create copies of the keys."""
7
- # Defaultdict should be respected
8
- if hasattr(style, "default_factory"):
9
- newdict = defaultdict(lambda: style.default_factory())
10
- else:
11
- newdict = {}
12
- for key, value in style.items():
13
- if isinstance(value, dict):
14
- newdict[key] = copy_with_deep_values(value)
15
- else:
16
- newdict[key] = copy.copy(value)
17
- return newdict
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes