René's URL Explorer Experiment


Title: Creation of the Norm Protocol by trygvrad · Pull Request #30149 · matplotlib/matplotlib · GitHub

Open Graph Title: Creation of the Norm Protocol by trygvrad · Pull Request #30149 · matplotlib/matplotlib

X Title: Creation of the Norm Protocol by trygvrad · Pull Request #30149 · matplotlib/matplotlib

Description: This PR is a response to a discussion in the past weeks weekly developer meeting regarding the creation of a Norm protocol before the introduction of MultiNorm #29876 (comment) Prior to this PR there are no Protocols in matplotlib. This implementation uses @runtime_checkable so that Colorizer.set_norm() can check _api.check_isinstance((colors.Norm, str, None), norm=norm) Note that the error message if the class one attempts to use is missing a member, is just the standard wrong-type message, and does not tell you what member of the protocol is missing. @timhoffm @tacaswell @ksunden @story645 The implementation looks like this: @runtime_checkable class Norm(Protocol): @property def vmin(self): """Lower limit of the input data interval; maps to 0.""" ... @property def vmax(self): """Upper limit of the input data interval; maps to 1.""" ... @property def clip(self): """ Determines the behavior for mapping values outside the range ``[vmin, vmax]``. See the *clip* parameter in `.Normalize`. """ ... def _changed(self): """ Call this whenever the norm is changed to notify all the callback listeners to the 'changed' signal. """ ... def __call__(self, value, clip=None): """ Normalize the data and return the normalized data. Parameters ---------- value Data to normalize. clip : bool, optional See the description of the parameter *clip* in `.Normalize`. If ``None``, defaults to ``self.clip`` (which defaults to ``False``). Notes ----- If not already initialized, ``self.vmin`` and ``self.vmax`` are initialized using ``self.autoscale_None(value)``. """ ... def inverse(self, value): """ Maps the normalized value (i.e., index in the colormap) back to image data value. Parameters ---------- value Normalized value. """ ... def autoscale(self, A): """Set *vmin*, *vmax* to min, max of *A*.""" ... def autoscale_None(self, A): """If *vmin* or *vmax* are not set, use the min/max of *A* to set them.""" ... def scaled(self): """Return whether *vmin* and *vmax* are both set.""" ... and some of the docstrings will need to be updated to also allow for MultiNorm, but this can happen in the next PR. This requires a lot more than the bare minimum. I tested, and I can do a plt.imshow() with just __call__ and autoscale_None, but I get the feeling that it is desirable to lock it down more.

Open Graph Description: This PR is a response to a discussion in the past weeks weekly developer meeting regarding the creation of a Norm protocol before the introduction of MultiNorm #29876 (comment) Prior to this PR the...

X Description: This PR is a response to a discussion in the past weeks weekly developer meeting regarding the creation of a Norm protocol before the introduction of MultiNorm #29876 (comment) Prior to this PR the...

