iplotx 1.0.1__tar.gz → 1.2.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.
- {iplotx-1.0.1 → iplotx-1.2.0}/PKG-INFO +2 -3
- {iplotx-1.0.1 → iplotx-1.2.0}/README.md +1 -2
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/api/complete_style_specification.md +9 -2
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/sg_execution_times.rst +6 -3
- iplotx-1.2.0/gallery/tree/plot_double_tree.py +91 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/__init__.py +2 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/edge/__init__.py +6 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/layout.py +30 -1
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/plotting.py +89 -3
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/tree/__init__.py +25 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/tree/cascades.py +6 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/version.py +1 -1
- iplotx-1.2.0/tests/baseline_images/test_doubletree/tree_gap.png +0 -0
- iplotx-1.2.0/tests/baseline_images/test_doubletree/tree_nogap.png +0 -0
- iplotx-1.2.0/tests/test_doubletree.py +66 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/.github/workflows/publish.yml +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/.github/workflows/test.yml +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/.gitignore +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/.pre-commit-config.yaml +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/.readthedocs.yaml +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/LICENSE +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/MANIFEST.in +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/assets/pylint.svg +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/Makefile +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/make.bat +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/_static/banner.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/_static/custom-icons.js +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/_static/custom.css +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/_static/graph_basic.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/_templates/layout.html +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/api/artists.md +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/api/plotting.md +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/api/providers.md +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/api/style.md +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/api.md +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/conf.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/images/sphx_glr_plot_basic_001.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/images/thumb/sphx_glr_plot_basic_thumb.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/index.md +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/installing.md +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/providers.md +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/docs/source/style.md +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/GALLERY_HEADER.rst +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/GALLERY_HEADER.rst +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/plot_3d.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/plot_basic.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/plot_big_curves.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/plot_dag.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/plot_directed.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/plot_grouping.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/plot_house.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/plot_loops.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/basic/plot_simple_path.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/GALLERY_HEADER.rst +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/80201010000000001.mst +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/GN-tree.json +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/breast_cancer_string_interactions_short.tsv +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/breast_cancer_string_network_coordinates.tsv +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/cell_cycle_arrest_string_interactions_short.tsv +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/cell_cycle_arrest_string_network_coordinates.tsv +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/fevo-08-588430_DataSheet1_S1.csv +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/plot_animal_phylogeny.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/plot_antibody_clone.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/plot_breast_cancer_ppi.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/plot_cell_cycle_arrest.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/plot_food_network.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/plot_foraging_table.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/plot_pollinators.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/plot_ppi.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/plot_tca_cycle.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/GALLERY_HEADER.rst +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/data/chess_masters_WCC.pgn.bz2 +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/data/knuth_miles.txt.gz +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_arrowlawn.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_chess_masters.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_cliques.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_cluster_layout.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_company_structure.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_complex.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_financial_network.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_knuth_miles.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_labels_and_colors.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_max_bipartite_matching.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_minimum_spanning_trees.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_multipartite_layout.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_parallel_igraph_networkx.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_redblack.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_shortest_path.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_simple_networkx.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_social_network_circles.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_traveling_salesman.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/network_science/plot_with_colorbar.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/other/GALLERY_HEADER.rst +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/other/plot_animation.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/other/plot_edit_artists.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/other/plot_feedbacks.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/other/plot_graph.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/other/plot_mouse_hover.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/other/plot_train.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/GALLERY_HEADER.rst +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_arrows.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_depthshade.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_edgepadding.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_elements.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_four_grids.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_halfarrows.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_multistyle.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_ports.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_style.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_tension.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_vertexmarkers.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_voronoi.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/style/plot_waypoints.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/GALLERY_HEADER.rst +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/data/tree-with-support.json +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_angular_waypoints.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_biopython_tree.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_cladeedges.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_cogent3_layouts.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_cogent3_tree.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_dendropy.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_elements_tree.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_ete4.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_leafedges.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_leafedges_and_cascades.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_scalebar.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_skbio_tree.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_split_edges.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_style_tree.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_support.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_tree_node_background.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_tree_style_clades.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/tree/plot_trees_of_trees.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/zero_dependency/GALLERY_HEADER.rst +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/zero_dependency/plot_simplenetworkdataprovider.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/gallery/zero_dependency/plot_simpletreedataprovider.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/art3d/edge/__init__.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/art3d/edge/arrow.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/art3d/edge/geometry.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/art3d/vertex.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/artists.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/edge/arrow.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/edge/geometry.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/edge/leaf.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/edge/ports.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/__init__.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/heuristics.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/network/graph_tool.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/network/igraph.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/network/networkx.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/network/simple.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/tree/biopython.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/tree/cogent3.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/tree/dendropy.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/tree/ete4.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/tree/simple.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/providers/tree/skbio.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/ingest/typing.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/label.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/network/__init__.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/network/groups.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/style/__init__.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/style/leaf_info.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/style/library.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/tree/scalebar.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/typing.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/utils/geometry.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/utils/internal.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/utils/matplotlib.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/utils/style.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/iplotx/vertex.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/pyproject.toml +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/scripts/copy_github_release_into_version.sh +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/scripts/make_banner.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/scripts/update_pylint_badge.sh +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_biopython/cascades.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_biopython/directed_child.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_biopython/leaf_labels.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_biopython/leaf_labels_hmargin.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_biopython/leafedges.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_biopython/show_support.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_biopython/tree_basic.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_biopython/tree_radial.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_cogent3/leaf_labels.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_cogent3/leaf_labels_hmargin.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_cogent3/tree_basic.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_cogent3/tree_radial.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_dendropy/cascades.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_dendropy/directed_child.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_dendropy/leaf_labels.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_dendropy/leaf_labels_hmargin.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_dendropy/leafedges.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_dendropy/tree_basic.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_dendropy/tree_radial.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_ete4/leaf_labels.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_ete4/leaf_labels_hmargin.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_ete4/split_edges.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_ete4/tree_basic.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_ete4/tree_radial.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_graph_tool/graph_basic.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_graph_tool/graph_directed.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/clustering_directed.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/clustering_directed_large.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_basic.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_directed.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_directed_curved_loops.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_edit_children.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_labels.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_layout_attribute.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_null.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_squares_directed.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_vertexsize.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/graph_with_curved_edges.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/igraph_layout_object.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph/multigraph_with_curved_edges_undirected.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph_3d/directed.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph_3d/undirected.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_igraph_3d/vertex_labels.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/cluster-layout.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/complex.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/complex_rotatelabels.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/directed_graph.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/directed_graph_with_colorbar.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/empty_graph.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/flat_style.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/house_with_colors.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/labels_and_colors.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/shortest_path.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_networkx/simple_graph.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_simple_network_provider/graph_basic.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_simple_network_provider/graph_directed.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_simple_network_provider/graph_labels.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_skbio/leaf_labels.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_skbio/leaf_labels_hmargin.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_skbio/tree_basic.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/baseline_images/test_skbio/tree_radial.png +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_arrows.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_biopython.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_cascades.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_cogent3.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_dendropy.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_edge.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_edge_geometry.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_ete4.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_geometry.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_graph_tool.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_heuristics.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_igraph.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_igraph_3d.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_ingest_protocols.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_matplotlib_utils.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_network_hotload.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_networkx.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_ports.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_simple_network_provider.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_simple_tree_provider.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_skbio.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_style.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/test_vertex.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/tests/utils.py +0 -0
- {iplotx-1.0.1 → iplotx-1.2.0}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: iplotx
|
|
3
|
-
Version: 1.0
|
|
3
|
+
Version: 1.2.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
|
|
@@ -78,8 +78,7 @@ import iplotx as ipx
|
|
|
78
78
|
|
|
79
79
|
g = nx.Graph([(0, 1), (1, 2), (2, 3), (3, 4), (4, 0)])
|
|
80
80
|
layout = nx.layout.circular_layout(g)
|
|
81
|
-
|
|
82
|
-
ipx.plot(g, ax=ax, layout=layout)
|
|
81
|
+
ipx.plot(g, layout)
|
|
83
82
|
```
|
|
84
83
|
|
|
85
84
|

|
|
@@ -40,8 +40,7 @@ import iplotx as ipx
|
|
|
40
40
|
|
|
41
41
|
g = nx.Graph([(0, 1), (1, 2), (2, 3), (3, 4), (4, 0)])
|
|
42
42
|
layout = nx.layout.circular_layout(g)
|
|
43
|
-
|
|
44
|
-
ipx.plot(g, ax=ax, layout=layout)
|
|
43
|
+
ipx.plot(g, layout)
|
|
45
44
|
```
|
|
46
45
|
|
|
47
46
|

