René's URL Explorer Experiment


Title: BUG: Fix IndexLocator.tick_values returning values greater than vmax by saakshigupta2002 · Pull Request #31091 · matplotlib/matplotlib · GitHub

Open Graph Title: BUG: Fix IndexLocator.tick_values returning values greater than vmax by saakshigupta2002 · Pull Request #31091 · matplotlib/matplotlib

X Title: BUG: Fix IndexLocator.tick_values returning values greater than vmax by saakshigupta2002 · Pull Request #31091 · matplotlib/matplotlib

Description: Pull Request: Fix IndexLocator.tick_values returning values greater than vmax Summary This PR fixes a bug in IndexLocator.tick_values() where tick values could exceed the specified vmax parameter. This issue manifested most notably when using colorbars with discrete colormaps and NoNorm normalization, where cbar.get_ticks() would return an incorrect array containing values outside the valid range. The Problem When creating a colorbar using a ScalarMappable with NoNorm normalization and a discrete colormap (e.g., viridis with a fixed number of colors), the ticks returned by colorbar.get_ticks() did not align with the visually displayed tick positions. Specifically, calling cbar.set_ticks(cbar.get_ticks()) would unexpectedly change the ticks because get_ticks() returned values outside the valid range. Example reproduction: import matplotlib.pyplot as plt from matplotlib import cm, colors data = [1, 2, 3, 4, 5] fig, ax = plt.subplots() cbar = fig.colorbar( cm.ScalarMappable(norm=colors.NoNorm(), cmap=plt.get_cmap("viridis", len(data))), ax=ax ) print(cbar.get_ticks()) # Actual (before fix): [0. 1. 2. 3. 4. 5.] # Expected (after fix): [0. 1. 2. 3. 4.] Root Cause The issue was in IndexLocator.tick_values() in lib/matplotlib/ticker.py: def tick_values(self, vmin, vmax): return self.raise_if_exceeds( np.arange(vmin + self.offset, vmax + 1, self._base)) The vmax + 1 in the np.arange call was intended to make the interval inclusive of vmax (since np.arange produces a semi-open interval [start, stop)). However, this overshot the target — combined with certain offset values, it could generate tick positions that exceed vmax. For instance, with offset=0.5 and vmax=4, the array [0.5, 1.5, 2.5, 3.5, 4.5] would be generated, where 4.5 > vmax. The Fix Replaced vmax + 1 with vmax + 1e-12 as the stop value for np.arange. This provides a minimal epsilon beyond vmax that ensures vmax itself is included in the closed interval [vmin, vmax], without overshooting to produce values beyond vmax: def tick_values(self, vmin, vmax): # We want tick values in the closed interval [vmin, vmax]. # Since np.arange(start, stop) returns values in the semi-open interval # [start, stop), we add a minimal offset so that stop = vmax + eps tick_values = np.arange(vmin + self.offset, vmax + 1e-12, self._base) return self.raise_if_exceeds(tick_values) This directly generates the correct number of ticks without any post-filtering, which is both cleaner and more efficient. Changes Modified Files lib/matplotlib/ticker.py Modified IndexLocator.tick_values() to use vmax + 1e-12 instead of vmax + 1 as the np.arange stop value, ensuring tick values stay within the [vmin, vmax] closed interval lib/matplotlib/tests/test_ticker.py Added test_tick_values_not_exceeding_vmax() test method to TestIndexLocator class Tests verify correct tick generation for: Integer offset (offset=0) Fractional offset (offset=0.5) Step size greater than 1 (base=2) Test Plan Added unit tests for the fix in test_ticker.py Run the full test suite: pytest lib/matplotlib/tests/test_ticker.py -v Verify the reproduction case from the issue is fixed Check that existing colorbar functionality is not affected New Test Cases def test_tick_values_not_exceeding_vmax(self): """ Test that tick_values does not return values greater than vmax. """ # Test case where offset=0 could cause vmax to be included incorrectly index = mticker.IndexLocator(base=1, offset=0) assert_array_equal(index.tick_values(0, 4), [0, 1, 2, 3, 4]) # Test case with fractional offset index = mticker.IndexLocator(base=1, offset=0.5) assert_array_equal(index.tick_values(0, 4), [0.5, 1.5, 2.5, 3.5]) # Test case with base > 1 index = mticker.IndexLocator(base=2, offset=0) assert_array_equal(index.tick_values(0, 5), [0, 2, 4]) Related Issues Fixes #31086 Checklist Code follows the project's style guidelines Changes are minimal and focused on the specific bug Added regression test to prevent future occurrences Commit message follows conventional format CI tests pass

Open Graph Description: Pull Request: Fix IndexLocator.tick_values returning values greater than vmax Summary This PR fixes a bug in IndexLocator.tick_values() where tick values could exceed the specified vmax parameter. ...

