4

I want to add an icon to a custom button in a matplotlib figure toolbar. How can I do that? So far, I have the following code:

import matplotlib
matplotlib.rcParams["toolbar"] = "toolmanager"
import matplotlib.pyplot as plt
from matplotlib.backend_tools import ToolToggleBase

class NewTool(ToolToggleBase):
    ...[tool code]

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 2, 3], label="legend")
ax.legend()
fig.canvas.manager.toolmanager.add_tool("newtool", NewTool)
fig.canvas.manager.toolbar.add_tool(toolmanager.get_tool("newtool"), "toolgroup")
fig.show()

For now, the only thing that it does is adding a new button (which do what I want) but the icon is only the tool's name i.e.: "newtool". How can I change this for a custom icon like a png image?

2 Answers 2

9

The tool can have an attribute image, which denotes the path to a png image.

import matplotlib
matplotlib.rcParams["toolbar"] = "toolmanager"
import matplotlib.pyplot as plt
from matplotlib.backend_tools import ToolBase

class NewTool(ToolBase):
    image = r"C:\path\to\hiker.png"

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 2, 3], label="legend")
ax.legend()
tm = fig.canvas.manager.toolmanager
tm.add_tool("newtool", NewTool)
fig.canvas.manager.toolbar.add_tool(tm.get_tool("newtool"), "toolgroup")
plt.show()

enter image description here

Sign up to request clarification or add additional context in comments.

4 Comments

I tried this solution, there is also a similar solution on matplotlib docs, but I cannot reproduce it. I get the following error: tm.add_tool("newtool", NewTool) AttributeError: 'NoneType' object has no attribute 'add_tool' Seems weird that plt.figure() does not contain canvas. Any ideas?
I get the same AttributeError in Jupyter but it works fine within a standard IDE (even though I use the same interpreter in both). It looks like it has to do with the choice of backend.
Since this was the first page I stumbled upon in my searches, and I also wanted to know about Matplotlib in Jupyter, here is a Gihub issue where it is discussed: Make the toolbar customizable · Issue #270 · matplotlib/ipympl · GitHub
@bad_locality I believe you get this error if you do not use the rc option matplotlib.rcParams["toolbar"] = "toolmanager"
1

I tried this solution, there is also a similar solution on matplotlib docs, but I >cannot reproduce it. I get the following error: tm.add_tool("newtool", NewTool) >AttributeError: 'NoneType' object has no attribute 'add_tool' Seems weird that >plt.figure() does not contain canvas. Any ideas? – bad_locality Jun 25, 2020 at 12:12

I do not know if it's help, but I had the same issues at first and then i realized that I had not activated the interactive matplotlib option (%matplotlib with Python - spyder). Therefore no toolbar are associated since it only create a static figure.

1 Comment

This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.