|
|
@@ -274,8 +274,15 @@
|
|
|
274
274
|
# - "radial" layout: "clockwise" or "counterclockwise"
|
|
275
275
|
"orientation": str,
|
|
276
276
|
"angular": bool, # Whether to use an angular or waypoint-based layout
|
|
277
|
-
|
|
278
|
-
|
|
277
|
+
# The following two parameters are used differently depending on the layout.
|
|
278
|
+
# For radial layouts:
|
|
279
|
+
# start: Starting angle (in degrees, one float)
|
|
280
|
+
# span: Angle span (in degrees)
|
|
281
|
+
# For horizontal and vertical layouts:
|
|
282
|
+
# start: Starting position in data units (tuple of two floats)
|
|
283
|
+
# span: Breadth in data units (float)
|
|
284
|
+
"start": float | tuple[float, float],
|
|
285
|
+
"span": float,
|
|
279
286
|
},
|
|
280
287
|
############################################################################
|
|
281
288
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
Computation times
|
|
8
8
|
=================
|
|
9
|
-
**00:00.
|
|
9
|
+
**00:00.565** total execution time for 77 files **from all galleries**:
|
|
10
10
|
|
|
11
11
|
.. container::
|
|
12
12
|
|
|
@@ -32,8 +32,8 @@ Computation times
|
|
|
32
32
|
* - Example
|
|
33
33
|
- Time
|
|
34
34
|
- Mem (MB)
|
|
35
|
-
* - :ref:`
|
|
36
|
-
- 00:00.
|
|
35
|
+
* - :ref:`sphx_glr_gallery_tree_plot_double_tree.py` (``../../gallery/tree/plot_double_tree.py``)
|
|
36
|
+
- 00:00.565
|
|
37
37
|
- 0.0
|
|
38
38
|
* - :ref:`sphx_glr_gallery_basic_plot_3d.py` (``../../gallery/basic/plot_3d.py``)
|
|
39
39
|
- 00:00.000
|
|
@@ -233,6 +233,9 @@ Computation times
|
|
|
233
233
|
* - :ref:`sphx_glr_gallery_tree_plot_leafedges_and_cascades.py` (``../../gallery/tree/plot_leafedges_and_cascades.py``)
|
|
234
234
|
- 00:00.000
|
|
235
235
|
- 0.0
|
|
236
|
+
* - :ref:`sphx_glr_gallery_tree_plot_scalebar.py` (``../../gallery/tree/plot_scalebar.py``)
|
|
237
|
+
- 00:00.000
|
|
238
|
+
- 0.0
|
|
236
239
|
* - :ref:`sphx_glr_gallery_tree_plot_skbio_tree.py` (``../../gallery/tree/plot_skbio_tree.py``)
|
|
237
240
|
- 00:00.000
|
|
238
241
|
- 0.0
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Double tree
|
|
3
|
+
===========
|
|
4
|
+
|
|
5
|
+
This example shows how to use `iplotx` to plot two trees facing each other, which is typical in coevolutionary studies.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from ete4 import Tree
|
|
9
|
+
from matplotlib import pyplot as plt
|
|
10
|
+
import iplotx as ipx
|
|
11
|
+
|
|
12
|
+
tree1 = Tree(
|
|
13
|
+
"((),((),(((),()),((),()))));",
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
tree2 = Tree(
|
|
18
|
+
"((),((),(),((),())),());",
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
fig, ax = plt.subplots(figsize=(9, 4))
|
|
22
|
+
|
|
23
|
+
# Plot first tree on the left
|
|
24
|
+
ipx.plotting.tree(
|
|
25
|
+
tree1,
|
|
26
|
+
ax=ax,
|
|
27
|
+
aspect=1,
|
|
28
|
+
edge_color="tomato",
|
|
29
|
+
leaf_deep=True,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Plot second tree on the right, facing left
|
|
33
|
+
ipx.plotting.tree(
|
|
34
|
+
tree2,
|
|
35
|
+
ax=ax,
|
|
36
|
+
aspect=1,
|
|
37
|
+
edge_color="steelblue",
|
|
38
|
+
layout="horizontal",
|
|
39
|
+
layout_orientation="left",
|
|
40
|
+
layout_start=(11, 0),
|
|
41
|
+
leaf_deep=True,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Add lines connecting corresponding leaves
|
|
45
|
+
matches = [
|
|
46
|
+
(0, 0),
|
|
47
|
+
(1, 4),
|
|
48
|
+
(2, 5),
|
|
49
|
+
(3, 2),
|
|
50
|
+
(4, 1),
|
|
51
|
+
(5, 5),
|
|
52
|
+
]
|
|
53
|
+
for y1, y2 in matches:
|
|
54
|
+
ax.plot(
|
|
55
|
+
[5.2, 6.8], [y1, y2], color="gray", linewidth=2,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# %%
|
|
59
|
+
# ``iplotx`` has a dedicated function for double trees, which virtually the same result with less code:
|
|
60
|
+
|
|
61
|
+
fig, ax = plt.subplots(figsize=(9, 4))
|
|
62
|
+
ipx.doubletree(
|
|
63
|
+
tree1,
|
|
64
|
+
tree2,
|
|
65
|
+
ax=ax,
|
|
66
|
+
kwargs_left=dict(
|
|
67
|
+
leaf_deep=True,
|
|
68
|
+
edge_color="tomato",
|
|
69
|
+
),
|
|
70
|
+
kwargs_right=dict(
|
|
71
|
+
leaf_deep=True,
|
|
72
|
+
edge_color="steelblue",
|
|
73
|
+
),
|
|
74
|
+
gap=2,
|
|
75
|
+
aspect=1,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
# Add lines connecting corresponding leaves
|
|
79
|
+
# NOTE: The layout is horizontally centered now
|
|
80
|
+
matches = [
|
|
81
|
+
(0, 0),
|
|
82
|
+
(1, 4),
|
|
83
|
+
(2, 5),
|
|
84
|
+
(3, 2),
|
|
85
|
+
(4, 1),
|
|
86
|
+
(5, 5),
|
|
87
|
+
]
|
|
88
|
+
for y1, y2 in matches:
|
|
89
|
+
ax.plot(
|
|
90
|
+
[-0.3, 1.3], [y1, y2], color="gray", linewidth=2,
|
|
91
|
+
)
|
|
@@ -11,6 +11,7 @@ from .plotting import (
|
|
|
11
11
|
network,
|
|
12
12
|
graph,
|
|
13
13
|
tree,
|
|
14
|
+
doubletree,
|
|
14
15
|
plot,
|
|
15
16
|
)
|
|
16
17
|
import iplotx.artists as artists
|
|
@@ -20,6 +21,7 @@ import iplotx.style as style
|
|
|
20
21
|
__all__ = [
|
|
21
22
|
"network",
|
|
22
23
|
"tree",
|
|
24
|
+
"doubletree",
|
|
23
25
|
"plot",
|
|
24
26
|
"graph",
|
|
25
27
|
"artists",
|
|
@@ -274,6 +274,12 @@ class EdgeCollection(mpl.collections.PatchCollection):
|
|
|
274
274
|
"""Return mappable for colorbar."""
|
|
275
275
|
return self
|
|
276
276
|
|
|
277
|
+
def shift(self, x: float, y: float) -> None:
|
|
278
|
+
"""Shift the cascade by a certain amount."""
|
|
279
|
+
for path in self._paths:
|
|
280
|
+
path.vertices[:, 0] += x
|
|
281
|
+
path.vertices[:, 1] += y
|
|
282
|
+
|
|
277
283
|
def _get_adjacent_vertices_info(self):
|
|
278
284
|
index = self._vertex_collection.get_index()
|
|
279
285
|
index = pd.Series(
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
Layout functions, currently limited to trees.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import (
|
|
6
|
+
Any,
|
|
7
|
+
Optional,
|
|
8
|
+
)
|
|
6
9
|
from collections.abc import (
|
|
7
10
|
Hashable,
|
|
8
11
|
Callable,
|
|
@@ -99,6 +102,8 @@ def _horizontal_tree_layout_right(
|
|
|
99
102
|
|
|
100
103
|
def _horizontal_tree_layout(
|
|
101
104
|
orientation="right",
|
|
105
|
+
start: tuple[float, float] = (0, 0),
|
|
106
|
+
span: Optional[float] = None,
|
|
102
107
|
**kwargs,
|
|
103
108
|
) -> dict[Hashable, list[float]]:
|
|
104
109
|
"""Horizontal tree layout."""
|
|
@@ -110,11 +115,24 @@ def _horizontal_tree_layout(
|
|
|
110
115
|
if orientation == "left":
|
|
111
116
|
for key in layout:
|
|
112
117
|
layout[key][0] *= -1
|
|
118
|
+
|
|
119
|
+
if span is not None:
|
|
120
|
+
cur_span = len(layout) - 1
|
|
121
|
+
for key in layout:
|
|
122
|
+
layout[key][1] = float(layout[key][1]) * span / cur_span
|
|
123
|
+
|
|
124
|
+
if start != (0, 0):
|
|
125
|
+
for key in layout:
|
|
126
|
+
layout[key][0] += start[0]
|
|
127
|
+
layout[key][1] += start[1]
|
|
128
|
+
|
|
113
129
|
return layout
|
|
114
130
|
|
|
115
131
|
|
|
116
132
|
def _vertical_tree_layout(
|
|
117
133
|
orientation="descending",
|
|
134
|
+
start: tuple[float, float] = (0, 0),
|
|
135
|
+
span: Optional[float] = None,
|
|
118
136
|
**kwargs,
|
|
119
137
|
) -> dict[Hashable, list[float]]:
|
|
120
138
|
"""Vertical tree layout."""
|
|
@@ -125,6 +143,17 @@ def _vertical_tree_layout(
|
|
|
125
143
|
layout[key] = value[::-1]
|
|
126
144
|
# Orient vertically
|
|
127
145
|
layout[key][1] *= sign
|
|
146
|
+
|
|
147
|
+
if span is not None:
|
|
148
|
+
cur_span = len(layout) - 1
|
|
149
|
+
for key in layout:
|
|
150
|
+
layout[key][0] = float(layout[key][0]) * span / cur_span
|
|
151
|
+
|
|
152
|
+
if start != (0, 0):
|
|
153
|
+
for key in layout:
|
|
154
|
+
layout[key][0] += start[0]
|
|
155
|
+
layout[key][1] += start[1]
|
|
156
|
+
|
|
128
157
|
return layout
|
|
129
158
|
|
|
130
159
|
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import (
|
|
2
|
+
Optional,
|
|
3
|
+
Sequence,
|
|
4
|
+
Any,
|
|
5
|
+
)
|
|
2
6
|
from contextlib import nullcontext
|
|
3
7
|
import numpy as np
|
|
4
8
|
import pandas as pd
|
|
@@ -269,8 +273,86 @@ def tree(
|
|
|
269
273
|
return artist
|
|
270
274
|
|
|
271
275
|
|
|
276
|
+
def doubletree(
|
|
277
|
+
tree_left: Optional[TreeType] = None,
|
|
278
|
+
tree_right: Optional[TreeType] = None,
|
|
279
|
+
kwargs_left: Optional[dict[Any]] = None,
|
|
280
|
+
kwargs_right: Optional[dict[Any]] = None,
|
|
281
|
+
gap: float = 0,
|
|
282
|
+
ax: Optional[mpl.axes.Axes] = None,
|
|
283
|
+
title: Optional[str] = None,
|
|
284
|
+
aspect: Optional[str | float] = None,
|
|
285
|
+
margins: float | tuple[float, float] = 0,
|
|
286
|
+
strip_axes: bool = True,
|
|
287
|
+
figsize: Optional[tuple[float, float]] = None,
|
|
288
|
+
) -> tuple[TreeArtist, TreeArtist]:
|
|
289
|
+
"""Visualize two trees facing each other.
|
|
290
|
+
|
|
291
|
+
Parameters:
|
|
292
|
+
tree_left: The tree to plot on the left side.
|
|
293
|
+
tree_right: The tree to plot on the right side.
|
|
294
|
+
kwargs_left: Additional keyword arguments passed to the left tree plotting function.
|
|
295
|
+
kwargs_right: Additional keyword arguments passed to the right tree plotting function.
|
|
296
|
+
ax: The axis to plot on. If None, a new figure and axis will be created. Defaults to
|
|
297
|
+
None.
|
|
298
|
+
title: If not None, set the axes title to this value.
|
|
299
|
+
aspect: If not None, set the aspect ratio of the axis to this value. The most common
|
|
300
|
+
value is 1.0, which proportionates x- and y-axes.
|
|
301
|
+
margins: How much margin to leave around the plot. A higher value (e.g. 0.1) can be
|
|
302
|
+
used as a quick fix when some vertex shapes reach beyond the plot edge. This is
|
|
303
|
+
a fraction of the data limits, so 0.1 means 10% of the data limits will be left
|
|
304
|
+
as margin.
|
|
305
|
+
strip_axes: If True, remove axis spines and ticks.
|
|
306
|
+
figsize: If ax is None, a new matplotlib Figure is created. This argument specifies
|
|
307
|
+
the (width, height) dimension of the figure in inches. If ax is not None, this
|
|
308
|
+
argument is ignored. If None, the default matplotlib figure size is used.
|
|
309
|
+
Returns:
|
|
310
|
+
A tuple with the left and right TreeArtist objects.
|
|
311
|
+
"""
|
|
312
|
+
artist1 = tree(
|
|
313
|
+
tree_left,
|
|
314
|
+
layout="horizontal",
|
|
315
|
+
layout_orientation="right",
|
|
316
|
+
ax=ax,
|
|
317
|
+
strip_axes=False,
|
|
318
|
+
figsize=figsize,
|
|
319
|
+
**kwargs_left or {},
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
ax = artist1.axes
|
|
323
|
+
|
|
324
|
+
if kwargs_right is None:
|
|
325
|
+
kwargs_right = {}
|
|
326
|
+
|
|
327
|
+
had_layout_start = "layout_start" in kwargs_right
|
|
328
|
+
|
|
329
|
+
artist2 = tree(
|
|
330
|
+
tree_right,
|
|
331
|
+
layout="horizontal",
|
|
332
|
+
layout_orientation="left",
|
|
333
|
+
ax=ax,
|
|
334
|
+
title=title,
|
|
335
|
+
aspect=aspect,
|
|
336
|
+
strip_axes=False,
|
|
337
|
+
margins=margins,
|
|
338
|
+
**kwargs_right,
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
if not had_layout_start:
|
|
342
|
+
x2min = artist2.get_layout().values[:, 0].min()
|
|
343
|
+
x1max = artist1.get_layout().values[:, 0].max()
|
|
344
|
+
xshift = x1max - x2min + gap
|
|
345
|
+
|
|
346
|
+
artist2.shift(0.5 * xshift, 0)
|
|
347
|
+
artist1.shift(-0.5 * xshift, 0)
|
|
348
|
+
|
|
349
|
+
_postprocess_axes(ax, [artist1, artist2], strip=strip_axes, ignore_previous=True)
|
|
350
|
+
|
|
351
|
+
return (artist1, artist2)
|
|
352
|
+
|
|
353
|
+
|
|
272
354
|
# INTERNAL ROUTINES
|
|
273
|
-
def _postprocess_axes(ax, artists, strip=True, had_data=None):
|
|
355
|
+
def _postprocess_axes(ax, artists, strip=True, had_data=None, ignore_previous=False):
|
|
274
356
|
"""Postprocess axis after plotting."""
|
|
275
357
|
|
|
276
358
|
if strip:
|
|
@@ -309,7 +391,11 @@ def _postprocess_axes(ax, artists, strip=True, had_data=None):
|
|
|
309
391
|
for art in artists:
|
|
310
392
|
bboxes.append(art.get_datalim(ax.transData))
|
|
311
393
|
bbox = mpl.transforms.Bbox.union(bboxes)
|
|
312
|
-
|
|
394
|
+
|
|
395
|
+
if not ignore_previous:
|
|
396
|
+
ax.update_datalim(bbox)
|
|
397
|
+
else:
|
|
398
|
+
ax.dataLim.update_from_data_xy(bbox.corners(), ignore=True)
|
|
313
399
|
|
|
314
400
|
# Autoscale for x/y axis limits
|
|
315
401
|
ax.autoscale_view()
|
|
@@ -219,6 +219,31 @@ class TreeArtist(mpl.artist.Artist):
|
|
|
219
219
|
else:
|
|
220
220
|
raise ValueError(f"Unknown layout kind: {kind}. Use 'vertex' or 'edge'.")
|
|
221
221
|
|
|
222
|
+
def shift(self, x: float, y: float) -> None:
|
|
223
|
+
"""Shift layout coordinates for all tree elements.
|
|
224
|
+
|
|
225
|
+
Paramerers:
|
|
226
|
+
x: The shift in x direction.
|
|
227
|
+
y: The shift in y direction.
|
|
228
|
+
"""
|
|
229
|
+
layout_columns = [f"_ipx_layout_{i}" for i in range(self._ipx_internal_data["ndim"])]
|
|
230
|
+
self._ipx_internal_data["vertex_df"][layout_columns[0]] += x
|
|
231
|
+
self._ipx_internal_data["vertex_df"][layout_columns[1]] += y
|
|
232
|
+
|
|
233
|
+
self.get_vertices()._layout.values[:, 0] += x
|
|
234
|
+
self.get_vertices()._layout.values[:, 1] += y
|
|
235
|
+
self.get_vertices()._update_offsets_from_layout()
|
|
236
|
+
|
|
237
|
+
self.get_edges().shift(x, y)
|
|
238
|
+
|
|
239
|
+
if hasattr(self, "_leaf_vertices"):
|
|
240
|
+
self.get_leaf_vertices()._layout.values[:, 0] += x
|
|
241
|
+
self.get_leaf_vertices()._layout.values[:, 1] += y
|
|
242
|
+
self.get_leaf_vertices()._update_offsets_from_layout()
|
|
243
|
+
|
|
244
|
+
if hasattr(self, "_cascades"):
|
|
245
|
+
self._cascades.shift(x, y)
|
|
246
|
+
|
|
222
247
|
def get_datalim(self, transData, pad=0.15):
|
|
223
248
|
"""Get limits on x/y axes based on the graph layout data.
|
|
224
249
|
|
|
@@ -158,6 +158,12 @@ class CascadeCollection(mpl.collections.PatchCollection):
|
|
|
158
158
|
zorder=zorder,
|
|
159
159
|
)
|
|
160
160
|
|
|
161
|
+
def shift(self, x: float, y: float) -> None:
|
|
162
|
+
"""Shift the cascade by a certain amount."""
|
|
163
|
+
for path in self._paths:
|
|
164
|
+
path.vertices[:, 0] += x
|
|
165
|
+
path.vertices[:, 1] += y
|
|
166
|
+
|
|
161
167
|
def get_maxdepth(self) -> float:
|
|
162
168
|
"""Get the maxdepth of the cascades.
|
|
163
169
|
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
import matplotlib as mpl
|
|
3
|
+
|
|
4
|
+
mpl.use("agg")
|
|
5
|
+
import iplotx as ipx
|
|
6
|
+
from utils import image_comparison
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.fixture
|
|
10
|
+
def tree():
|
|
11
|
+
tree = {
|
|
12
|
+
"children": [
|
|
13
|
+
{
|
|
14
|
+
"children": [
|
|
15
|
+
{},
|
|
16
|
+
{},
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"children": [
|
|
21
|
+
{
|
|
22
|
+
"children": [
|
|
23
|
+
{"branch_length": 1.5},
|
|
24
|
+
{},
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"children": [
|
|
29
|
+
{},
|
|
30
|
+
{},
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
}
|
|
37
|
+
tree = ipx.ingest.providers.tree.simple.SimpleTree.from_dict(tree)
|
|
38
|
+
return tree
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@image_comparison(baseline_images=["tree_nogap"], remove_text=True)
|
|
42
|
+
def test_nogap(tree):
|
|
43
|
+
ipx.doubletree(
|
|
44
|
+
tree,
|
|
45
|
+
tree,
|
|
46
|
+
kwargs_right=dict(
|
|
47
|
+
edge_color="steelblue",
|
|
48
|
+
),
|
|
49
|
+
gap=0,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@image_comparison(baseline_images=["tree_gap"], remove_text=True)
|
|
54
|
+
def test_gap(tree):
|
|
55
|
+
ipx.doubletree(
|
|
56
|
+
tree,
|
|
57
|
+
tree,
|
|
58
|
+
kwargs_left=dict(
|
|
59
|
+
leaf_deep=True,
|
|
60
|
+
),
|
|
61
|
+
kwargs_right=dict(
|
|
62
|
+
edge_color="steelblue",
|
|
63
|
+
leaf_deep=True,
|
|
64
|
+
),
|
|
65
|
+
gap=1.0,
|
|
66
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/breast_cancer_string_interactions_short.tsv
RENAMED
|
File without changes
|
{iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/breast_cancer_string_network_coordinates.tsv
RENAMED
|
File without changes
|
{iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/cell_cycle_arrest_string_interactions_short.tsv
RENAMED
|
File without changes
|
{iplotx-1.0.1 → iplotx-1.2.0}/gallery/biology/data/cell_cycle_arrest_string_network_coordinates.tsv
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|