René's URL Explorer Experiment


Title: Enh better colorbar axes by jklymak · Pull Request #20054 · matplotlib/matplotlib · GitHub

Open Graph Title: Enh better colorbar axes by jklymak · Pull Request #20054 · matplotlib/matplotlib

X Title: Enh better colorbar axes by jklymak · Pull Request #20054 · matplotlib/matplotlib

Description: PR Summary Redo of #18900 because GitHub was mad at me. PR is exactly the same... closes #19543 and many other annoyances PR Summary This is a relatively major re-arrangement of how we create colorbars. This will simplify making colorbars for other norms if the norms are created with a scale. It also allows more normal manipulation of the colorbar axes. There are some negative consequences as well. Issue Currently most colorbars are drawn as a pcolormesh on a hidden axes. When extend='both'/'upper'/'lower' it makes the axes longer by a proportion extendlen and draws the extend regions by distorting the upper and/or lower cell of the pcolormesh. This is great, except it means that all the usual tick locators need to have special cases that do not continue drawing the ticks into the region of the axis that has the extend triangles. We do that now with a few piecemeal wrapper classes: _ColorbarAutoLocator(ticker.MaxNLocator), _ColorbarAutoMinorLocator(ticker.AutoMinorLocator), etc. Needless to say that is clunky. The scale used for the colorbar also has to nicely invert past vmin and vmax for the triangles to be drawn properly, despite the fact these regions are only meant for over/under colors that you wouldn't necessarily expect an arbitrary norm to be able to handle. Proposal The proposed solution here is to draw the main pcolor ("solid") on a full axes that goes from vmin to vmax, and draw the extend triangles ("extends") as patches appended to the end of that axes. They are drawn in axes space, so the scale of the axes and the limits of the axes no longer matter. The problem with this approach is that all the sizing and placement of axes is with an axes that is the size of the solid and the extends. i.e. if shrink=1 the whole axes, including the extends, is the height (or width) of the parent axes. The solution proposed here is to draw the solid on an inset_axes that is shrunk from the parent axes if there are extends. Pros: The visible axis labels are all on the "inner" axes and no longer require weird wrappers around the tick Locators. Any scale can be used, and the user can set the scale manually as they like. The initial scale is chosen from the norm, if it has one, or chosen to be linear. the user can change the min and max of the axes if they like. We sometimes get requests for this if the user wants to zoom in on some part of the colormap. I think the code is simpler, but I wrote it so YMMV Cons: manual axes placement is not the main colorbar axes object any more: The biggest con is that for cax = fig.add_axes([0.1, 0.1, 0.8, 0.07]) cb = fig.colorbar(im, cax=cax) the axes object we create is new so that cb.ax is no longer cax. In fact cax == cb.ax.parent_axes. So this breaks cases where the user hoped to do things to cax after it was created. Of course they can access cb.ax. This failed one test where we did cax.tick_params. We can pass these through as we find them (I did already for tick_params). However, this also means that cax.xaxis points to an axis we make invisible now, and won't do anything (again cb.ax.xaxis points to the right thing.) I will argue this breakage is worth it. Doing random things to cax failed much of the time anyway, whereas the new object stored on cb.ax should be much more robust. Unfortunately, however, I cannot think of a reasonable way to deprecate this. Slight change in visibility of lines with extends This is an obscure one, but lines are now partly cut off if they are drawn on the edge of the colorbar and there is an extend. The test that broke this didn't appear to have a reasonable reason to have an extend in that case anyhow (see contour_colorbar.png, and contour_manual_colors_and_levels.png) Other changes: There seemed to have been a bug in colorbar widths with extends before, where they ended up a bit narrower than the colorbars without extends. This can be seen in double_cbar.png and a few other tests. If there is only one extend, the new axes is offset from the center. This means that the label (which is attached to the inner_axes) is now offset as well. We could move it (by placing the label logic all on the parent), but I'm not convinced that it doesn't look better to let it move down and be centred on the spine. (Also double_cbar.png) I ditched the private _internal.classic_mode for the colorbars. It doesn't change that many tests, and it needlessly complicates the Locator code to keep it around. Test: fig, ax = plt.subplots(1, 2, constrained_layout=True) pc = ax[0].pcolormesh(np.arange(100).reshape(10, 10)+1) cb = fig.colorbar(pc, ax=ax[0], extend='both') cb.ax.set_yscale('log') pc = ax[1].pcolormesh(np.arange(100).reshape(10, 10)+1) cb = fig.colorbar(pc, ax=ax[1], extend='both') cb.ax.set_ylim([20, 90]) plt.show() Before After PR Checklist Has pytest style unit tests (and pytest passes). Is Flake 8 compliant (run flake8 on changed files to check). New features are documented, with examples if plot related. Documentation is sphinx and numpydoc compliant (the docs should build without error). Conforms to Matplotlib style conventions (install flake8-docstrings and run flake8 --docstring-convention=all). New features have an entry in doc/users/next_whats_new/ (follow instructions in README.rst there). API changes documented in doc/api/next_api_changes/ (follow instructions in README.rst there).

