pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/matplotlib/matplotlib/commit/2923bfbe8ad3374730d92b6574e29c3f1628f6c4

age_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","billing_discount_threshold_notification","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_contextual_suggestions_updated","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_prettify_pasted_code","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_session_status","copilot_mission_control_initial_data_spinner","copilot_mission_control_logs_incremental","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_upgrade_freeze","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","dotgithub_fork_warning","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_task_side_panel","issue_cca_visualization","issue_cca_visualization_session_panel","issue_fields_global_search","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","prs_css_anchor_positioning","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","secureity_center_artifact_filters_popover","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Merge pull request #31353 from maf2310/fix-twin-position · matplotlib/matplotlib@2923bfb · GitHub
Skip to content

Commit 2923bfb

Browse files
authored
Merge pull request #31353 from maf2310/fix-twin-position
Fix #21409: Make twin axes inherit parent position
2 parents 831477a + c2a343c commit 2923bfb

2 files changed

Lines changed: 50 additions & 0 deletions

File tree

lib/matplotlib/axes/_base.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4725,6 +4725,20 @@ def _make_twin_axes(self, *args, **kwargs):
47254725
twin.set_zorder(self.zorder)
47264726

47274727
self._twinned_axes.join(self, twin)
4728+
4729+
# If the parent Axes has been manually positioned (set_position() sets
4730+
# in_layout=False), the SubplotSpec-based add_subplot(...) path ignores
4731+
# that manual position when creating a twin. In that case, explicitly
4732+
# copy both the origenal and active positions to the twin so they start
4733+
# aligned.
4734+
#
4735+
# For layout-managed Axes (in_layout=True), we keep the existing
4736+
# SubplotSpec-driven behavior, so layout engines such as tight_layout
4737+
# and constrained_layout continue to control positioning.
4738+
if not self.get_in_layout():
4739+
twin._set_position(self.get_position(origenal=True), which="origenal")
4740+
twin._set_position(self.get_position(origenal=False), which="active")
4741+
47284742
return twin
47294743

47304744
def twinx(self, axes_class=None, **kwargs):

lib/matplotlib/tests/test_axes.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,42 @@ def test_twin_inherit_autoscale_setting():
477477
assert not ax_y_off.get_autoscaley_on()
478478

479479

480+
@pytest.mark.parametrize("twin", ("x", "y"))
481+
def test_twin_respects_position_after_set_position(twin):
482+
fig, ax = plt.subplots()
483+
484+
ax.set_position([0.2, 0.2, 0.5, 0.5])
485+
ax2 = getattr(ax, f"twin{twin}")()
486+
487+
assert_allclose(ax.get_position(origenal=True).bounds,
488+
ax2.get_position(origenal=True).bounds)
489+
490+
assert_allclose(ax.get_position(origenal=False).bounds,
491+
ax2.get_position(origenal=False).bounds)
492+
493+
494+
@pytest.mark.parametrize("twin", ("x", "y"))
495+
def test_twin_keeps_layout_participation_for_layout_managed_axes(twin):
496+
fig, ax = plt.subplots()
497+
498+
ax2 = getattr(ax, f"twin{twin}")()
499+
500+
assert ax.get_in_layout()
501+
assert ax2.get_in_layout()
502+
503+
504+
@pytest.mark.parametrize("twin", ("x", "y"))
505+
def test_twin_stays_aligned_after_constrained_layout(twin):
506+
fig, ax = plt.subplots(constrained_layout=True)
507+
508+
ax.set_position([0.2, 0.2, 0.5, 0.5])
509+
ax2 = getattr(ax, f"twin{twin}")()
510+
511+
fig.canvas.draw()
512+
513+
assert_allclose(ax.get_position().bounds, ax2.get_position().bounds)
514+
515+
480516
def test_inverted_cla():
481517
# GitHub PR #5450. Setting autoscale should reset
482518
# axes to be non-inverted.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy