54

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.)

1
  • can you use a vector based output?
    – tacaswell
    Commented Oct 10, 2013 at 22:27

1 Answer 1

78

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
11
  • Yes, I believe so. I've changed the example to show what happens on an arbitrary subaxis.
    – unutbu
    Commented Oct 10, 2013 at 21:49
  • hmm, it doesn't seem perfectly accurate, but good enough for my purposes!
    – Jason S
    Commented Oct 10, 2013 at 21:49
  • I'm using IPython and I never get accurate figure sizes anyway; when I do plt.figure(figsize=(8,6), dpi=80) I get an image which is smaller than 640x480.
    – Jason S
    Commented Oct 10, 2013 at 21:51
  • 2
    and you should note that get_window_extent is an artist function so it should work on any artist, not just axes
    – tacaswell
    Commented Oct 10, 2013 at 22:28
  • 2
    also the function relies on the fig object being defined.
    – norok2
    Commented Dec 7, 2018 at 23:05

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.