Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork8.1k
MEP22: Navigation by events#3652
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
8cceed43118a5ab4d5fcf1e8af47622cb95d1a9de43f89d524f3c10b6065daaf6a2f1905db3b6c08fe56b207a729266447a53419a704c7175056729e6a4e1e8942c47022de6f2c9a195cafe668224f74594c711e67257e7ffa65d66739ee0d18206f34a52c8c2da48344a9b0ea2ed47f0665890411e6e2d484ebd75bf97b6cc040b0ff5997af6734f78513d2377ff547dbbf58dd66b5767a414fe415d8d1213086ba61dec9f2ee2b9da2b13110253fe2804ea9a64b7e64f947fe8cd5d54bbcf4e73a26611b83628e4edd23d4ac2fba7640ef48a69718dafe09a0695d0328b169aac4744f09b9efdef3a529ee7e255eae4e1File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| :mod:`matplotlib.backend_managers` | ||
| =================================== | ||
| ..automodule::matplotlib.backend_managers | ||
| :members: | ||
| :undoc-members: | ||
| :show-inheritance: |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| :mod:`matplotlib.backend_tools` | ||
| ================================ | ||
| ..automodule::matplotlib.backend_tools | ||
| :members: | ||
| :undoc-members: | ||
| :show-inheritance: |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,68 @@ | ||
| ToolManager | ||
| ----------- | ||
| Federico Ariza wrote the new `matplotlib.backend_managers.ToolManager` that comes as replacement for `NavigationToolbar2` | ||
| `ToolManager` offers a new way of looking at the user interactions with the figures. | ||
| Before we had the `NavigationToolbar2` with its own tools like `zoom/pan/home/save/...` and also we had the shortcuts like | ||
| `yscale/grid/quit/....` | ||
| `Toolmanager` relocate all those actions as `Tools` (located in `matplotlib.backend_tools`), and defines a way to `access/trigger/reconfigure` them. | ||
| The `Toolbars` are replaced for `ToolContainers` that are just GUI interfaces to `trigger` the tools. But don't worry the default backends include a `ToolContainer` called `toolbar` | ||
| ..note:: | ||
| For the moment the `ToolManager` is working only with `GTK3` and `Tk` backends. | ||
| Make sure you are using one of those. | ||
| Port for the rest of the backends is comming soon. | ||
| To activate the `ToolManager` include the following at the top of your file: | ||
| >>>matplotlib.rcParams['toolbar']='toolmanager' | ||
| Interact with the ToolContainer | ||
| ``````````````````````````````` | ||
| The most important feature is the ability to easily reconfigure the ToolContainer (aka toolbar). | ||
| For example, if we want to remove the "forward" button we would just do. | ||
| >>>fig.canvas.manager.toolmanager.remove_tool('forward') | ||
| Now if you want to programmatically trigger the "home" button | ||
| >>>fig.canvas.manager.toolmanager.trigger_tool('home') | ||
| New Tools | ||
| ````````` | ||
| It is possible to add new tools to the ToolManager | ||
| A very simple tool that prints "You're awesome" would be:: | ||
| from matplotlib.backend_tools import ToolBase | ||
| class AwesomeTool(ToolBase): | ||
| def trigger(self, *args, **kwargs): | ||
| print("You're awesome") | ||
| To add this tool to `ToolManager` | ||
| >>>fig.canvas.manager.toolmanager.add_tool('Awesome', AwesomeTool) | ||
| If we want to add a shortcut ("d") for the tool | ||
| >>>fig.canvas.manager.toolmanager.update_keymap('Awesome','d') | ||
| To add it to the toolbar inside the group 'foo' | ||
| >>>fig.canvas.manager.toolbar.add_tool('Awesome','foo') | ||
Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. I get a little bit confused here. Why does the user have to interact with the toolmanager? Now that I see these examples, I wonder if the user should ever call methods upon toolmanager. I understand the functional importance of the toolmanager, but from the user's perspective, adding a tool involves interacting with two separate objects that appear (to them) to have very little to do with each other. MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Some tools don't need to have visual representation and others do (button for a toolbar). Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Right... good point. Might make sense in the future to add some convenience methods to make things easier for users, but I agree now that the user-facing distinction is necessary. | ||
| There is a second class of tools, "Toggleable Tools", this are almost the same as our basic tools, just that belong to a group, and are mutually exclusive inside that group. | ||
| For tools derived from `ToolToggleBase` there are two basic methods `enable` and `disable` that are called automatically whenever it is toggled. | ||
| A full example is located in:ref:`user_interfaces-toolmanager` | ||
Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Don't have a section for a "Full Example" if it is just a link to an actual example. Just link it. MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. done | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| '''This example demonstrates how to: | ||
| * Modify the Toolbar | ||
| * Create tools | ||
| * Add tools | ||
| * Remove tools | ||
| Using `matplotlib.backend_managers.ToolManager` | ||
| ''' | ||
| from __future__ import print_function | ||
| import matplotlib | ||
| matplotlib.use('GTK3Cairo') | ||
| matplotlib.rcParams['toolbar'] = 'toolmanager' | ||
| import matplotlib.pyplot as plt | ||
| from matplotlib.backend_tools import ToolBase, ToolToggleBase | ||
| from gi.repository import Gtk, Gdk | ||
| class ListTools(ToolBase): | ||
| '''List all the tools controlled by the `ToolManager`''' | ||
| # keyboard shortcut | ||
| default_keymap = 'm' | ||
| description = 'List Tools' | ||
| def trigger(self, *args, **kwargs): | ||
| print('_' * 80) | ||
| print("{0:12} {1:45} {2}".format('Name (id)', | ||
| 'Tool description', | ||
| 'Keymap')) | ||
| print('-' * 80) | ||
| tools = self.toolmanager.tools | ||
| for name in sorted(tools.keys()): | ||
| if not tools[name].description: | ||
| continue | ||
| keys = ', '.join(sorted(self.toolmanager.get_tool_keymap(name))) | ||
| print("{0:12} {1:45} {2}".format(name, | ||
| tools[name].description, | ||
| keys)) | ||
| print('_' * 80) | ||
| print("Active Toggle tools") | ||
| print("{0:12} {1:45}".format("Group", "Active")) | ||
| print('-' * 80) | ||
| for group, active in self.toolmanager.active_toggle.items(): | ||
| print("{0:12} {1:45}".format(group, active)) | ||
| class GroupHideTool(ToolToggleBase): | ||
| '''Hide lines with a given gid''' | ||
| default_keymap = 'G' | ||
| description = 'Hide by gid' | ||
| def __init__(self, *args, **kwargs): | ||
| self.gid = kwargs.pop('gid') | ||
| ToolToggleBase.__init__(self, *args, **kwargs) | ||
| def enable(self, *args): | ||
| self.set_lines_visibility(False) | ||
| def disable(self, *args): | ||
| self.set_lines_visibility(True) | ||
| def set_lines_visibility(self, state): | ||
| gr_lines = [] | ||
| for ax in self.figure.get_axes(): | ||
| for line in ax.get_lines(): | ||
| if line.get_gid() == self.gid: | ||
| line.set_visible(state) | ||
| self.figure.canvas.draw() | ||
| fig = plt.figure() | ||
| plt.plot([1, 2, 3], gid='mygroup') | ||
| plt.plot([2, 3, 4], gid='unknown') | ||
| plt.plot([3, 2, 1], gid='mygroup') | ||
| # Add the custom tools that we created | ||
| fig.canvas.manager.toolmanager.add_tool('List', ListTools) | ||
| fig.canvas.manager.toolmanager.add_tool('Hide', GroupHideTool, gid='mygroup') | ||
| # Add an existing tool to new group `foo`. | ||
| # It can be added as many times as we want | ||
| fig.canvas.manager.toolbar.add_tool('zoom', 'foo') | ||
| # Remove the forward button | ||
| fig.canvas.manager.toolmanager.remove_tool('forward') | ||
| # To add a custom tool to the toolbar at specific location inside | ||
| # the navigation group | ||
| fig.canvas.manager.toolbar.add_tool('Hide', 'navigation', 1) | ||
| plt.show() |
Uh oh!
There was an error while loading.Please reload this page.