Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

determine matplotlib axis size in pixels

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

like image 407
Jason S Avatar asked Oct 10 '13 21:10

Jason S


People also ask

How do I define the size of a graph in Matplotlib?

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.

What is BBOX in Matplotlib?

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.


1 Answers

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 
like image 53
unutbu Avatar answered Oct 12 '22 16:10

unutbu