Given a set of axes in matplotlib, is there a way to determine its size in pixels? I need to scale things according to adjust for larger or smaller figures.
(In particular I want to change the linewidth so it is proportionate for the axes size.)
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
This gives the width and height in inches.
bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) width, height = bbox.width, bbox.height
That probably suffices for your purpose, but to get pixels, you can multiply by fig.dpi:
width *= fig.dpi height *= fig.dpi
For example,
import matplotlib.pyplot as plt
def get_ax_size(ax):
bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
width, height = bbox.width, bbox.height
width *= fig.dpi
height *= fig.dpi
return width, height
fig, ax = plt.subplots()
print(get_ax_size(ax))
#(496.0, 384.00000000000006)
ax2 = plt.axes([0.3, 0.3, 0.7, 0.7])
print(get_ax_size(ax2))
# (448.0, 336.0)
To make an image of exactly that figure size, you have to remove whitespace between the figure and the axis:
import numpy as np
import matplotlib.pyplot as plt
def get_ax_size(ax):
bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
width, height = bbox.width, bbox.height
width *= fig.dpi
height *= fig.dpi
return width, height
data = np.arange(9).reshape((3, 3))
fig = plt.figure(figsize=(8,6), dpi=80)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(data, aspect='equal')
print(get_ax_size(ax))
# (640.0, 480.0)
plt.savefig('/tmp/test.png', dpi=80)
% identify /tmp/test.png /tmp/test.png PNG 640x480 640x480+0+0 8-bit DirectClass 50.5KB 0.020u 0:00.020
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0