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.)
figsize() takes two parameters- width and height (in inches). By default the values for width and height are 6.4 and 4.8 respectively. Where, x and y are width and height respectively in inches.
BboxTransformTo is a transformation that linearly transforms points from the unit bounding box to a given Bbox. In your case, the transform itself is based upon a TransformedBBox which again has a Bbox upon which it is based and a transform - for this nested instance an Affine2D transform.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With