Opengraph URL: https://github.com/matplotlib/matplotlib/pull/30149

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:917d3b7c-e62e-09c8-73f5-f8b630cc31c7
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idB996:156C3A:1DE4CE:281ED4:6A51872F
html-safe-nonce1fe65f85e8e4317241797e2db97b3b8a1e64f3f308435d2b82c8801886a8580b
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCOTk2OjE1NkMzQToxREU0Q0U6MjgxRUQ0OjZBNTE4NzJGIiwidmlzaXRvcl9pZCI6IjczMzQxNzk2NzA3NTYyNjM3MjciLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmac9540c04510fb59542f552a9e641ebe2ce54b0df67286f6a7f52f66b99094e7b3
hovercard-subject-tagpull_request:2573699383
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/matplotlib/matplotlib/pull/30149/files
twitter:imagehttps://avatars.githubusercontent.com/u/2361452?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/2361452?s=400&v=4
og:image:altThis PR is a response to a discussion in the past weeks weekly developer meeting regarding the creation of a Norm protocol before the introduction of MultiNorm #29876 (comment) Prior to this PR the...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Noneb9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git
octolytics-dimension-user_id215947
octolytics-dimension-user_loginmatplotlib
octolytics-dimension-repository_id1385122
octolytics-dimension-repository_nwomatplotlib/matplotlib
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id1385122
octolytics-dimension-repository_network_root_nwomatplotlib/matplotlib
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releasecb77a7b8b06cd86c243be33fd8e7922d70a9d243
ui-targetcanary-1
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/matplotlib/matplotlib/pull/30149/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmatplotlib%2Fmatplotlib%2Fpull%2F30149%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmatplotlib%2Fmatplotlib%2Fpull%2F30149%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=matplotlib%2Fmatplotlib
Reloadhttps://github.com/matplotlib/matplotlib/pull/30149/files
Reloadhttps://github.com/matplotlib/matplotlib/pull/30149/files
Reloadhttps://github.com/matplotlib/matplotlib/pull/30149/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/30149/files
matplotlib https://github.com/matplotlib
matplotlibhttps://github.com/matplotlib/matplotlib
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/30149/files
Notifications https://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib
Fork 8.4k https://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib
Star 23k https://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib
Code https://github.com/matplotlib/matplotlib
Issues 1.1k https://github.com/matplotlib/matplotlib/issues
Pull requests 409 https://github.com/matplotlib/matplotlib/pulls
Actions https://github.com/matplotlib/matplotlib/actions
Projects https://github.com/matplotlib/matplotlib/projects
Wiki https://github.com/matplotlib/matplotlib/wiki
Security and quality 0 https://github.com/matplotlib/matplotlib/security
Insights https://github.com/matplotlib/matplotlib/pulse
Code https://github.com/matplotlib/matplotlib
Issues https://github.com/matplotlib/matplotlib/issues
Pull requests https://github.com/matplotlib/matplotlib/pulls
Actions https://github.com/matplotlib/matplotlib/actions
Projects https://github.com/matplotlib/matplotlib/projects
Wiki https://github.com/matplotlib/matplotlib/wiki
Security and quality https://github.com/matplotlib/matplotlib/security
Insights https://github.com/matplotlib/matplotlib/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fmatplotlib%2Fmatplotlib%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib%2Fissues%2Fnew%2Fchoose
trygvradhttps://github.com/trygvrad
matplotlib:mainhttps://github.com/matplotlib/matplotlib/tree/main
trygvrad:norm_protocolhttps://github.com/trygvrad/matplotlib/tree/norm_protocol
Conversation 12 https://github.com/matplotlib/matplotlib/pull/30149
Commits 2 https://github.com/matplotlib/matplotlib/pull/30149/commits
Checks 37 https://github.com/matplotlib/matplotlib/pull/30149/checks
Files changed https://github.com/matplotlib/matplotlib/pull/30149/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/30149/files
Creation of the Norm Protocol https://github.com/matplotlib/matplotlib/pull/30149/files#top
Show all changes 2 commits https://github.com/matplotlib/matplotlib/pull/30149/files
f5351ad Creation of the Norm Protocol trygvrad Jun 6, 2025 https://github.com/matplotlib/matplotlib/pull/30149/commits/f5351adc066a7c8be485fd862535878e94f5aad1
b0c8093 updates based on feedback on PR trygvrad Jun 7, 2025 https://github.com/matplotlib/matplotlib/pull/30149/commits/b0c80932851d821f752e3eac6e649388e9a45b20
Clear filters https://github.com/matplotlib/matplotlib/pull/30149/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/30149/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/30149/files
colorizer.py https://github.com/matplotlib/matplotlib/pull/30149/files#diff-7f9b49e495522677550b9a89ba4d6f12233fda414b5e76160aa776566ee83c68
colorizer.pyi https://github.com/matplotlib/matplotlib/pull/30149/files#diff-b4f0391eb8f7006bd2c94252dd007cc5f5133f5b2a4db045c1e69759174cad57
colors.py https://github.com/matplotlib/matplotlib/pull/30149/files#diff-3c08c967cdebbe0574ff68dceb5faba6cbb89ca53492e0fc3feeabc37cea37b6
colors.pyi https://github.com/matplotlib/matplotlib/pull/30149/files#diff-95ae32591ae8f3ed866b6a9e3c8edcee7a3ff32fbe4a3750607ebb4072cc90fa
test_norm_protocol.png https://github.com/matplotlib/matplotlib/pull/30149/files#diff-affea6f26ee941c6ef13ca79e67fe2b3316bee526068c9b7fc5268a3bcd34355
test_colors.py https://github.com/matplotlib/matplotlib/pull/30149/files#diff-0b4e2edcbe7e1f81d3c7e56ac45d89a3aa1c8481d9204b2c0f497b3261006a87
lib/matplotlib/colorizer.pyhttps://github.com/matplotlib/matplotlib/pull/30149/files#diff-7f9b49e495522677550b9a89ba4d6f12233fda414b5e76160aa776566ee83c68
View file https://github.com/trygvrad/matplotlib/blob/b0c80932851d821f752e3eac6e649388e9a45b20/lib/matplotlib/colorizer.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/matplotlib/matplotlib/pull/30149/{{ revealButtonHref }}
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-7f9b49e495522677550b9a89ba4d6f12233fda414b5e76160aa776566ee83c68
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-7f9b49e495522677550b9a89ba4d6f12233fda414b5e76160aa776566ee83c68
lib/matplotlib/colorizer.pyihttps://github.com/matplotlib/matplotlib/pull/30149/files#diff-b4f0391eb8f7006bd2c94252dd007cc5f5133f5b2a4db045c1e69759174cad57
View file https://github.com/trygvrad/matplotlib/blob/b0c80932851d821f752e3eac6e649388e9a45b20/lib/matplotlib/colorizer.pyi
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/matplotlib/matplotlib/pull/30149/{{ revealButtonHref }}
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-b4f0391eb8f7006bd2c94252dd007cc5f5133f5b2a4db045c1e69759174cad57
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-b4f0391eb8f7006bd2c94252dd007cc5f5133f5b2a4db045c1e69759174cad57
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-b4f0391eb8f7006bd2c94252dd007cc5f5133f5b2a4db045c1e69759174cad57
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-b4f0391eb8f7006bd2c94252dd007cc5f5133f5b2a4db045c1e69759174cad57
lib/matplotlib/colors.pyhttps://github.com/matplotlib/matplotlib/pull/30149/files#diff-3c08c967cdebbe0574ff68dceb5faba6cbb89ca53492e0fc3feeabc37cea37b6
View file https://github.com/trygvrad/matplotlib/blob/b0c80932851d821f752e3eac6e649388e9a45b20/lib/matplotlib/colors.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/matplotlib/matplotlib/pull/30149/{{ revealButtonHref }}
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-3c08c967cdebbe0574ff68dceb5faba6cbb89ca53492e0fc3feeabc37cea37b6
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-3c08c967cdebbe0574ff68dceb5faba6cbb89ca53492e0fc3feeabc37cea37b6
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-3c08c967cdebbe0574ff68dceb5faba6cbb89ca53492e0fc3feeabc37cea37b6
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-3c08c967cdebbe0574ff68dceb5faba6cbb89ca53492e0fc3feeabc37cea37b6
lib/matplotlib/colors.pyihttps://github.com/matplotlib/matplotlib/pull/30149/files#diff-95ae32591ae8f3ed866b6a9e3c8edcee7a3ff32fbe4a3750607ebb4072cc90fa
View file https://github.com/trygvrad/matplotlib/blob/b0c80932851d821f752e3eac6e649388e9a45b20/lib/matplotlib/colors.pyi
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/matplotlib/matplotlib/pull/30149/{{ revealButtonHref }}
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-95ae32591ae8f3ed866b6a9e3c8edcee7a3ff32fbe4a3750607ebb4072cc90fa
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-95ae32591ae8f3ed866b6a9e3c8edcee7a3ff32fbe4a3750607ebb4072cc90fa
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-95ae32591ae8f3ed866b6a9e3c8edcee7a3ff32fbe4a3750607ebb4072cc90fa
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/30149/files
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-95ae32591ae8f3ed866b6a9e3c8edcee7a3ff32fbe4a3750607ebb4072cc90fa
lib/matplotlib/tests/baseline_images/test_colors/test_norm_protocol.pnghttps://github.com/matplotlib/matplotlib/pull/30149/files#diff-affea6f26ee941c6ef13ca79e67fe2b3316bee526068c9b7fc5268a3bcd34355
View file https://github.com/trygvrad/matplotlib/blob/b0c80932851d821f752e3eac6e649388e9a45b20/lib/matplotlib/tests/baseline_images/test_colors/test_norm_protocol.png
Open in desktop https://desktop.github.com
Reload?https://github.com/matplotlib/matplotlib/pull/30149/files
lib/matplotlib/tests/test_colors.pyhttps://github.com/matplotlib/matplotlib/pull/30149/files#diff-0b4e2edcbe7e1f81d3c7e56ac45d89a3aa1c8481d9204b2c0f497b3261006a87
View file https://github.com/trygvrad/matplotlib/blob/b0c80932851d821f752e3eac6e649388e9a45b20/lib/matplotlib/tests/test_colors.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/matplotlib/matplotlib/pull/30149/{{ revealButtonHref }}
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-0b4e2edcbe7e1f81d3c7e56ac45d89a3aa1c8481d9204b2c0f497b3261006a87
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-0b4e2edcbe7e1f81d3c7e56ac45d89a3aa1c8481d9204b2c0f497b3261006a87
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-0b4e2edcbe7e1f81d3c7e56ac45d89a3aa1c8481d9204b2c0f497b3261006a87
https://github.com/matplotlib/matplotlib/pull/30149/files#diff-0b4e2edcbe7e1f81d3c7e56ac45d89a3aa1c8481d9204b2c0f497b3261006a87
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
https://github.com/matplotlib/matplotlib/pull/30149/checks?check_run_id=43672214727
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/30149/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.