如何在matplotlib中以毫米为单位设置轴的尺寸和位置?

如何在matplotlib中以毫米为单位设置轴的尺寸和位置?

问题描述:

我需要一个80毫米宽,60毫米高的标签尺寸为12点的图形。图形尺寸必须紧密裁剪,边框外没有空间。我该怎么做呢?如何在matplotlib中以毫米为单位设置轴的尺寸和位置?

此外,我想要两个轴以10毫米间距堆叠。我怎么做?


点是每英寸72点或72/25.4点/毫米的标准测量值。 边界框是包含图中所有“墨水”的最小框。

标签尺寸很容易,因为它们是用点来定义的。固定与内容大小相关的图形大小是困难的。

这个问题的动机是需要创建多个出版质量图,看起来完全一样。此外,使用胶乳渲染字符的大小和形状可以与主文本完全相同。这也适用于电源点演示。所有归结为每个字体大小的图形大小必须固定到标准单位。

https://en.wikipedia.org/wiki/Point_(typography)

1点(排版)=

SI单位 352.78×10-6米352.778微米

US惯用单位(英制单位)

1.1574×10- 3英尺13.889×10-3 in

你(我)不想那样。最好的方法是以毫米为单位定义以毫米为单位的数字宽度轴宽度并以轴+标签为中心。高度是不相关的,应该修剪空白。

这只是一个开始,居中失踪。下一步是清理代码并使其成为功能(并在菜单中添加“修剪高度”和“修剪宽度”按钮)。

基本上这将是一个两步过程。在第一步中,定义轴的大小,并用标签绘制图形。在步骤2中,调用密箱功能,并以英寸计算图形的宽度。然后该图被重新缩放并确定新的轴位置。

import matplotlib 
import pylab 

matplotlib.rc('text', usetex=True) 
matplotlib.rc('figure', dpi=72) 
font = {'family' : 'normal', 
     'size' : 10} 
matplotlib.rc('font', **font) 
matplotlib.rcParams['text.latex.preamble'] = [ 
     r'\usepackage{lmodern}' # latin modern, recommended to replace computer modern sans serif 
     r'\usepackage{siunitx}', # i need upright \micro symbols, but you need... 
     r'\sisetup{detect-all}', # ...this to force siunitx to actually use your fonts 
     r'\usepackage{helvet}', # set the normal font here 
     r'\usepackage{sansmath}', # load up the sansmath so that math -> helvet 
     r'\sansmath'] # <- tricky! -- gotta actually tell tex to use! 

matplotlib.rcParams['xtick.major.pad'] = 3 # ticklabel spacing between axis and text 
matplotlib.rcParams['ytick.major.pad'] = 2 # 

# APS, PRL, Two Columns 
column_width_mm  = 86.4581 #mm 
column_height_mm = 2.5*column_width_mm 

fig_hspace_mm  = 10 # mm 
fig_wspace_mm  = 10 # mm 

axis_width_mm  = 69.16648 
axis_height_mm  = 43.09763 

column_width_inch = column_width_mm/25.4 
column_height_inch = column_height_mm/25.4 

trim_height_below_mm = 0.0 
trim_height_above_mm = 0.0 

pylab.figure(num = 1, figsize=(column_width_inch, column_height_inch)) 

ax_0 = pylab.axes([fig_wspace_mm/column_width_mm, (1.0*fig_hspace_mm + 0.0*axis_height_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 
ax_1 = pylab.axes([fig_wspace_mm/column_width_mm, (2.0*fig_hspace_mm + 1.0*axis_height_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 
ax_2 = pylab.axes([fig_wspace_mm/column_width_mm, (3.0*fig_hspace_mm + 2.0*axis_height_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 
ax_3 = pylab.axes([fig_wspace_mm/column_width_mm, (4.0*fig_hspace_mm + 3.0*axis_height_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 

ax_0.set_position([fig_wspace_mm/column_width_mm, (1.0*fig_hspace_mm + 0.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 
ax_1.set_position([fig_wspace_mm/column_width_mm, (2.0*fig_hspace_mm + 1.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 
ax_2.set_position([fig_wspace_mm/column_width_mm, (3.0*fig_hspace_mm + 2.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 
ax_3.set_position([fig_wspace_mm/column_width_mm, (4.0*fig_hspace_mm + 3.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 

########################### 
# plot figure here 
########################### 
pylab.sca(ax_0) 
pylab.xlabel(r'$\mathrm{10pt~Test~Label~with~huge~symbols:}~\int~~\mathrm{[\frac{m}{s}]}$') 
########################### 

fig = pylab.gcf() 

old_size  = fig.get_size_inches() 
old_width_mm = old_size[0]*25.4 
old_height_mm = old_size[1]*25.4 

bbox3 = ax_3.get_tightbbox(pylab.gcf().canvas.get_renderer()) 
bbox0 = ax_0.get_tightbbox(pylab.gcf().canvas.get_renderer()) 

trim_height_below_mm = ((bbox0.ymin)/72.0*25.4) 
trim_height_above_mm = old_height_mm - ((bbox3.ymax+4)/72.0*25.4) 

new_size  = fig.get_size_inches() 
new_width_mm = new_size[0]*25.4 
new_height_mm = new_size[1]*25.4 - trim_height_below_mm - trim_height_above_mm 

fig.set_size_inches(new_width_mm/25.4, new_height_mm/25.4, num = 1, forward=True) 

print new_size, old_size, new_width_mm, new_height_mm 
print trim_height_below_mm, trim_height_above_mm 

column_width_mm  = new_width_mm 
column_height_mm = new_height_mm 

ax_0.set_position([fig_wspace_mm/column_width_mm, (1.0*fig_hspace_mm + 0.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 
ax_1.set_position([fig_wspace_mm/column_width_mm, (2.0*fig_hspace_mm + 1.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 
ax_2.set_position([fig_wspace_mm/column_width_mm, (3.0*fig_hspace_mm + 2.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 
ax_3.set_position([fig_wspace_mm/column_width_mm, (4.0*fig_hspace_mm + 3.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm]) 

pylab.show()