X Description: Pull Request: Fix IndexLocator.tick_values returning values greater than vmax Summary This PR fixes a bug in IndexLocator.tick_values() where tick values could exceed the specified vmax parameter. ...

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

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:3fc3cba4-ff88-cc3c-c383-be86269a280c
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idB78C:B51F5:4B87CE:653D9B:6A5233BC
html-safe-nonce7dbb99c14f3f442cef9099a25dd0f93a35751328f5c1e828190389e012c94db9
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCNzhDOkI1MUY1OjRCODdDRTo2NTNEOUI6NkE1MjMzQkMiLCJ2aXNpdG9yX2lkIjoiODE5MDYwMDIyMTIwNzcwNDUwOCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmac25b91a2c45be5b6ea16f7ead501707c7d744f94cce04257d6fa2d371dd8defb8
hovercard-subject-tagpull_request:3251571412
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/31091/files
twitter:imagehttps://avatars.githubusercontent.com/u/62831255?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/62831255?s=400&v=4
og:image:altPull Request: Fix IndexLocator.tick_values returning values greater than vmax Summary This PR fixes a bug in IndexLocator.tick_values() where tick values could exceed the specified vmax parameter. ...
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
release7aed05249554b889eb33d002851a973eebcc7e91
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/matplotlib/matplotlib/pull/31091/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmatplotlib%2Fmatplotlib%2Fpull%2F31091%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%2F31091%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/31091/files
Reloadhttps://github.com/matplotlib/matplotlib/pull/31091/files
Reloadhttps://github.com/matplotlib/matplotlib/pull/31091/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/31091/files
matplotlib https://github.com/matplotlib
matplotlibhttps://github.com/matplotlib/matplotlib
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/31091/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
timhoffmhttps://github.com/timhoffm
matplotlib:mainhttps://github.com/matplotlib/matplotlib/tree/main
saakshigupta2002:fix-indexlocator-tick-values-vmaxhttps://github.com/saakshigupta2002/matplotlib/tree/fix-indexlocator-tick-values-vmax
Conversation 6 https://github.com/matplotlib/matplotlib/pull/31091
Commits 5 https://github.com/matplotlib/matplotlib/pull/31091/commits
Checks 34 https://github.com/matplotlib/matplotlib/pull/31091/checks
Files changed https://github.com/matplotlib/matplotlib/pull/31091/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/31091/files
BUG: Fix IndexLocator.tick_values returning values greater than vmax https://github.com/matplotlib/matplotlib/pull/31091/files#top
Show all changes 5 commits https://github.com/matplotlib/matplotlib/pull/31091/files
54e673c BUG: Fix IndexLocator.tick_values returning values greater than vmax saakshigupta2002 Feb 5, 2026 https://github.com/matplotlib/matplotlib/pull/31091/commits/54e673c417e172eb9449590bbdce00bd16a81f8a
5adc3f7 Update lib/matplotlib/tests/test_ticker.py saakshigupta2002 Feb 5, 2026 https://github.com/matplotlib/matplotlib/pull/31091/commits/5adc3f7d53e845e340681a959764d588d7fdd910
b11b32c Update lib/matplotlib/ticker.py saakshigupta2002 Feb 5, 2026 https://github.com/matplotlib/matplotlib/pull/31091/commits/b11b32ce901d22e951a9f2d4e17f31188cb344e3
bd6f097 Update lib/matplotlib/tests/test_ticker.py saakshigupta2002 Feb 5, 2026 https://github.com/matplotlib/matplotlib/pull/31091/commits/bd6f09712817ff39992757eccfea4d913e8110fa
f6cdf99 Simplify remaining test assertions per review feedback saakshigupta2002 Feb 5, 2026 https://github.com/matplotlib/matplotlib/pull/31091/commits/f6cdf998e6f435e105a6e65025b18acd41bc2a17
Clear filters https://github.com/matplotlib/matplotlib/pull/31091/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/31091/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/31091/files
test_ticker.py https://github.com/matplotlib/matplotlib/pull/31091/files#diff-fd4f809a4a2ca8b97875eff013bac232c55ca3f92f165117f778960ca1795869
ticker.py https://github.com/matplotlib/matplotlib/pull/31091/files#diff-ffc88dbb928475229d0fc50ae389ef3f0dabc9c5b8abf42b6eb7a0af28afdb66
lib/matplotlib/tests/test_ticker.pyhttps://github.com/matplotlib/matplotlib/pull/31091/files#diff-fd4f809a4a2ca8b97875eff013bac232c55ca3f92f165117f778960ca1795869
View file https://github.com/saakshigupta2002/matplotlib/blob/f6cdf998e6f435e105a6e65025b18acd41bc2a17/lib/matplotlib/tests/test_ticker.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/matplotlib/matplotlib/pull/31091/{{ revealButtonHref }}
https://github.com/matplotlib/matplotlib/pull/31091/files#diff-fd4f809a4a2ca8b97875eff013bac232c55ca3f92f165117f778960ca1795869
https://github.com/matplotlib/matplotlib/pull/31091/files#diff-fd4f809a4a2ca8b97875eff013bac232c55ca3f92f165117f778960ca1795869
lib/matplotlib/ticker.pyhttps://github.com/matplotlib/matplotlib/pull/31091/files#diff-ffc88dbb928475229d0fc50ae389ef3f0dabc9c5b8abf42b6eb7a0af28afdb66
View file https://github.com/saakshigupta2002/matplotlib/blob/f6cdf998e6f435e105a6e65025b18acd41bc2a17/lib/matplotlib/ticker.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/matplotlib/matplotlib/pull/31091/{{ revealButtonHref }}
https://github.com/matplotlib/matplotlib/pull/31091/files#diff-ffc88dbb928475229d0fc50ae389ef3f0dabc9c5b8abf42b6eb7a0af28afdb66
https://github.com/matplotlib/matplotlib/pull/31091/files#diff-ffc88dbb928475229d0fc50ae389ef3f0dabc9c5b8abf42b6eb7a0af28afdb66
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/31091/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.