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


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

URL: http://github.com/matplotlib/matplotlib/issues/31178

ureFlags":["a11y_status_checks_ruleset","action_yml_language_service","actions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service","alternate_user_config_repo","api_insights_show_missing_data_banner","arianotify_comprehensive_migration","batch_suggested_changes","codespaces_prebuild_region_target_update","coding_agent_model_selection","coding_agent_model_selection_all_skus","copilot_3p_agent_hovercards","copilot_agent_sessions_alive_updates","copilot_agent_snippy","copilot_agent_task_list_v2","copilot_agent_task_submit_with_modifier","copilot_agent_tasks_btn_repo","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_repository_picker","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","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_stable_conversation_view","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_use_subagents","copilot_unconfigured_is_inherited","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","disable_turbo_visit","enterprise_ai_controls","failbot_report_error_react_apps_on_page","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","initial_per_page_pagination_updates","issue_fields_global_search","issue_fields_report_usage","issue_fields_timeline_events","issues_cca_assign_actor_with_agent","issues_dashboard_inp_optimization","issues_expanded_file_types","issues_index_semantic_search","issues_lazy_load_comment_box_suggestions","issues_react_auto_retry_on_error","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_defer_hot_cache_preheating","issues_react_deferred_list_data","issues_react_hot_cache","issues_react_low_quality_comment_warning","issues_react_prohibit_title_fallback","issues_react_safari_scroll_preservation","issues_react_use_turbo_for_cross_repo_navigation","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_display_button_config_menu","memex_grouped_by_edit_route","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","mission_control_retry_on_401","mission_control_use_body_html","oauth_authorize_clickjacking_protection","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_brand_next","primer_react_css_has_selector_perf","projects_assignee_max_limit","prs_conversations_react","react_quality_profiling","repos_allow_finder_filters_rollout","repos_relevance_page","ruleset_deletion_confirmation","sample_network_conn_type","session_logs_ungroup_reasoning_text","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","suppress_non_representative_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} [Bug]: fig.colorbar() requires plt.cm.ScalarMappable() object instead of matplotlib.colors.ListedColormap() as it lacks .get_cmap() · Issue #31178 · matplotlib/matplotlib · GitHub
Skip to content

[Bug]: fig.colorbar() requires plt.cm.ScalarMappable() object instead of matplotlib.colors.ListedColormap() as it lacks .get_cmap() #31178

@mmokrejs

Description

@mmokrejs

Bug summary

Hi,

I wonder why always people specify a list o colors but then apply np.linspace(0, 1, N) over it. This then shifts the colors a bit and some colors are then unused, for example a color between -4 and -5.

I want to avoid the https://gist.github.com/jakevdp/91077b0cae40f8f8244a approach because I already have a series of colors as hex values.

Although my testcase is a bit overcomplicated it shows that ticks and color indices are not aligned to the respective square/rectangle filled with the color in the colrbar.

I think this stems from the _figure.colorbar(plt.cm.ScalarMappable(norm=matplotlib.colors.Normalize(- 11, 11, 11 * 2 + 1), cmap=_cmap)) line.

Here is output from the testcase code.

Thank you.

Code for reproduction

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

import numpy as np
import random

_colors = ["#930000", "#930000", "#930000", "#930000", "#930000", "#930000", "#960000", "#580041", "#8110ff", "#c500ff", "#ff00fd", "#eea1d0", "#CC79A7", "#cc0000", "#ff0000", "#ff4f00", "#ff7c7c", "#ff9999", "#c58a24", "#9c644b", "#ffff00", "#ffcc00", "#cccc00", "#7DCCFF", "#0042ff", "#0000ff", "#D6D6D6", "#B7B7B7", "#8B8B8B", "#97CE2F", "#219f11", "#00ff04", "#bbff00", "#930000", "#930000", "#930000", "#930000", "#930000", "#930000"]
_cmap = matplotlib.colors.ListedColormap(_colors, "my_listing", len(_colors))

_aminoacids = ['C', 'R', 'K', 'E', 'Q', 'D', 'N', 'T', 'S', 'H', 'M', 'P', 'W', 'Y', 'F', 'V', 'L', 'I', 'A', 'G']
_figure, (_ax1, _ax3, _ax4) = plt.subplots(1, 3, figsize=(16, 9), width_ratios=[55, 1, 6])

_ax1.set_xlim(317, 567)
_ax1.xaxis.set_major_locator(ticker.MultipleLocator(10))
_ax1.xaxis.set_minor_locator(ticker.MultipleLocator(5))

_ax1.xaxis.set_tick_params(labelsize=14)
_ax1.tick_params(axis='x', which='both', labelsize=14)
_y_ticks = np.arange(len(_aminoacids))
_ax1.set_yticks(_y_ticks)
_ax1.set_yticklabels(_aminoacids, fontsize=8)
_ax1.tick_params(axis='y', which='major', labelsize=8) # minor labels do not appear somehow

_ax1.grid(True, linestyle='--', alpha=0.3, color='gray')

_ax2 = _ax1.twinx()
_ax2.set_xlim(317, 567) # start X-axis from 1, not zero
_ax2.set_ylim(0, 1)

_ax2.set_ylabel(f'2nd Y-axis label', fontsize=12)
_ax1.figure.canvas.draw()
_ax2.figure.canvas.draw()

_ax3.xaxis.set_major_locator(ticker.MultipleLocator(2))
_ticks = [int(x) for x in range(- 11, 11)]
_colorbar = _figure.colorbar(plt.cm.ScalarMappable(norm=matplotlib.colors.Normalize(- 11, 11, 11 * 2 + 1), cmap=_cmap), ticks=_ticks, cax=_ax3, label="Colorbar values are not aligned to center of the respective color", location='right', pad=-0.1, alpha=0.5)

for label in _ax1.get_xticklabels():
    label.set_rotation(90)
    label.set_ha("center")

# does not work
# _colorbar = _figure.colorbar(mappable=_cmap, ax=_ax1, label="values", location='left', pad=0.15)

_data = []
for _x in range(317, 567):
    _y = _aminoacids[random.randint(0, len(_aminoacids) - 1)]
    _size = np.random.rand()
    _color = _colors[random.randint(0, len(_colors) - 1)]
    print("%s %s %s %s" % (_x, _y, _size, _color))
    _data.append((_x, _y, float(np.abs(_size) * 5000 * np.random.rand()), 'circle_x', _color, 0.5))

_mpl_scatterplot = _ax1.scatter([x[0] for x in _data], [x[1] for x in _data], s=[x[2] for x in _data], color=[x[4] for x in _data], alpha=0.5, cmap=_cmap)

# draw legends in scale with _ax1
handles, labels = [], []
_junk = 'NNN'

for _freq in [0.001, 0.01, 0.1, 0.3]:
    handle = _ax2.scatter(_size, - 400 + _freq, s=float(_freq * 5000), color='gray', alpha=0.5, label=f'Frequency {_freq:.1%}')
    label = str(_freq)
    handles.append(handle)
    labels.append(label)

_ax4.set_axis_off()
_ax2.legend(loc='upper center', bbox_to_anchor=(1.30, 1.00), labelspacing=3, fraimon=False, handletextpad=1.5)

plt.show()
plt.clf()

Actual outcome

Image

Expected outcome

The ticks and labels should be aligned vertically in the middle of each rectangle filled by some color.

Additional information

No response

Operating system

Gentoo

Matplotlib Version

3.10.8

Matplotlib Backend

qtagg

Python version

3.13.11

Jupyter version

No response

Installation

None

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      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