Open Graph Description: PR Summary Redo of #18900 because GitHub was mad at me. PR is exactly the same... closes #19543 and many other annoyances PR Summary This is a relatively major re-arrangement of how we create colo...

X Description: PR Summary Redo of #18900 because GitHub was mad at me. PR is exactly the same... closes #19543 and many other annoyances PR Summary This is a relatively major re-arrangement of how we create colo...

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

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:a4ff327f-7924-f7b9-1550-dbed675e2458
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-id82AC:1F816D:102416D:1615BA8:6A5224DD
html-safe-nonce2ddb0df3eb90c2357fcfe42aed58161e576aaea31ceb43258a575527a4c418ce
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4MkFDOjFGODE2RDoxMDI0MTZEOjE2MTVCQTg6NkE1MjI0REQiLCJ2aXNpdG9yX2lkIjoiNjgyNTM0MjUyNTY5MzM3MTYxMyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacd71fedd614fc7de61f5470aea9206bc54de56085e3ed1e920783b4fb43e8c38f
hovercard-subject-tagpull_request:622085040
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/20054/files
twitter:imagehttps://avatars.githubusercontent.com/u/1562854?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/1562854?s=400&v=4
og:image:altPR Summary Redo of #18900 because GitHub was mad at me. PR is exactly the same... closes #19543 and many other annoyances PR Summary This is a relatively major re-arrangement of how we create colo...
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/20054/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmatplotlib%2Fmatplotlib%2Fpull%2F20054%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%2F20054%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/20054/files
Reloadhttps://github.com/matplotlib/matplotlib/pull/20054/files
Reloadhttps://github.com/matplotlib/matplotlib/pull/20054/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/20054/files
matplotlib https://github.com/matplotlib
matplotlibhttps://github.com/matplotlib/matplotlib
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/20054/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
greglucashttps://github.com/greglucas
matplotlib:masterhttps://github.com/matplotlib/matplotlib/tree/master
jklymak:enh-better-colorbar-axeshttps://github.com/jklymak/matplotlib/tree/enh-better-colorbar-axes
Conversation 69 https://github.com/matplotlib/matplotlib/pull/20054
Commits 1 https://github.com/matplotlib/matplotlib/pull/20054/commits
Checks 0 https://github.com/matplotlib/matplotlib/pull/20054/checks
Files changed https://github.com/matplotlib/matplotlib/pull/20054/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/20054/files
Enh better colorbar axes https://github.com/matplotlib/matplotlib/pull/20054/files#top
Show all changes 1 commit https://github.com/matplotlib/matplotlib/pull/20054/files
146856b ENH: Make colorbar axes more typical jklymak Nov 5, 2020 https://github.com/matplotlib/matplotlib/pull/20054/commits/146856b03e85aa4b1becdd89fe1628f98fed2a05
Clear filters https://github.com/matplotlib/matplotlib/pull/20054/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/20054/files
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/20054/files
20054-JMK.rst https://github.com/matplotlib/matplotlib/pull/20054/files#diff-269625043b99fedb37b5605c88f78830c18cfbba820cd43a3408997d3445ba6e
colorbar.py https://github.com/matplotlib/matplotlib/pull/20054/files#diff-250555d303944dc7fd3b69fe9a14f292f9b715d738a6a0649d7d62a7c8315b05
figure.py https://github.com/matplotlib/matplotlib/pull/20054/files#diff-01b0c7a8c4445ae46a3c055ace167e99f59dcd54dbf04c84bca2132914d2f8df
contour_colorbar.pdf https://github.com/matplotlib/matplotlib/pull/20054/files#diff-cc4c24838e1dd7e2da699063be7dd5109869e693812fbd8e24e258037a038c8c
contour_colorbar.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-f29da672f22a2f0ad2b88c59da591461e5fbe236876211e94524b8ccc02f182a
contour_colorbar.svg https://github.com/matplotlib/matplotlib/pull/20054/files#diff-37a493ea7ab1331d85b9a4290cc819812d5302e430c572527723df8b0fd50443
colorbar_change_lim_scale.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-49907a41c9fe5648d09894b4c74e09ff94e833e81549fd097e62fd423b8d8ced
colorbar_closed_patch.pdf https://github.com/matplotlib/matplotlib/pull/20054/files#diff-291c0c5c86807044a042888911201bfbc4c17b5cfba56f12e59442cb63bc480b
colorbar_closed_patch.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-8aec4d1a790cb676543509f9788331d79471dd18e05996dc363696068cfb5779
colorbar_closed_patch.svg https://github.com/matplotlib/matplotlib/pull/20054/files#diff-d90237f7f774a3e16ddb660020bda448be9e8363b66fe4d0858cee48d3536721
colorbar_extensions_proportional.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-5cd5daf6b31d915f0a0803c62a07b20195c1fe33648d63f77a7ea472a221bcad
colorbar_extensions_shape_proportional.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-a28e99f2f40b811d41ece86036133a4e5861b95eb109c905f6ac3ec492561aa3
colorbar_extensions_shape_uniform.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-6035810e6873503970a768acc20efacdee1333eb7ce58c436c2ad20a30380aef
colorbar_extensions_uniform.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-57518fb3c55ae83d8f4a0a367a616366215529d01b49192994e6d3993968aa0b
colorbar_single_scatter.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-16066bce9fb5064cd6e63f0a7bf71d5de9dc8cc058f3ed5a66c0cb6604bbbcdf
double_cbar.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-58f493b7f5d335eb062959764bfaac43b18d71037f866916ee06e1f5f84e755e
levels_and_colors.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-f1e8e154965b7c892ada4c80b5a1997202f038df10643c969678cc3f7f578ebd
constrained_layout11.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-7c158b78cee21b94b4d613e77da3e5823674d4af777b62fe8480c623085319cd
constrained_layout11rat.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-8f0f6be3cfe8fd637ada5fa277d8b02de36a8d87e203ec27b2286cfc049aed9b
constrained_layout13.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-193a2bb993d610c09cd5a9a092d53ef1417e31013e2a99ffaeecec2f5f1828ee
constrained_layout14.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-fd2f03a27b9d8a93dcec34505985fc350b8cf25c99d16e47d64b54f4d7c1a151
constrained_layout3.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-0e784d705142a458e8b6f0465ad00fc042131e44b0869385b0d656837aa4fe3d
constrained_layout4.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-49b746a904e95fd9b3e776c892b5f760218c8500015a96f21088114567352622
constrained_layout5.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-6387142b2133d6df0c7b849a53814d52a134ce864b23dd83d2d711e6e2cfc768
constrained_layout8.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-9683602f4d9d1f7d5d4076913538b54445c1bbbf176d9771c3e41d5430e4eace
constrained_layout9.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-1e47ee8637fb33d12645e78bca5c044470a011be7824c8aa33600a5eb78190b0
contour_addlines.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-ef9b564754f269995170674cc485800e53f6902f62ffc34968cefb66267723c0
contour_line_start_on_corner_edge.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-86fe283047dce39248b722077548ecc961cb6cc00cb0fdb6c2ee08f1b9c7e3c1
contour_log_extension.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-4148fc142c6f8d397624fc6a7d6cd78d55f176ff04f11c59fd0c75747f986dc5
contour_manual_colors_and_levels.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-26ec6a3e1df53ad79d095062a06e051fdc848a69e47fa1ded8fc7d6006f4ff6f
mask_image_over_under.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-6bc237db5f6d865cc338388c0b1e814924dacfc317f14122ff2be9d9fe17db12
test_colorbar.py https://github.com/matplotlib/matplotlib/pull/20054/files#diff-4e87144ecd6481ec6a62c5d63a0598eb1a1514fe1df2631acb62e5d5232b6fc7
test_colors.py https://github.com/matplotlib/matplotlib/pull/20054/files#diff-0b4e2edcbe7e1f81d3c7e56ac45d89a3aa1c8481d9204b2c0f497b3261006a87
test_constrainedlayout.py https://github.com/matplotlib/matplotlib/pull/20054/files#diff-c7e8bb9a60399b945f810bbd3179d51e18d6ed2ce99b79ec5497dd9bf479be52
test_contour.py https://github.com/matplotlib/matplotlib/pull/20054/files#diff-56298727b96c2c05776fa59f72ae5f189bb16d046d5452cf8379a1fe55906bdc
axes_grid.py https://github.com/matplotlib/matplotlib/pull/20054/files#diff-ba79d31808d1f55bdf8bf2896366c85122eb9488e140c5a4de060f2c4e1fa8f6
imagegrid_cbar_mode.png https://github.com/matplotlib/matplotlib/pull/20054/files#diff-9d2d63f8f1130d36a1b2cc31e3010a03ab25689d1043b3049816097d419c10e3
test_axes_grid.py https://github.com/matplotlib/matplotlib/pull/20054/files#diff-2582b553eac5c86ab26a189567e9ac22aed5f2decda3befc4da3933d4a48dbbb
doc/api/next_api_changes/behavior/20054-JMK.rsthttps://github.com/matplotlib/matplotlib/pull/20054/files#diff-269625043b99fedb37b5605c88f78830c18cfbba820cd43a3408997d3445ba6e
View file https://github.com/jklymak/matplotlib/blob/146856b03e85aa4b1becdd89fe1628f98fed2a05/doc/api/next_api_changes/behavior/20054-JMK.rst
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/matplotlib/matplotlib/pull/20054/{{ revealButtonHref }}
Please reload this pagehttps://github.com/matplotlib/matplotlib/pull/20054/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.